Mbed Galaga Game
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
main.cpp@0:c4b6bb8c2bf4, 2016-03-14 (annotated)
- Committer:
- amostafa9
- Date:
- Mon Mar 14 16:34:47 2016 +0000
- Revision:
- 0:c4b6bb8c2bf4
Galaga
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
amostafa9 | 0:c4b6bb8c2bf4 | 1 | #include "mbed.h" |
amostafa9 | 0:c4b6bb8c2bf4 | 2 | #include "uLCD_4DGL.h" |
amostafa9 | 0:c4b6bb8c2bf4 | 3 | #include "wave_player.h" |
amostafa9 | 0:c4b6bb8c2bf4 | 4 | #include "SDFileSystem.h" |
amostafa9 | 0:c4b6bb8c2bf4 | 5 | //#include "enemies.h" |
amostafa9 | 0:c4b6bb8c2bf4 | 6 | #include <vector> |
amostafa9 | 0:c4b6bb8c2bf4 | 7 | #include "rtos.h" |
amostafa9 | 0:c4b6bb8c2bf4 | 8 | uLCD_4DGL uLCD(p28,p27,p29); |
amostafa9 | 0:c4b6bb8c2bf4 | 9 | AnalogOut DACout(p18); |
amostafa9 | 0:c4b6bb8c2bf4 | 10 | DigitalOut vib(p21); |
amostafa9 | 0:c4b6bb8c2bf4 | 11 | wave_player waver(&DACout); |
amostafa9 | 0:c4b6bb8c2bf4 | 12 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs |
amostafa9 | 0:c4b6bb8c2bf4 | 13 | BusOut mbedleds(LED1,LED2,LED3,LED4); |
amostafa9 | 0:c4b6bb8c2bf4 | 14 | //BusOut/In is faster than multiple DigitalOut/Ins |
amostafa9 | 0:c4b6bb8c2bf4 | 15 | int playLaser = 0;int playEnemyExplode = 0;int playerExplode = 0;//variables to trigger the speaker to play sounds |
amostafa9 | 0:c4b6bb8c2bf4 | 16 | void sdcard_thread(void const *argument)//thread to play the sounds |
amostafa9 | 0:c4b6bb8c2bf4 | 17 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 18 | while(1) { |
amostafa9 | 0:c4b6bb8c2bf4 | 19 | |
amostafa9 | 0:c4b6bb8c2bf4 | 20 | if(playLaser){//play sound if player fires |
amostafa9 | 0:c4b6bb8c2bf4 | 21 | FILE *wave_file; |
amostafa9 | 0:c4b6bb8c2bf4 | 22 | wave_file=fopen("/sd/laser.wav","r"); |
amostafa9 | 0:c4b6bb8c2bf4 | 23 | waver.play(wave_file); |
amostafa9 | 0:c4b6bb8c2bf4 | 24 | fclose(wave_file); |
amostafa9 | 0:c4b6bb8c2bf4 | 25 | playLaser = 0; |
amostafa9 | 0:c4b6bb8c2bf4 | 26 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 27 | if(playerExplode) { //play sound if player dies |
amostafa9 | 0:c4b6bb8c2bf4 | 28 | FILE *wave_file; |
amostafa9 | 0:c4b6bb8c2bf4 | 29 | wave_file=fopen("/sd/Bomb.wav","r"); |
amostafa9 | 0:c4b6bb8c2bf4 | 30 | waver.play(wave_file); |
amostafa9 | 0:c4b6bb8c2bf4 | 31 | fclose(wave_file); |
amostafa9 | 0:c4b6bb8c2bf4 | 32 | playerExplode = 0; |
amostafa9 | 0:c4b6bb8c2bf4 | 33 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 34 | |
amostafa9 | 0:c4b6bb8c2bf4 | 35 | if(playEnemyExplode){//play sound if enemies get hit |
amostafa9 | 0:c4b6bb8c2bf4 | 36 | FILE *wave_file; |
amostafa9 | 0:c4b6bb8c2bf4 | 37 | wave_file=fopen("/sd/Bombnew.wav","r"); |
amostafa9 | 0:c4b6bb8c2bf4 | 38 | waver.play(wave_file); |
amostafa9 | 0:c4b6bb8c2bf4 | 39 | fclose(wave_file); |
amostafa9 | 0:c4b6bb8c2bf4 | 40 | playEnemyExplode = 0; |
amostafa9 | 0:c4b6bb8c2bf4 | 41 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 42 | Thread::wait(50); |
amostafa9 | 0:c4b6bb8c2bf4 | 43 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 44 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 45 | |
amostafa9 | 0:c4b6bb8c2bf4 | 46 | class Nav_Switch |
amostafa9 | 0:c4b6bb8c2bf4 | 47 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 48 | |
amostafa9 | 0:c4b6bb8c2bf4 | 49 | public: |
amostafa9 | 0:c4b6bb8c2bf4 | 50 | |
amostafa9 | 0:c4b6bb8c2bf4 | 51 | Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire); |
amostafa9 | 0:c4b6bb8c2bf4 | 52 | int read(); |
amostafa9 | 0:c4b6bb8c2bf4 | 53 | //boolean functions to test each switch |
amostafa9 | 0:c4b6bb8c2bf4 | 54 | bool up(); |
amostafa9 | 0:c4b6bb8c2bf4 | 55 | bool down(); |
amostafa9 | 0:c4b6bb8c2bf4 | 56 | bool left(); |
amostafa9 | 0:c4b6bb8c2bf4 | 57 | bool right(); |
amostafa9 | 0:c4b6bb8c2bf4 | 58 | bool fire(); |
amostafa9 | 0:c4b6bb8c2bf4 | 59 | //automatic read on RHS |
amostafa9 | 0:c4b6bb8c2bf4 | 60 | operator int (); |
amostafa9 | 0:c4b6bb8c2bf4 | 61 | //index to any switch array style |
amostafa9 | 0:c4b6bb8c2bf4 | 62 | |
amostafa9 | 0:c4b6bb8c2bf4 | 63 | bool operator[](int index) { |
amostafa9 | 0:c4b6bb8c2bf4 | 64 | |
amostafa9 | 0:c4b6bb8c2bf4 | 65 | return _pins[index]; |
amostafa9 | 0:c4b6bb8c2bf4 | 66 | |
amostafa9 | 0:c4b6bb8c2bf4 | 67 | }; |
amostafa9 | 0:c4b6bb8c2bf4 | 68 | |
amostafa9 | 0:c4b6bb8c2bf4 | 69 | private: |
amostafa9 | 0:c4b6bb8c2bf4 | 70 | |
amostafa9 | 0:c4b6bb8c2bf4 | 71 | BusIn _pins; |
amostafa9 | 0:c4b6bb8c2bf4 | 72 | |
amostafa9 | 0:c4b6bb8c2bf4 | 73 | |
amostafa9 | 0:c4b6bb8c2bf4 | 74 | |
amostafa9 | 0:c4b6bb8c2bf4 | 75 | }; |
amostafa9 | 0:c4b6bb8c2bf4 | 76 | |
amostafa9 | 0:c4b6bb8c2bf4 | 77 | Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire): |
amostafa9 | 0:c4b6bb8c2bf4 | 78 | |
amostafa9 | 0:c4b6bb8c2bf4 | 79 | _pins(up, down, left, right, fire) |
amostafa9 | 0:c4b6bb8c2bf4 | 80 | |
amostafa9 | 0:c4b6bb8c2bf4 | 81 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 82 | |
amostafa9 | 0:c4b6bb8c2bf4 | 83 | _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise |
amostafa9 | 0:c4b6bb8c2bf4 | 84 | |
amostafa9 | 0:c4b6bb8c2bf4 | 85 | wait(0.001); //delays just a bit for pullups to pull inputs high |
amostafa9 | 0:c4b6bb8c2bf4 | 86 | |
amostafa9 | 0:c4b6bb8c2bf4 | 87 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 88 | |
amostafa9 | 0:c4b6bb8c2bf4 | 89 | inline bool Nav_Switch::up() |
amostafa9 | 0:c4b6bb8c2bf4 | 90 | |
amostafa9 | 0:c4b6bb8c2bf4 | 91 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 92 | |
amostafa9 | 0:c4b6bb8c2bf4 | 93 | return !(_pins[0]); |
amostafa9 | 0:c4b6bb8c2bf4 | 94 | |
amostafa9 | 0:c4b6bb8c2bf4 | 95 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 96 | |
amostafa9 | 0:c4b6bb8c2bf4 | 97 | inline bool Nav_Switch::down() |
amostafa9 | 0:c4b6bb8c2bf4 | 98 | |
amostafa9 | 0:c4b6bb8c2bf4 | 99 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 100 | |
amostafa9 | 0:c4b6bb8c2bf4 | 101 | return !(_pins[1]); |
amostafa9 | 0:c4b6bb8c2bf4 | 102 | |
amostafa9 | 0:c4b6bb8c2bf4 | 103 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 104 | |
amostafa9 | 0:c4b6bb8c2bf4 | 105 | inline bool Nav_Switch::left() |
amostafa9 | 0:c4b6bb8c2bf4 | 106 | |
amostafa9 | 0:c4b6bb8c2bf4 | 107 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 108 | |
amostafa9 | 0:c4b6bb8c2bf4 | 109 | return !(_pins[2]); |
amostafa9 | 0:c4b6bb8c2bf4 | 110 | |
amostafa9 | 0:c4b6bb8c2bf4 | 111 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 112 | |
amostafa9 | 0:c4b6bb8c2bf4 | 113 | inline bool Nav_Switch::right() |
amostafa9 | 0:c4b6bb8c2bf4 | 114 | |
amostafa9 | 0:c4b6bb8c2bf4 | 115 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 116 | |
amostafa9 | 0:c4b6bb8c2bf4 | 117 | return !(_pins[3]); |
amostafa9 | 0:c4b6bb8c2bf4 | 118 | |
amostafa9 | 0:c4b6bb8c2bf4 | 119 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 120 | |
amostafa9 | 0:c4b6bb8c2bf4 | 121 | inline bool Nav_Switch::fire() |
amostafa9 | 0:c4b6bb8c2bf4 | 122 | |
amostafa9 | 0:c4b6bb8c2bf4 | 123 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 124 | |
amostafa9 | 0:c4b6bb8c2bf4 | 125 | return !(_pins[4]); |
amostafa9 | 0:c4b6bb8c2bf4 | 126 | |
amostafa9 | 0:c4b6bb8c2bf4 | 127 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 128 | |
amostafa9 | 0:c4b6bb8c2bf4 | 129 | inline int Nav_Switch::read() |
amostafa9 | 0:c4b6bb8c2bf4 | 130 | |
amostafa9 | 0:c4b6bb8c2bf4 | 131 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 132 | |
amostafa9 | 0:c4b6bb8c2bf4 | 133 | return _pins.read(); |
amostafa9 | 0:c4b6bb8c2bf4 | 134 | |
amostafa9 | 0:c4b6bb8c2bf4 | 135 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 136 | |
amostafa9 | 0:c4b6bb8c2bf4 | 137 | inline Nav_Switch::operator int () |
amostafa9 | 0:c4b6bb8c2bf4 | 138 | |
amostafa9 | 0:c4b6bb8c2bf4 | 139 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 140 | |
amostafa9 | 0:c4b6bb8c2bf4 | 141 | return _pins.read(); |
amostafa9 | 0:c4b6bb8c2bf4 | 142 | |
amostafa9 | 0:c4b6bb8c2bf4 | 143 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 144 | |
amostafa9 | 0:c4b6bb8c2bf4 | 145 | // Declar player dimensions |
amostafa9 | 0:c4b6bb8c2bf4 | 146 | |
amostafa9 | 0:c4b6bb8c2bf4 | 147 | int playerWidth = 7; |
amostafa9 | 0:c4b6bb8c2bf4 | 148 | |
amostafa9 | 0:c4b6bb8c2bf4 | 149 | int playerHeight = 3; |
amostafa9 | 0:c4b6bb8c2bf4 | 150 | |
amostafa9 | 0:c4b6bb8c2bf4 | 151 | int playerDelta = 3; |
amostafa9 | 0:c4b6bb8c2bf4 | 152 | |
amostafa9 | 0:c4b6bb8c2bf4 | 153 | int playerXpos = 64; |
amostafa9 | 0:c4b6bb8c2bf4 | 154 | |
amostafa9 | 0:c4b6bb8c2bf4 | 155 | int playerYpos = 113; |
amostafa9 | 0:c4b6bb8c2bf4 | 156 | |
amostafa9 | 0:c4b6bb8c2bf4 | 157 | #define maxNumPlayerMissiles 5 |
amostafa9 | 0:c4b6bb8c2bf4 | 158 | |
amostafa9 | 0:c4b6bb8c2bf4 | 159 | #define numEnemies 10 |
amostafa9 | 0:c4b6bb8c2bf4 | 160 | |
amostafa9 | 0:c4b6bb8c2bf4 | 161 | //struct for missiles |
amostafa9 | 0:c4b6bb8c2bf4 | 162 | |
amostafa9 | 0:c4b6bb8c2bf4 | 163 | typedef struct { |
amostafa9 | 0:c4b6bb8c2bf4 | 164 | |
amostafa9 | 0:c4b6bb8c2bf4 | 165 | int x; ///< The x-coordinate of missile current position |
amostafa9 | 0:c4b6bb8c2bf4 | 166 | |
amostafa9 | 0:c4b6bb8c2bf4 | 167 | int y; ///< The y-coordinate of missile current position |
amostafa9 | 0:c4b6bb8c2bf4 | 168 | |
amostafa9 | 0:c4b6bb8c2bf4 | 169 | int status; ///< The missile status, see MISSILE_STATUS |
amostafa9 | 0:c4b6bb8c2bf4 | 170 | |
amostafa9 | 0:c4b6bb8c2bf4 | 171 | } playerMissile; // infomration about missile position and status |
amostafa9 | 0:c4b6bb8c2bf4 | 172 | |
amostafa9 | 0:c4b6bb8c2bf4 | 173 | //struct for enemies |
amostafa9 | 0:c4b6bb8c2bf4 | 174 | |
amostafa9 | 0:c4b6bb8c2bf4 | 175 | typedef struct { |
amostafa9 | 0:c4b6bb8c2bf4 | 176 | |
amostafa9 | 0:c4b6bb8c2bf4 | 177 | int x; |
amostafa9 | 0:c4b6bb8c2bf4 | 178 | |
amostafa9 | 0:c4b6bb8c2bf4 | 179 | int y; |
amostafa9 | 0:c4b6bb8c2bf4 | 180 | |
amostafa9 | 0:c4b6bb8c2bf4 | 181 | int size; |
amostafa9 | 0:c4b6bb8c2bf4 | 182 | |
amostafa9 | 0:c4b6bb8c2bf4 | 183 | int status; |
amostafa9 | 0:c4b6bb8c2bf4 | 184 | |
amostafa9 | 0:c4b6bb8c2bf4 | 185 | } enemy; |
amostafa9 | 0:c4b6bb8c2bf4 | 186 | |
amostafa9 | 0:c4b6bb8c2bf4 | 187 | enemy enemies[numEnemies];//create a struct array of enemies |
amostafa9 | 0:c4b6bb8c2bf4 | 188 | |
amostafa9 | 0:c4b6bb8c2bf4 | 189 | // initialize the player's position, missile status, draw player, |
amostafa9 | 0:c4b6bb8c2bf4 | 190 | |
amostafa9 | 0:c4b6bb8c2bf4 | 191 | void player_draw(int x, int y, int playerColor) { |
amostafa9 | 0:c4b6bb8c2bf4 | 192 | |
amostafa9 | 0:c4b6bb8c2bf4 | 193 | uLCD.filled_rectangle(x, y, x+playerWidth, y+playerHeight, playerColor); |
amostafa9 | 0:c4b6bb8c2bf4 | 194 | |
amostafa9 | 0:c4b6bb8c2bf4 | 195 | uLCD.filled_rectangle(x+playerDelta, y-playerDelta, x+playerWidth-playerDelta, y+playerHeight, playerColor); |
amostafa9 | 0:c4b6bb8c2bf4 | 196 | |
amostafa9 | 0:c4b6bb8c2bf4 | 197 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 198 | |
amostafa9 | 0:c4b6bb8c2bf4 | 199 | playerMissile playerMissiles[maxNumPlayerMissiles]; //struct array of player missiles |
amostafa9 | 0:c4b6bb8c2bf4 | 200 | |
amostafa9 | 0:c4b6bb8c2bf4 | 201 | //function to fire a missile |
amostafa9 | 0:c4b6bb8c2bf4 | 202 | |
amostafa9 | 0:c4b6bb8c2bf4 | 203 | void player_fire(void){ |
amostafa9 | 0:c4b6bb8c2bf4 | 204 | |
amostafa9 | 0:c4b6bb8c2bf4 | 205 | playerMissile PM; |
amostafa9 | 0:c4b6bb8c2bf4 | 206 | |
amostafa9 | 0:c4b6bb8c2bf4 | 207 | PM.x = playerXpos + (playerWidth/2); |
amostafa9 | 0:c4b6bb8c2bf4 | 208 | |
amostafa9 | 0:c4b6bb8c2bf4 | 209 | PM.y = playerYpos-playerDelta; |
amostafa9 | 0:c4b6bb8c2bf4 | 210 | |
amostafa9 | 0:c4b6bb8c2bf4 | 211 | PM.status = 1; |
amostafa9 | 0:c4b6bb8c2bf4 | 212 | |
amostafa9 | 0:c4b6bb8c2bf4 | 213 | for(int i=0;i<maxNumPlayerMissiles;i++){ |
amostafa9 | 0:c4b6bb8c2bf4 | 214 | |
amostafa9 | 0:c4b6bb8c2bf4 | 215 | if(playerMissiles[i].status==0){ |
amostafa9 | 0:c4b6bb8c2bf4 | 216 | |
amostafa9 | 0:c4b6bb8c2bf4 | 217 | playerMissiles[i]=PM; |
amostafa9 | 0:c4b6bb8c2bf4 | 218 | |
amostafa9 | 0:c4b6bb8c2bf4 | 219 | break; |
amostafa9 | 0:c4b6bb8c2bf4 | 220 | |
amostafa9 | 0:c4b6bb8c2bf4 | 221 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 222 | |
amostafa9 | 0:c4b6bb8c2bf4 | 223 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 224 | |
amostafa9 | 0:c4b6bb8c2bf4 | 225 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 226 | |
amostafa9 | 0:c4b6bb8c2bf4 | 227 | //function to update all parts of the game |
amostafa9 | 0:c4b6bb8c2bf4 | 228 | |
amostafa9 | 0:c4b6bb8c2bf4 | 229 | void updateGame(){ |
amostafa9 | 0:c4b6bb8c2bf4 | 230 | |
amostafa9 | 0:c4b6bb8c2bf4 | 231 | for(int i=0;i<maxNumPlayerMissiles;i++){ |
amostafa9 | 0:c4b6bb8c2bf4 | 232 | |
amostafa9 | 0:c4b6bb8c2bf4 | 233 | // update all missiles |
amostafa9 | 0:c4b6bb8c2bf4 | 234 | |
amostafa9 | 0:c4b6bb8c2bf4 | 235 | if(playerMissiles[i].status == 1){ |
amostafa9 | 0:c4b6bb8c2bf4 | 236 | |
amostafa9 | 0:c4b6bb8c2bf4 | 237 | uLCD.circle(playerMissiles[i].x,playerMissiles[i].y,1,0x0); |
amostafa9 | 0:c4b6bb8c2bf4 | 238 | |
amostafa9 | 0:c4b6bb8c2bf4 | 239 | playerMissiles[i].y-=5; |
amostafa9 | 0:c4b6bb8c2bf4 | 240 | |
amostafa9 | 0:c4b6bb8c2bf4 | 241 | uLCD.circle(playerMissiles[i].x,playerMissiles[i].y,1,0xFF0000); |
amostafa9 | 0:c4b6bb8c2bf4 | 242 | |
amostafa9 | 0:c4b6bb8c2bf4 | 243 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 244 | |
amostafa9 | 0:c4b6bb8c2bf4 | 245 | if(playerMissiles[i].y==0 || playerMissiles[i].status==0){ |
amostafa9 | 0:c4b6bb8c2bf4 | 246 | |
amostafa9 | 0:c4b6bb8c2bf4 | 247 | uLCD.circle(playerMissiles[i].x,playerMissiles[i].y,1,0x0); |
amostafa9 | 0:c4b6bb8c2bf4 | 248 | |
amostafa9 | 0:c4b6bb8c2bf4 | 249 | playerMissiles[i].status = 0; |
amostafa9 | 0:c4b6bb8c2bf4 | 250 | |
amostafa9 | 0:c4b6bb8c2bf4 | 251 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 252 | |
amostafa9 | 0:c4b6bb8c2bf4 | 253 | //update all enemies |
amostafa9 | 0:c4b6bb8c2bf4 | 254 | |
amostafa9 | 0:c4b6bb8c2bf4 | 255 | for(int j=0;j<numEnemies;j++){ |
amostafa9 | 0:c4b6bb8c2bf4 | 256 | |
amostafa9 | 0:c4b6bb8c2bf4 | 257 | if(playerMissiles[i].status==1 && enemies[j].status==1 && playerMissiles[i].x>enemies[j].x && playerMissiles[i].x<enemies[j].x+enemies[j].size && playerMissiles[i].y>enemies[j].y && playerMissiles[i].y<enemies[j].y+enemies[j].size){ |
amostafa9 | 0:c4b6bb8c2bf4 | 258 | |
amostafa9 | 0:c4b6bb8c2bf4 | 259 | enemies[j].status = 0; |
amostafa9 | 0:c4b6bb8c2bf4 | 260 | |
amostafa9 | 0:c4b6bb8c2bf4 | 261 | playerMissiles[i].status = 0; |
amostafa9 | 0:c4b6bb8c2bf4 | 262 | |
amostafa9 | 0:c4b6bb8c2bf4 | 263 | playEnemyExplode=1; |
amostafa9 | 0:c4b6bb8c2bf4 | 264 | |
amostafa9 | 0:c4b6bb8c2bf4 | 265 | uLCD.filled_rectangle(enemies[j].x,enemies[j].y,enemies[j].x+enemies[j].size,enemies[j].y+enemies[j].size,0x0); |
amostafa9 | 0:c4b6bb8c2bf4 | 266 | |
amostafa9 | 0:c4b6bb8c2bf4 | 267 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 268 | |
amostafa9 | 0:c4b6bb8c2bf4 | 269 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 270 | |
amostafa9 | 0:c4b6bb8c2bf4 | 271 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 272 | |
amostafa9 | 0:c4b6bb8c2bf4 | 273 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 274 | |
amostafa9 | 0:c4b6bb8c2bf4 | 275 | //function to set initial position of enemies |
amostafa9 | 0:c4b6bb8c2bf4 | 276 | |
amostafa9 | 0:c4b6bb8c2bf4 | 277 | void enemies_init(void){ |
amostafa9 | 0:c4b6bb8c2bf4 | 278 | |
amostafa9 | 0:c4b6bb8c2bf4 | 279 | enemies[0].x = 1;enemies[0].y = 1;enemies[0].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 280 | |
amostafa9 | 0:c4b6bb8c2bf4 | 281 | enemies[1].x = 26;enemies[1].y = 1;enemies[1].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 282 | |
amostafa9 | 0:c4b6bb8c2bf4 | 283 | enemies[2].x = 51;enemies[2].y = 1;enemies[2].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 284 | |
amostafa9 | 0:c4b6bb8c2bf4 | 285 | enemies[3].x = 76;enemies[3].y = 1;enemies[3].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 286 | |
amostafa9 | 0:c4b6bb8c2bf4 | 287 | enemies[4].x = 101;enemies[4].y = 1;enemies[4].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 288 | |
amostafa9 | 0:c4b6bb8c2bf4 | 289 | enemies[5].x = 1;enemies[5].y = 20;enemies[5].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 290 | |
amostafa9 | 0:c4b6bb8c2bf4 | 291 | enemies[6].x = 26;enemies[6].y = 20;enemies[6].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 292 | |
amostafa9 | 0:c4b6bb8c2bf4 | 293 | enemies[7].x = 51;enemies[7].y = 20;enemies[7].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 294 | |
amostafa9 | 0:c4b6bb8c2bf4 | 295 | enemies[8].x = 76;enemies[8].y = 20;enemies[8].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 296 | |
amostafa9 | 0:c4b6bb8c2bf4 | 297 | enemies[9].x = 101;enemies[9].y = 20;enemies[9].size = 8; |
amostafa9 | 0:c4b6bb8c2bf4 | 298 | |
amostafa9 | 0:c4b6bb8c2bf4 | 299 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 300 | |
amostafa9 | 0:c4b6bb8c2bf4 | 301 | Nav_Switch myNav( p15, p12, p13, p11, p14); //pin order on Sparkfun breakout |
amostafa9 | 0:c4b6bb8c2bf4 | 302 | |
amostafa9 | 0:c4b6bb8c2bf4 | 303 | |
amostafa9 | 0:c4b6bb8c2bf4 | 304 | |
amostafa9 | 0:c4b6bb8c2bf4 | 305 | int main() |
amostafa9 | 0:c4b6bb8c2bf4 | 306 | |
amostafa9 | 0:c4b6bb8c2bf4 | 307 | { |
amostafa9 | 0:c4b6bb8c2bf4 | 308 | |
amostafa9 | 0:c4b6bb8c2bf4 | 309 | Thread thread1(sdcard_thread); |
amostafa9 | 0:c4b6bb8c2bf4 | 310 | |
amostafa9 | 0:c4b6bb8c2bf4 | 311 | int ctr = 0;int distance=5;int vertical = 1;int win = 1;int numDeadEnemies=0; |
amostafa9 | 0:c4b6bb8c2bf4 | 312 | |
amostafa9 | 0:c4b6bb8c2bf4 | 313 | //initialize enemy statuses |
amostafa9 | 0:c4b6bb8c2bf4 | 314 | |
amostafa9 | 0:c4b6bb8c2bf4 | 315 | enemies[0].status = 1;enemies[1].status = 1;enemies[2].status = 1;enemies[3].status = 1;enemies[4].status = 1; |
amostafa9 | 0:c4b6bb8c2bf4 | 316 | |
amostafa9 | 0:c4b6bb8c2bf4 | 317 | enemies[5].status = 1;enemies[6].status = 1;enemies[7].status = 1;enemies[8].status = 1;enemies[9].status = 1; |
amostafa9 | 0:c4b6bb8c2bf4 | 318 | |
amostafa9 | 0:c4b6bb8c2bf4 | 319 | enemies_init(); |
amostafa9 | 0:c4b6bb8c2bf4 | 320 | |
amostafa9 | 0:c4b6bb8c2bf4 | 321 | //draw enemies |
amostafa9 | 0:c4b6bb8c2bf4 | 322 | |
amostafa9 | 0:c4b6bb8c2bf4 | 323 | for(int i=0;i<numEnemies;i++){ |
amostafa9 | 0:c4b6bb8c2bf4 | 324 | |
amostafa9 | 0:c4b6bb8c2bf4 | 325 | uLCD.filled_rectangle(enemies[i].x,enemies[i].y,enemies[i].x+enemies[i].size,enemies[i].y+enemies[i].size,0x00FF00); |
amostafa9 | 0:c4b6bb8c2bf4 | 326 | |
amostafa9 | 0:c4b6bb8c2bf4 | 327 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 328 | |
amostafa9 | 0:c4b6bb8c2bf4 | 329 | int i; |
amostafa9 | 0:c4b6bb8c2bf4 | 330 | |
amostafa9 | 0:c4b6bb8c2bf4 | 331 | while(1) { |
amostafa9 | 0:c4b6bb8c2bf4 | 332 | |
amostafa9 | 0:c4b6bb8c2bf4 | 333 | //with pullups a button hit is a "0" - "~" inverts data to leds |
amostafa9 | 0:c4b6bb8c2bf4 | 334 | |
amostafa9 | 0:c4b6bb8c2bf4 | 335 | if(ctr%10==0){ |
amostafa9 | 0:c4b6bb8c2bf4 | 336 | |
amostafa9 | 0:c4b6bb8c2bf4 | 337 | for(i=0;i<numEnemies;i++){ |
amostafa9 | 0:c4b6bb8c2bf4 | 338 | |
amostafa9 | 0:c4b6bb8c2bf4 | 339 | if(enemies[i].status!=0){ |
amostafa9 | 0:c4b6bb8c2bf4 | 340 | |
amostafa9 | 0:c4b6bb8c2bf4 | 341 | //update enemy positions |
amostafa9 | 0:c4b6bb8c2bf4 | 342 | |
amostafa9 | 0:c4b6bb8c2bf4 | 343 | uLCD.filled_rectangle(enemies[i].x,enemies[i].y,enemies[i].x+enemies[i].size,enemies[i].y+enemies[i].size,0x0); |
amostafa9 | 0:c4b6bb8c2bf4 | 344 | |
amostafa9 | 0:c4b6bb8c2bf4 | 345 | if(vertical<0){enemies[i].x+=distance;}else{enemies[i].y+=5;} |
amostafa9 | 0:c4b6bb8c2bf4 | 346 | |
amostafa9 | 0:c4b6bb8c2bf4 | 347 | uLCD.filled_rectangle(enemies[i].x,enemies[i].y,enemies[i].x+enemies[i].size,enemies[i].y+enemies[i].size,0x00FF00); |
amostafa9 | 0:c4b6bb8c2bf4 | 348 | |
amostafa9 | 0:c4b6bb8c2bf4 | 349 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 350 | |
amostafa9 | 0:c4b6bb8c2bf4 | 351 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 352 | |
amostafa9 | 0:c4b6bb8c2bf4 | 353 | if(vertical<0){distance*=-1;}vertical*=-1; |
amostafa9 | 0:c4b6bb8c2bf4 | 354 | |
amostafa9 | 0:c4b6bb8c2bf4 | 355 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 356 | |
amostafa9 | 0:c4b6bb8c2bf4 | 357 | mbedleds = ~(myNav & 0x0F); //update leds with nav switch direction inputs |
amostafa9 | 0:c4b6bb8c2bf4 | 358 | |
amostafa9 | 0:c4b6bb8c2bf4 | 359 | if(myNav.fire()){//fire missile |
amostafa9 | 0:c4b6bb8c2bf4 | 360 | |
amostafa9 | 0:c4b6bb8c2bf4 | 361 | vib = 1; |
amostafa9 | 0:c4b6bb8c2bf4 | 362 | |
amostafa9 | 0:c4b6bb8c2bf4 | 363 | Thread::wait(100); |
amostafa9 | 0:c4b6bb8c2bf4 | 364 | |
amostafa9 | 0:c4b6bb8c2bf4 | 365 | vib=0; |
amostafa9 | 0:c4b6bb8c2bf4 | 366 | |
amostafa9 | 0:c4b6bb8c2bf4 | 367 | playLaser = 1; |
amostafa9 | 0:c4b6bb8c2bf4 | 368 | |
amostafa9 | 0:c4b6bb8c2bf4 | 369 | player_fire(); |
amostafa9 | 0:c4b6bb8c2bf4 | 370 | |
amostafa9 | 0:c4b6bb8c2bf4 | 371 | mbedleds = 0x0F; //special all leds on case for fire (center button) |
amostafa9 | 0:c4b6bb8c2bf4 | 372 | |
amostafa9 | 0:c4b6bb8c2bf4 | 373 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 374 | |
amostafa9 | 0:c4b6bb8c2bf4 | 375 | //or use - if(myNav[4]==0) mbedleds = 0x0F; //can index a switch bit like this |
amostafa9 | 0:c4b6bb8c2bf4 | 376 | |
amostafa9 | 0:c4b6bb8c2bf4 | 377 | if(myNav.right() && playerXpos <= 110){//player moves right |
amostafa9 | 0:c4b6bb8c2bf4 | 378 | |
amostafa9 | 0:c4b6bb8c2bf4 | 379 | player_draw(playerXpos,playerYpos,0x0); |
amostafa9 | 0:c4b6bb8c2bf4 | 380 | |
amostafa9 | 0:c4b6bb8c2bf4 | 381 | playerXpos+=5; |
amostafa9 | 0:c4b6bb8c2bf4 | 382 | |
amostafa9 | 0:c4b6bb8c2bf4 | 383 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 384 | |
amostafa9 | 0:c4b6bb8c2bf4 | 385 | if(myNav.left() && playerXpos >= 0){//player moves left |
amostafa9 | 0:c4b6bb8c2bf4 | 386 | |
amostafa9 | 0:c4b6bb8c2bf4 | 387 | player_draw(playerXpos,playerYpos,0x0); |
amostafa9 | 0:c4b6bb8c2bf4 | 388 | |
amostafa9 | 0:c4b6bb8c2bf4 | 389 | playerXpos-=5; |
amostafa9 | 0:c4b6bb8c2bf4 | 390 | |
amostafa9 | 0:c4b6bb8c2bf4 | 391 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 392 | |
amostafa9 | 0:c4b6bb8c2bf4 | 393 | player_draw(playerXpos,playerYpos,0xFFFF00);//draw the player |
amostafa9 | 0:c4b6bb8c2bf4 | 394 | |
amostafa9 | 0:c4b6bb8c2bf4 | 395 | updateGame(); |
amostafa9 | 0:c4b6bb8c2bf4 | 396 | |
amostafa9 | 0:c4b6bb8c2bf4 | 397 | //check if player has been hit |
amostafa9 | 0:c4b6bb8c2bf4 | 398 | |
amostafa9 | 0:c4b6bb8c2bf4 | 399 | for(i=0;i<numEnemies;i++){ |
amostafa9 | 0:c4b6bb8c2bf4 | 400 | |
amostafa9 | 0:c4b6bb8c2bf4 | 401 | if(enemies[i].status==1 && playerXpos>enemies[i].x && playerXpos<enemies[i].x+enemies[i].size && playerYpos>enemies[i].y && playerYpos<enemies[i].y+enemies[i].size){ |
amostafa9 | 0:c4b6bb8c2bf4 | 402 | |
amostafa9 | 0:c4b6bb8c2bf4 | 403 | player_draw(playerXpos,playerYpos,0x0);win=0;playerExplode=1;vib=1; |
amostafa9 | 0:c4b6bb8c2bf4 | 404 | |
amostafa9 | 0:c4b6bb8c2bf4 | 405 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 406 | |
amostafa9 | 0:c4b6bb8c2bf4 | 407 | if(enemies[i].status==0)numDeadEnemies++; |
amostafa9 | 0:c4b6bb8c2bf4 | 408 | |
amostafa9 | 0:c4b6bb8c2bf4 | 409 | if(enemies[i].y>128)enemies[i].y=1; |
amostafa9 | 0:c4b6bb8c2bf4 | 410 | |
amostafa9 | 0:c4b6bb8c2bf4 | 411 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 412 | |
amostafa9 | 0:c4b6bb8c2bf4 | 413 | // check for end game conditions |
amostafa9 | 0:c4b6bb8c2bf4 | 414 | |
amostafa9 | 0:c4b6bb8c2bf4 | 415 | if(numDeadEnemies==numEnemies){Thread::wait(1000);break;} |
amostafa9 | 0:c4b6bb8c2bf4 | 416 | |
amostafa9 | 0:c4b6bb8c2bf4 | 417 | if(!win){Thread::wait(1000);vib=0;playerExplode=0;break;} |
amostafa9 | 0:c4b6bb8c2bf4 | 418 | |
amostafa9 | 0:c4b6bb8c2bf4 | 419 | numDeadEnemies = 0; |
amostafa9 | 0:c4b6bb8c2bf4 | 420 | |
amostafa9 | 0:c4b6bb8c2bf4 | 421 | ctr++; |
amostafa9 | 0:c4b6bb8c2bf4 | 422 | |
amostafa9 | 0:c4b6bb8c2bf4 | 423 | Thread::wait(10); |
amostafa9 | 0:c4b6bb8c2bf4 | 424 | |
amostafa9 | 0:c4b6bb8c2bf4 | 425 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 426 | |
amostafa9 | 0:c4b6bb8c2bf4 | 427 | uLCD.locate(5,5); |
amostafa9 | 0:c4b6bb8c2bf4 | 428 | |
amostafa9 | 0:c4b6bb8c2bf4 | 429 | if(win){ |
amostafa9 | 0:c4b6bb8c2bf4 | 430 | |
amostafa9 | 0:c4b6bb8c2bf4 | 431 | uLCD.printf("You Win!!"); |
amostafa9 | 0:c4b6bb8c2bf4 | 432 | |
amostafa9 | 0:c4b6bb8c2bf4 | 433 | }else{ |
amostafa9 | 0:c4b6bb8c2bf4 | 434 | |
amostafa9 | 0:c4b6bb8c2bf4 | 435 | uLCD.printf("GAME OVER"); |
amostafa9 | 0:c4b6bb8c2bf4 | 436 | |
amostafa9 | 0:c4b6bb8c2bf4 | 437 | } |
amostafa9 | 0:c4b6bb8c2bf4 | 438 | |
amostafa9 | 0:c4b6bb8c2bf4 | 439 | } |