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: invaders:
fireCooldown: 20 fireCooldown: 20
size: 15 size: 15
speed: 2 speed: 0
distance: 10 # distance in pixels between invaders distance: 10 # distance in pixels between invaders
# Projectiles config # Projectiles config
projectiles: projectiles:
missiles: missiles:
color: yellow
speed: 2 speed: 2
width: 10 width: 10
torpedos: torpedos:
speed: 2 color: green
speed: 10
width: 10 width: 10
points: points:

View File

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

View File

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

View File

@ -23,6 +23,6 @@ typedef nsGraphics::Vec2D position;
typedef unsigned playerID; typedef unsigned playerID;
// didn't want to use position because of the semantic with x and y // 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 #endif

View File

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

View File

@ -128,22 +128,29 @@ void Game::display() {
); );
switch(grid[i][j]){ switch(grid[i][j]){
case 0:{ case 0:{
pm.dessinerInvader1(vec, confData.invadersSize); pm.drawInvader1(vec, confData.invadersSize);
break; break;
} }
case 1:{ case 1:{
pm.dessinerInvader2(vec, confData.invadersSize); pm.drawInvader2(vec, confData.invadersSize);
break; break;
} }
case 2:{ case 2:{
pm.dessinerInvader3(vec, confData.invadersSize); pm.drawInvader3(vec, confData.invadersSize);
break; 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){ 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(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, miss->getX(), miss->getX() + confData.missilesWidth,
tor->getX(), tor->getX() + confData.torpedosWidth)){ tor->getX(), tor->getX() + confData.torpedosWidth)){
missiles.erase(miss); missiles.erase(miss);
@ -123,7 +123,7 @@ bool Game::checkMissilesAndPlayers() {
// now check collision on X (with both players) // now check collision on X (with both players)
bool wasColliding = false; bool wasColliding = false;
for(Player& p : players){ for(Player& p : players){
if(lineCollideCheck( if(areLinesColliding(
miss_ite->getX(), miss_ite->getX() + confData.missilesWidth, miss_ite->getX(), miss_ite->getX() + confData.missilesWidth,
p.x, p.x + confData.playersWidth)){ p.x, p.x + confData.playersWidth)){
wasColliding = true; wasColliding = true;
@ -145,13 +145,14 @@ bool Game::checkTorpedosAndInvaders() {
for(;i<grid.size();++i){ for(;i<grid.size();++i){
// calculate top-left position of invader // calculate top-left position of invader
position pos = basePos+position( position pos = basePos+position(
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)); 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 // 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() && if(pos.getY()+confData.invadersSize>=tor_ite->getY() &&
pos.getY()<=tor_ite->getY()+confData.torpedosLength){ pos.getY()<=tor_ite->getY()+confData.torpedosLength){
// now check collision on X // 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, tor_ite->getX(), tor_ite->getX() + confData.torpedosWidth,
pos.getX(), pos.getX() + confData.invadersSize)){ pos.getX(), pos.getX() + confData.invadersSize)){
break; break;

View File

@ -5,7 +5,7 @@ PixelManager::PixelManager(MinGL& a) : window(a) {
window.initGlut(); window.initGlut();
window.initGraphic(); 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; float scale = size/(float)100;
window << nsShape::Circle(nsGraphics::Vec2D(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGray); 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); 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; float scale = size/(float)100;
window << nsShape::Circle(nsGraphics::Vec2D(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KRed); 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); 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); 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; float scale = size/(float)100;
window << nsShape::Circle(nsGraphics::Vec2D(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGreen); 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); 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); 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-10-10;
width = width/2; 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); 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); 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); nsGui::Sprite sprite(spritePath,baseVector);
sprite.draw(window); sprite.draw(window);
} }

View File

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