We can finally pew pew

This commit is contained in:
Thomas 2022-01-01 20:31:57 +01:00
parent a753e7a7b9
commit b123c9a3f3
No known key found for this signature in database
GPG Key ID: E538821A6CDFDAD7
9 changed files with 52 additions and 26 deletions

View File

@ -21,16 +21,18 @@ players:
invaders:
fireCooldown: 20
size: 15
speed: 2
speed: 0
distance: 10 # distance in pixels between invaders
# Projectiles config
projectiles:
missiles:
color: yellow
speed: 2
width: 10
torpedos:
speed: 2
color: green
speed: 10
width: 10
points:

View File

@ -27,9 +27,12 @@ struct ConfigData {
unsigned missilesWidth;
unsigned missilesLength; // auto defined from width
unsigned missilesSpeed;
nsGraphics::RGBAcolor missilesColor;
unsigned torpedosWidth;
unsigned torpedosLength; // auto defined from width
unsigned torpedosSpeed;
nsGraphics::RGBAcolor torpedosColor;
};
#endif

View File

@ -12,11 +12,13 @@ class PixelManager{
public:
MinGL& window;
explicit PixelManager(MinGL&);
void dessinerInvader1(const nsGraphics::Vec2D& baseVector, unsigned size);
void dessinerInvader2(const nsGraphics::Vec2D& baseVector, unsigned size);
void dessinerInvader3(const nsGraphics::Vec2D& baseVector, unsigned size);
void dessinerJoueur(const nsGraphics::Vec2D& baseVector, unsigned size, const nsGraphics::RGBAcolor&);
void dessinerSprite(const nsGraphics::Vec2D& baseVector,const std::string& spritePath);
void drawInvader1(const nsGraphics::Vec2D& baseVector, unsigned size);
void drawInvader2(const nsGraphics::Vec2D& baseVector, unsigned size);
void drawInvader3(const nsGraphics::Vec2D& baseVector, unsigned size);
void drawPlayer(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor &color);
void drawTorpedo(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color);
void drawMissile(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color);
void drawSprite(const nsGraphics::Vec2D& baseVector, const std::string& spritePath);
unsigned showInitialMenu();
unsigned showDeathMenu();
@ -24,6 +26,7 @@ public:
unsigned getScreenWidth();
void startFrame();
void endFrame();
};

View File

@ -23,6 +23,6 @@ typedef nsGraphics::Vec2D position;
typedef unsigned playerID;
// didn't want to use position because of the semantic with x and y
bool lineCollideCheck(unsigned start1, unsigned end1, unsigned start2, unsigned end2);
bool areLinesColliding(unsigned start1, unsigned end1, unsigned start2, unsigned end2);
#endif

View File

@ -102,10 +102,12 @@ void ConfigBuilder::readConfig() {
collectedData.missilesWidth = getInt("projectiles.missiles.width");
collectedData.missilesLength = collectedData.missilesWidth*PROJ_LENGTH_FACTOR;
collectedData.missilesSpeed = getInt("projectiles.missiles.speed");
collectedData.missilesColor = getColor("projectiles.missiles.color");
collectedData.torpedosWidth = getInt("projectiles.torpedos.width");
collectedData.torpedosLength = collectedData.torpedosWidth*PROJ_LENGTH_FACTOR;
collectedData.torpedosSpeed = getInt("projectiles.missiles.speed");
collectedData.torpedosColor = getColor("projectiles.torpedos.color");
}
int ConfigBuilder::getInt(const configKey& key) {

View File

@ -128,22 +128,29 @@ void Game::display() {
);
switch(grid[i][j]){
case 0:{
pm.dessinerInvader1(vec, confData.invadersSize);
pm.drawInvader1(vec, confData.invadersSize);
break;
}
case 1:{
pm.dessinerInvader2(vec, confData.invadersSize);
pm.drawInvader2(vec, confData.invadersSize);
break;
}
case 2:{
pm.dessinerInvader3(vec, confData.invadersSize);
pm.drawInvader3(vec, confData.invadersSize);
break;
}
}
}
}
for(missile& miss : missiles){
pm.drawTorpedo(miss, confData.missilesWidth, confData.missilesColor);
}
for(torpedo& tor : torpedos){
pm.drawTorpedo(tor, confData.torpedosWidth, confData.torpedosColor);
}
for(size_t i=0;i<players.size();++i){
pm.dessinerJoueur(position(players[i].x, 0), confData.playersWidth, confData.playerDefs[i].color);
pm.drawPlayer(position(players[i].x, 0), confData.playersWidth, confData.playerDefs[i].color);
}
}

View File

