The space invaders replica (SIR) is console game project written in C++ programming language. The SIR is targeting and works on Outrageous Circuits RETRO game console developer platform. The game is written in C++ programming language using MBED online IDE and compiler.
Diff: main.cpp
- Revision:
- 0:7dfc10b70a77
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jan 25 09:14:58 2015 +0000 @@ -0,0 +1,274 @@ +#include "mbed.h" + + +/* Display Resultion (128x160) */ +#include "DisplayN18.h" +DisplayN18 disp; +char width = 160, height = 128; + + +/* Graphic Units */ +// Draw Blank Unit (13x10) +void DrawBlankUnit(int Dx,int Dy) +{ + for(int y=-5;y<16;y++) + for(int x=0;x<8;x++) + disp.setPixel(Dy+y,Dx+x,0x0000); +} + +// Enemies Visibility and Coordinates +bool EnemyVisible[3][5]; +/* { + {true,true,true,true,true}, + {true,true,true,true,true}, + {true,true,true,true,true} +}; */ +bool FireBullet = false; // Fire Bullet + +int EnemyCol[3][5] = { + {10,30,50,70,90}, + {10,30,50,70,90}, + {10,30,50,70,90} +}; +int EnemyRow[3][5] = { + {10,10,10,10,10}, + {20,20,20,20,20}, + {30,30,30,30,30} +}; +// Enemy Unit Part 1 +unsigned short Enemy1[8][11] = +{ + {0x0000,0x0000,0x0000,0xffff,0x0000,0x0000,0x0000,0xffff,0x0000,0x0000,0x0000}, + {0xffff,0x0000,0x0000,0xffff,0x0000,0x0000,0x0000,0xffff,0x0000,0x0000,0xffff}, + {0xffff,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000,0xffff}, + {0xffff,0xffff,0xffff,0x0000,0xffff,0xffff,0xffff,0x0000,0xffff,0xffff,0xffff}, + {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}, + {0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000}, + {0x0000,0x0000,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0x0000,0x0000}, + {0x0000,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0x0000}, +}; +// Enemy Unit Part 2 +unsigned short Enemy2[8][11] = +{ + {0x0000,0x0000,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0x0000,0x0000}, + {0x0000,0x0000,0x0000,0xffff,0x0000,0x0000,0x0000,0xffff,0x0000,0x0000,0x0000}, + {0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000,0x0000}, + {0x0000,0xffff,0xffff,0x0000,0xffff,0xffff,0xffff,0x0000,0xffff,0xffff,0x0000}, + {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}, + {0xffff,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000,0xffff}, + {0xffff,0x0000,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0x0000,0xffff}, + {0x0000,0x0000,0x0000,0xffff,0xffff,0x0000,0xffff,0xffff,0x0000,0x0000,0x0000} +}; +// Draw Enemy Unit Part 1 +void DrawEnemyUnitPart1(int Dx,int Dy) +{ + DrawBlankUnit(Dx,Dy); + for(int y=0;y<11;y++) + for(int x=0;x<8;x++) + if(Enemy1[x][y] != 0x0000) + disp.setPixel(Dy+y,Dx+x,Enemy1[x][y]); +} +// Draw Enemy Unit Part 2 +void DrawEnemyUnitPart2(int Dx,int Dy) +{ + DrawBlankUnit(Dx,Dy); + for(int y=0;y<11;y++) + for(int x=0;x<8;x++) + if(Enemy2[x][y] != 0x0000) + disp.setPixel(Dy+y,Dx+x,Enemy2[x][y]); +} +// Draw All Visible Enemies +void DrawEnemies(int y,int x) +{ + // part 1 + if(EnemyVisible[0][0]) DrawEnemyUnitPart1(EnemyRow[0][0]+y,EnemyCol[0][0]+x); + if(EnemyVisible[0][1]) DrawEnemyUnitPart1(EnemyRow[0][1]+y,EnemyCol[0][1]+x); + if(EnemyVisible[0][2]) DrawEnemyUnitPart1(EnemyRow[0][2]+y,EnemyCol[0][2]+x); + if(EnemyVisible[0][3]) DrawEnemyUnitPart1(EnemyRow[0][3]+y,EnemyCol[0][3]+x); + if(EnemyVisible[0][4]) DrawEnemyUnitPart1(EnemyRow[0][4]+y,EnemyCol[0][4]+x); + if(EnemyVisible[1][0]) DrawEnemyUnitPart1(EnemyRow[1][0]+y,EnemyCol[1][0]+x); + if(EnemyVisible[1][1]) DrawEnemyUnitPart1(EnemyRow[1][1]+y,EnemyCol[1][1]+x); + if(EnemyVisible[1][2]) DrawEnemyUnitPart1(EnemyRow[1][2]+y,EnemyCol[1][2]+x); + if(EnemyVisible[1][3]) DrawEnemyUnitPart1(EnemyRow[1][3]+y,EnemyCol[1][3]+x); + if(EnemyVisible[1][4]) DrawEnemyUnitPart1(EnemyRow[1][4]+y,EnemyCol[1][4]+x); + if(EnemyVisible[2][0]) DrawEnemyUnitPart1(EnemyRow[2][0]+y,EnemyCol[2][0]+x); + if(EnemyVisible[2][1]) DrawEnemyUnitPart1(EnemyRow[2][1]+y,EnemyCol[2][1]+x); + if(EnemyVisible[2][2]) DrawEnemyUnitPart1(EnemyRow[2][2]+y,EnemyCol[2][2]+x); + if(EnemyVisible[2][3]) DrawEnemyUnitPart1(EnemyRow[2][3]+y,EnemyCol[2][3]+x); + if(EnemyVisible[2][4]) DrawEnemyUnitPart1(EnemyRow[2][4]+y,EnemyCol[2][4]+x); + // part 2 + if(EnemyVisible[0][0]) DrawEnemyUnitPart2(EnemyRow[0][0]+y,EnemyCol[0][0]+x); + if(EnemyVisible[0][1]) DrawEnemyUnitPart2(EnemyRow[0][1]+y,EnemyCol[0][1]+x); + if(EnemyVisible[0][2]) DrawEnemyUnitPart2(EnemyRow[0][2]+y,EnemyCol[0][2]+x); + if(EnemyVisible[0][3]) DrawEnemyUnitPart2(EnemyRow[0][3]+y,EnemyCol[0][3]+x); + if(EnemyVisible[0][4]) DrawEnemyUnitPart2(EnemyRow[0][4]+y,EnemyCol[0][4]+x); + if(EnemyVisible[1][0]) DrawEnemyUnitPart2(EnemyRow[1][0]+y,EnemyCol[1][0]+x); + if(EnemyVisible[1][1]) DrawEnemyUnitPart2(EnemyRow[1][1]+y,EnemyCol[1][1]+x); + if(EnemyVisible[1][2]) DrawEnemyUnitPart2(EnemyRow[1][2]+y,EnemyCol[1][2]+x); + if(EnemyVisible[1][3]) DrawEnemyUnitPart2(EnemyRow[1][3]+y,EnemyCol[1][3]+x); + if(EnemyVisible[1][4]) DrawEnemyUnitPart2(EnemyRow[1][4]+y,EnemyCol[1][4]+x); + if(EnemyVisible[2][0]) DrawEnemyUnitPart2(EnemyRow[2][0]+y,EnemyCol[2][0]+x); + if(EnemyVisible[2][1]) DrawEnemyUnitPart2(EnemyRow[2][1]+y,EnemyCol[2][1]+x); + if(EnemyVisible[2][2]) DrawEnemyUnitPart2(EnemyRow[2][2]+y,EnemyCol[2][2]+x); + if(EnemyVisible[2][3]) DrawEnemyUnitPart2(EnemyRow[2][3]+y,EnemyCol[2][3]+x); + if(EnemyVisible[2][4]) DrawEnemyUnitPart2(EnemyRow[2][4]+y,EnemyCol[2][4]+x); + // wait(0.01); // timeout +} +// Check Enemy Kill +void EnemyKill(int By,int Bx,int Ey,int Ex) +{ + for(int row=0;row<3;row++) + for(int col=0;col<5;col++) + if( EnemyVisible[row][col] == true and + By >= EnemyRow[row][col]+Ey and By <= EnemyRow[row][col]+Ey+8 and + Bx >= EnemyCol[row][col]+Ex and Bx <= EnemyCol[row][col]+Ex+11 + ) + { + disp.setPixel(Bx,By,0x0000); // hide current bullet + FireBullet = false; // enable next bullet + EnemyVisible[row][col] = false; // disable killed enemy + DrawBlankUnit(EnemyRow[row][col]+Ey,EnemyCol[row][col]+Ex); // hide killed enemy + } +} + +// Player Graphics +unsigned short Player[8][11] = +{ + {0x0000,0x0000,0x0000,0x0000,0x0000,0xffff,0x0000,0x0000,0x0000,0x0000,0x0000}, + {0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000}, + {0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000}, + {0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000}, + {0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000}, + {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}, + {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}, + {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}, + +}; +// Draw Player +void DrawPlayer(int Dx,int Dy) +{ + DrawBlankUnit(Dx,Dy); + for(int y=0;y<11;y++) + for(int x=0;x<8;x++) + if(Player[x][y] != 0x0000) + disp.setPixel(Dy+y,Dx+x,Player[x][y]); +} + +/* Keyboard */ +DigitalIn LeftButton(P0_14, PullUp); +DigitalIn RightButton(P0_11, PullUp); +DigitalIn FireButton(P0_1, PullUp); +// DigitalIn FireButton(P0_16, PullUp); +char LEFT = 0, RIGHT = 1, UP = 2, DOWN = 3; + +/* Dispplay Splash Screen */ +void DisplaySplashScreen() +{ + char* info[5] = + { + "Burgas Game Jam 2015", + "Space Inviders Replica", + "by Dimitar Minchev", + "PhD of Informatics", + "Press Fire to Start ..." + }; + // info + disp.drawString(10, 10, info[0], 0xffff, 0x0000, 1); + disp.drawString(10, 30, info[1], 0xffff, 0x0000, 1); + disp.drawString(10, 50, info[2], 0xffff, 0x0000, 1); + disp.drawString(10, 70, info[3], 0xffff, 0x0000, 1); + disp.drawString(10, 90, info[4], 0xffff, 0x0000, 1); + // wait keypress + while (FireButton) wait_ms(1); + disp.clear(); +} +// YouWin +void DisplayYouWin() +{ + disp.clear(); + disp.drawString(10, 50, "You Win", 0xffff, 0x0000, 2); + while(true) wait_ms(1); // forever until restart +} +// GameOver +void DisplayGameOver() +{ + disp.clear(); + disp.drawString(10, 50, "Game Over", 0xffff, 0x0000, 2); + while(true) wait_ms(1); // forever until restart +} + + +// Main function +main() +{ + // Start + DisplaySplashScreen(); + + // vars + bool MoveRight = true; // Movement Direction + int Ex = 0, Ey = 0; // Enemies Coordinates + int Px = 75, Py = 120; // Player Coordinates + int Bx = 80, By = 120; // Bullet Coordinates + + // Initialize Emeny Visibility + for(int row=0;row<3;row++) for(int col=0;col<5;col++) EnemyVisible[row][col] = true; + + // the loop + while (true) + { + // Buttons + int LeftButtonState = LeftButton.read(); + if( LeftButtonState == 0 ) Px -= 5; + int RightButtonState = RightButton.read(); + if( RightButtonState == 0 ) Px += 5; + int FireButtonState = FireButton.read(); + if(FireButtonState == 0 && FireBullet == false) + { + Bx = Px + 5; + By = Py; + FireBullet = true; + } + + // Draw Enemies + DrawEnemies(Ey,Ex); + + // Draw Player + DrawPlayer(Py,Px); + + // Bullet Movement + if(FireBullet) + { + disp.setPixel(Bx,By,0x0000); + By = By - 5; + disp.setPixel(Bx,By,0xffff); + } + if(By <= 10) // Remove bulet if it is outside + { + disp.setPixel(Bx,By,0x0000); + By = Py; + FireBullet = false; + } + + // Check if bullet hit enemy + if(FireBullet) EnemyKill(By,Bx,Ey,Ex); + + // Enemies Movement + if(Ex>=60 || Ex<=-6) + { + for(int row=10;row<=30;row+=10) + for(int col=10;col<=90;col+=20) + DrawBlankUnit(row+Ey,col+Ex); + Ey += 10; + } + if(Ex>=60) MoveRight = false; + if(Ex<=-6) MoveRight = true; + if(MoveRight) Ex++; + else Ex--; + + // Check Win or Lose + bool win = true; + for(int row=0;row<3;row++) for(int col=0;col<5;col++) if(EnemyVisible[row][col] == true) win = false; + if(win) DisplayYouWin(); + if(Ey >= 120) DisplayGameOver(); + } +}