@ -77,7 +77,7 @@ void Game::remCollidingProjectiles(){
if(miss->getY() + confData.missilesLength < tor->getY()){
}
if(lineCollideCheck( // now check if they collide in X
if(areLinesColliding( // now check if they collide in X
miss->getX(), miss->getX() + confData.missilesWidth,
tor->getX(), tor->getX() + confData.torpedosWidth)){
missiles.erase(miss);
@ -123,7 +123,7 @@ bool Game::checkMissilesAndPlayers() {
// now check collision on X (with both players)
bool wasColliding = false;
for(Player& p : players){
if(lineCollideCheck(
if(areLinesColliding(
miss_ite->getX(), miss_ite->getX() + confData.missilesWidth,
p.x, p.x + confData.playersWidth)){
wasColliding = true;
@ -145,13 +145,14 @@ bool Game::checkTorpedosAndInvaders() {
for(;i<grid.size();++i){
// calculate top-left position of invader
position pos = basePos+position(
confData.invadersSize*(grid[i].size()-1)+confData.invadersDistance*(grid[i].size()-1),
confData.invadersSize*(grid[i].size()-1)+confData.invadersDistance*(grid[i].size()-1));
confData.invadersSize*i+confData.invadersDistance*i,
confData.invadersSize*(grid[i].size()-1)+confData.invadersDistance*(grid[i].size()-1)
);
// check collision on Y (invaders can actually be "under" torpedos, so we check both lower and upper bounds
if(pos.getY()+confData.invadersSize>=tor_ite->getY() &&
pos.getY()<=tor_ite->getY()+confData.torpedosLength){
// now check collision on X
if(lineCollideCheck( // now check collision on X
if(areLinesColliding( // now check collision on X
tor_ite->getX(), tor_ite->getX() + confData.torpedosWidth,
pos.getX(), pos.getX() + confData.invadersSize)){
break;

View File

@ -5,7 +5,7 @@ PixelManager::PixelManager(MinGL& a) : window(a) {
window.initGlut();
window.initGraphic();
}
void PixelManager::dessinerInvader1(const nsGraphics::Vec2D& baseVector, unsigned size){
void PixelManager::drawInvader1(const nsGraphics::Vec2D& baseVector, unsigned size){
float scale = size/(float)100;
window << nsShape::Circle(nsGraphics::Vec2D(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGray);
window << nsShape::Triangle(nsGraphics::Vec2D(35*scale, 50*scale)+baseVector, nsGraphics::Vec2D(15*scale, 25*scale)+baseVector, nsGraphics::Vec2D(15*scale, 75*scale)+baseVector, nsGraphics::KBlack);
@ -16,7 +16,7 @@ void PixelManager::dessinerInvader1(const nsGraphics::Vec2D& baseVector, unsigne
}
void PixelManager::dessinerInvader2(const nsGraphics::Vec2D& baseVector, unsigned size){
void PixelManager::drawInvader2(const nsGraphics::Vec2D& baseVector, unsigned size){
float scale = size/(float)100;
window << nsShape::Circle(nsGraphics::Vec2D(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KRed);
window << nsShape::Rectangle(nsGraphics::Vec2D(25*scale, 30*scale)+baseVector, nsGraphics::Vec2D(45*scale, 40*scale)+baseVector, nsGraphics::KBlack);
@ -24,7 +24,7 @@ void PixelManager::dessinerInvader2(const nsGraphics::Vec2D& baseVector, unsigne
window << nsShape::Rectangle(nsGraphics::Vec2D(35*scale, 65*scale)+baseVector, nsGraphics::Vec2D(65*scale, 72*scale)+baseVector, nsGraphics::KBlack);
}
void PixelManager::dessinerInvader3(const nsGraphics::Vec2D& baseVector, unsigned size){
void PixelManager::drawInvader3(const nsGraphics::Vec2D& baseVector, unsigned size){
float scale = size/(float)100;
window << nsShape::Circle(nsGraphics::Vec2D(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGreen);
window << nsShape::Circle(nsGraphics::Vec2D(35*scale, 35*scale)+baseVector, 10*scale, nsGraphics::KBlack);
@ -32,7 +32,7 @@ void PixelManager::dessinerInvader3(const nsGraphics::Vec2D& baseVector, unsigne
window << nsShape::Rectangle(nsGraphics::Vec2D(35*scale, 65*scale)+baseVector, nsGraphics::Vec2D(65*scale, 72*scale)+baseVector, nsGraphics::KBlack);
}
void PixelManager::dessinerJoueur(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){
void PixelManager::drawPlayer(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){
width = width-10-10;
width = width/2;
window << nsShape::Triangle(nsGraphics::Vec2D(0, 720)+baseVector, nsGraphics::Vec2D(5, 720)+baseVector, nsGraphics::Vec2D(5, 720-PLAYER_HEIGHT/2)+baseVector, color);
@ -44,7 +44,15 @@ void PixelManager::dessinerJoueur(const nsGraphics::Vec2D& baseVector, unsigned
window << nsShape::Triangle(nsGraphics::Vec2D(15+width,720-PLAYER_HEIGHT/2)+baseVector, nsGraphics::Vec2D(15+width*2,720-PLAYER_HEIGHT/2)+baseVector, nsGraphics::Vec2D(15+width,720-PLAYER_HEIGHT*0.9)+baseVector, color);
}
void PixelManager::dessinerSprite(const nsGraphics::Vec2D& baseVector, const std::string& spritePath){
void PixelManager::drawMissile(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){
window << nsShape::Rectangle(baseVector, baseVector+position(width, width*PROJ_LENGTH_FACTOR), color);
}
void PixelManager::drawTorpedo(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){
window << nsShape::Rectangle(baseVector, baseVector+position(width, width*PROJ_LENGTH_FACTOR), color);
}
void PixelManager::drawSprite(const nsGraphics::Vec2D& baseVector, const std::string& spritePath){
nsGui::Sprite sprite(spritePath,baseVector);
sprite.draw(window);
}

View File

@ -1,6 +1,6 @@
#include "utils.h"
bool lineCollideCheck(unsigned start1, unsigned end1, unsigned start2, unsigned end2){
return start1 < end2 != start2 < end1;
// if true, are colliding. I like truth tables
}
bool areLinesColliding(unsigned start1, unsigned end1, unsigned start2, unsigned end2){
return start1 < end2 == start2 < end1;
// if it returns true, lines are colliding. I like truth tables
}