University project - accelerometer controlled Arkanoid
Dependencies: KS0108 MMA8451Q mbed
backup3_non_functional_ptrs2struct_2Darray.cpp@0:9515d58c3408, 2015-01-18 (annotated)
- Committer:
- JSindelar
- Date:
- Sun Jan 18 19:27:16 2015 +0000
- Revision:
- 0:9515d58c3408
University project - accelerometer controlled Arkanoid
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JSindelar | 0:9515d58c3408 | 1 | /* |
JSindelar | 0:9515d58c3408 | 2 | #include "mbed.h" |
JSindelar | 0:9515d58c3408 | 3 | #include "KS0108.h" |
JSindelar | 0:9515d58c3408 | 4 | #include "Arial12.h" |
JSindelar | 0:9515d58c3408 | 5 | #include "SystemFont5x7.h" |
JSindelar | 0:9515d58c3408 | 6 | #include "stdbool.h" |
JSindelar | 0:9515d58c3408 | 7 | #include "MMA8451Q.h" |
JSindelar | 0:9515d58c3408 | 8 | |
JSindelar | 0:9515d58c3408 | 9 | #define step (4) |
JSindelar | 0:9515d58c3408 | 10 | #define minX (125) |
JSindelar | 0:9515d58c3408 | 11 | #define maxX (39) |
JSindelar | 0:9515d58c3408 | 12 | #define minY (2) |
JSindelar | 0:9515d58c3408 | 13 | #define maxY (62) |
JSindelar | 0:9515d58c3408 | 14 | #define PadLength (10) |
JSindelar | 0:9515d58c3408 | 15 | #define PadY (59) |
JSindelar | 0:9515d58c3408 | 16 | #define LowSpeed (2) |
JSindelar | 0:9515d58c3408 | 17 | #define HighSpeed (4) |
JSindelar | 0:9515d58c3408 | 18 | #define XPadInit ((unsigned char)(0.5*(minX+maxX-PadLength))) |
JSindelar | 0:9515d58c3408 | 19 | #define XBallInit ((unsigned char)(XPadInit+0.5*PadLength)) |
JSindelar | 0:9515d58c3408 | 20 | #define BallD (1) |
JSindelar | 0:9515d58c3408 | 21 | #define YBallInit ((unsigned char)(PadY-BallD)) |
JSindelar | 0:9515d58c3408 | 22 | |
JSindelar | 0:9515d58c3408 | 23 | #define BrickH (4) |
JSindelar | 0:9515d58c3408 | 24 | #define BrickW (20) |
JSindelar | 0:9515d58c3408 | 25 | #define columns (4) |
JSindelar | 0:9515d58c3408 | 26 | #define rows (3) |
JSindelar | 0:9515d58c3408 | 27 | |
JSindelar | 0:9515d58c3408 | 28 | #define AccTres1 (0.12) |
JSindelar | 0:9515d58c3408 | 29 | #define AccTres2 (0.25) |
JSindelar | 0:9515d58c3408 | 30 | |
JSindelar | 0:9515d58c3408 | 31 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
JSindelar | 0:9515d58c3408 | 32 | |
JSindelar | 0:9515d58c3408 | 33 | KS0108 display (PTE22,PTE23, PTE29, PTE30, PTE20, PTE21, PTC7, PTC0, PTC3, PTC4, PTC5, PTC6, PTC10, PTC11); |
JSindelar | 0:9515d58c3408 | 34 | |
JSindelar | 0:9515d58c3408 | 35 | //prototypes of functions |
JSindelar | 0:9515d58c3408 | 36 | void DrawBorder(); |
JSindelar | 0:9515d58c3408 | 37 | void DrawBall(unsigned char* X, unsigned char* Y, char* dx, char* dy, unsigned char D, unsigned char PaddlePos, bool* Start, unsigned char* lifes); |
JSindelar | 0:9515d58c3408 | 38 | void MovePad(unsigned char* Pad_ptr, bool Start); |
JSindelar | 0:9515d58c3408 | 39 | void DrawLogo(void); |
JSindelar | 0:9515d58c3408 | 40 | void DrawTable(char sc, char liv); |
JSindelar | 0:9515d58c3408 | 41 | void reset(unsigned char* XBall, unsigned char* YBall, char* dxBall, char* dyBall, unsigned char* XPaddle, bool* Start, unsigned char score, unsigned char lifes); |
JSindelar | 0:9515d58c3408 | 42 | void CreateGrid(unsigned char* col, unsigned char* ro); |
JSindelar | 0:9515d58c3408 | 43 | void DrawBricks(unsigned char col[columns], unsigned char ro[rows]); |
JSindelar | 0:9515d58c3408 | 44 | |
JSindelar | 0:9515d58c3408 | 45 | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); |
JSindelar | 0:9515d58c3408 | 46 | |
JSindelar | 0:9515d58c3408 | 47 | //main program |
JSindelar | 0:9515d58c3408 | 48 | int main() { |
JSindelar | 0:9515d58c3408 | 49 | |
JSindelar | 0:9515d58c3408 | 50 | display.ClearScreen(); |
JSindelar | 0:9515d58c3408 | 51 | |
JSindelar | 0:9515d58c3408 | 52 | unsigned char score = 0; //initial score and number of lifes |
JSindelar | 0:9515d58c3408 | 53 | unsigned char lifes = 3; |
JSindelar | 0:9515d58c3408 | 54 | DrawLogo(); //drawing ARM-kanoid title |
JSindelar | 0:9515d58c3408 | 55 | DrawTable(score,lifes); //drawing table with score and number of lifes |
JSindelar | 0:9515d58c3408 | 56 | DrawBorder(); //drawing border of the playing area |
JSindelar | 0:9515d58c3408 | 57 | |
JSindelar | 0:9515d58c3408 | 58 | unsigned char XBall = XBallInit; |
JSindelar | 0:9515d58c3408 | 59 | unsigned char YBall = YBallInit; |
JSindelar | 0:9515d58c3408 | 60 | char Balldx = 2; |
JSindelar | 0:9515d58c3408 | 61 | char Balldy = -2; |
JSindelar | 0:9515d58c3408 | 62 | |
JSindelar | 0:9515d58c3408 | 63 | unsigned char PadPos = XPadInit; //initializing position of the paddle |
JSindelar | 0:9515d58c3408 | 64 | bool StartFlag = true; |
JSindelar | 0:9515d58c3408 | 65 | |
JSindelar | 0:9515d58c3408 | 66 | unsigned char column[columns]; |
JSindelar | 0:9515d58c3408 | 67 | unsigned char row[rows]; |
JSindelar | 0:9515d58c3408 | 68 | |
JSindelar | 0:9515d58c3408 | 69 | struct brick { //structure for arkanoid bricks description (along with constants brickH and brickW) |
JSindelar | 0:9515d58c3408 | 70 | unsigned char Xbrick; |
JSindelar | 0:9515d58c3408 | 71 | unsigned char Ybrick; |
JSindelar | 0:9515d58c3408 | 72 | bool exists; |
JSindelar | 0:9515d58c3408 | 73 | }BrickArray[rows][columns], cihla; //array of bricks, single brick |
JSindelar | 0:9515d58c3408 | 74 | |
JSindelar | 0:9515d58c3408 | 75 | //struct brick (*BrickArr_ptr)[rows][columns] = &BrickArray; //pointer to array of bricks |
JSindelar | 0:9515d58c3408 | 76 | |
JSindelar | 0:9515d58c3408 | 77 | struct brick (*BrickArr_ptr)[rows][columns]; |
JSindelar | 0:9515d58c3408 | 78 | BrickArr_ptr = BrickArray; |
JSindelar | 0:9515d58c3408 | 79 | CreateGrid(&(column[0]), &(row[0])); //creating grid for bricks |
JSindelar | 0:9515d58c3408 | 80 | DrawBricks(column, row); //drawing bricks |
JSindelar | 0:9515d58c3408 | 81 | |
JSindelar | 0:9515d58c3408 | 82 | while(1) { |
JSindelar | 0:9515d58c3408 | 83 | display.TurnOn(); |
JSindelar | 0:9515d58c3408 | 84 | if (StartFlag){ |
JSindelar | 0:9515d58c3408 | 85 | reset(&XBall, &YBall, &Balldx, &Balldy, &PadPos, &StartFlag, score, lifes); |
JSindelar | 0:9515d58c3408 | 86 | } |
JSindelar | 0:9515d58c3408 | 87 | DrawBall(&XBall, &YBall, &Balldx, &Balldy, BallD, PadPos, &StartFlag, &lifes); //function for drawing the ball, computing its movement, bounces etc. |
JSindelar | 0:9515d58c3408 | 88 | MovePad(&PadPos, StartFlag); //function for paddle drawing and its control by accelerometer |
JSindelar | 0:9515d58c3408 | 89 | wait(0.05); |
JSindelar | 0:9515d58c3408 | 90 | } |
JSindelar | 0:9515d58c3408 | 91 | |
JSindelar | 0:9515d58c3408 | 92 | } |
JSindelar | 0:9515d58c3408 | 93 | |
JSindelar | 0:9515d58c3408 | 94 | void DrawLogo(void){ |
JSindelar | 0:9515d58c3408 | 95 | display.SelectFont(Arial12,BLACK,ReadData); |
JSindelar | 0:9515d58c3408 | 96 | display.GotoXY(8,8); |
JSindelar | 0:9515d58c3408 | 97 | display.PrintString("ARM"); |
JSindelar | 0:9515d58c3408 | 98 | display.GotoXY(4,24); |
JSindelar | 0:9515d58c3408 | 99 | display.PrintString("kanoid"); |
JSindelar | 0:9515d58c3408 | 100 | } |
JSindelar | 0:9515d58c3408 | 101 | |
JSindelar | 0:9515d58c3408 | 102 | void DrawTable(char sc, char liv){ |
JSindelar | 0:9515d58c3408 | 103 | static char score[5]; |
JSindelar | 0:9515d58c3408 | 104 | static char lifes[5]; |
JSindelar | 0:9515d58c3408 | 105 | display.EmptyRectangle(4,38, (maxX-6),56, BLACK); |
JSindelar | 0:9515d58c3408 | 106 | display.FullRectangle(20,39,(maxX-7), 55, WHITE); |
JSindelar | 0:9515d58c3408 | 107 | display.SelectFont(System5x7,BLACK,ReadData); |
JSindelar | 0:9515d58c3408 | 108 | sprintf(score,"S:%2d",sc); |
JSindelar | 0:9515d58c3408 | 109 | sprintf(lifes,"L:%2d",liv); |
JSindelar | 0:9515d58c3408 | 110 | display.GotoXY(8,40); |
JSindelar | 0:9515d58c3408 | 111 | display.PrintString(score); |
JSindelar | 0:9515d58c3408 | 112 | display.GotoXY(8,48); |
JSindelar | 0:9515d58c3408 | 113 | display.PrintString(lifes); |
JSindelar | 0:9515d58c3408 | 114 | } |
JSindelar | 0:9515d58c3408 | 115 | |
JSindelar | 0:9515d58c3408 | 116 | void DrawBorder(void){ |
JSindelar | 0:9515d58c3408 | 117 | display.HLine(maxX-2, 127,0,BLACK); |
JSindelar | 0:9515d58c3408 | 118 | display.VLine(maxX-2, 0,63,BLACK); |
JSindelar | 0:9515d58c3408 | 119 | display.VLine(minX+2, 0,63,BLACK); |
JSindelar | 0:9515d58c3408 | 120 | } |
JSindelar | 0:9515d58c3408 | 121 | |
JSindelar | 0:9515d58c3408 | 122 | void DrawBall(unsigned char* X, unsigned char* Y, char* dx, char* dy, unsigned char D, unsigned char PaddlePos, bool* Start, unsigned char* lifes){ |
JSindelar | 0:9515d58c3408 | 123 | |
JSindelar | 0:9515d58c3408 | 124 | display.FullCircle(*X, *Y, D, WHITE); |
JSindelar | 0:9515d58c3408 | 125 | |
JSindelar | 0:9515d58c3408 | 126 | (*X) += (*dx); |
JSindelar | 0:9515d58c3408 | 127 | (*Y) += (*dy); |
JSindelar | 0:9515d58c3408 | 128 | display.FullCircle(*X, *Y, D, BLACK); |
JSindelar | 0:9515d58c3408 | 129 | //if (!(*Start)){ |
JSindelar | 0:9515d58c3408 | 130 | if ((((unsigned char)(*X+D)) >= minX)||(((char)(*X-D)) <= maxX)){ |
JSindelar | 0:9515d58c3408 | 131 | *dx = -(*dx); |
JSindelar | 0:9515d58c3408 | 132 | } |
JSindelar | 0:9515d58c3408 | 133 | |
JSindelar | 0:9515d58c3408 | 134 | if (((unsigned char)(*Y-D)) <= minY){ |
JSindelar | 0:9515d58c3408 | 135 | *dy = -(*dy); |
JSindelar | 0:9515d58c3408 | 136 | } |
JSindelar | 0:9515d58c3408 | 137 | if (((char)(*Y+D)) >= PadY){ |
JSindelar | 0:9515d58c3408 | 138 | if ((((unsigned char)(*X+D)) <= (PaddlePos+PadLength+2))&&(((unsigned char)(*X-D)) >= (PaddlePos-2))){ |
JSindelar | 0:9515d58c3408 | 139 | *dy = -(*dy); |
JSindelar | 0:9515d58c3408 | 140 | }else{ |
JSindelar | 0:9515d58c3408 | 141 | if (*lifes > 1){ |
JSindelar | 0:9515d58c3408 | 142 | (*lifes)--; |
JSindelar | 0:9515d58c3408 | 143 | *Start = true; |
JSindelar | 0:9515d58c3408 | 144 | }else{ |
JSindelar | 0:9515d58c3408 | 145 | //doplnit kod na game over |
JSindelar | 0:9515d58c3408 | 146 | } |
JSindelar | 0:9515d58c3408 | 147 | } |
JSindelar | 0:9515d58c3408 | 148 | } |
JSindelar | 0:9515d58c3408 | 149 | |
JSindelar | 0:9515d58c3408 | 150 | } |
JSindelar | 0:9515d58c3408 | 151 | |
JSindelar | 0:9515d58c3408 | 152 | void MovePad(unsigned char* Pad_ptr, bool Start){ |
JSindelar | 0:9515d58c3408 | 153 | unsigned char PaddleDif; |
JSindelar | 0:9515d58c3408 | 154 | if ((abs(acc.getAccY()))>AccTres1){ |
JSindelar | 0:9515d58c3408 | 155 | display.FullRectangle(*Pad_ptr, PadY, *Pad_ptr+PadLength ,PadY+2,WHITE); |
JSindelar | 0:9515d58c3408 | 156 | if(Start){ |
JSindelar | 0:9515d58c3408 | 157 | *Pad_ptr = XPadInit; |
JSindelar | 0:9515d58c3408 | 158 | }else{ |
JSindelar | 0:9515d58c3408 | 159 | if ((abs(acc.getAccY()))>AccTres2){ |
JSindelar | 0:9515d58c3408 | 160 | PaddleDif = HighSpeed; |
JSindelar | 0:9515d58c3408 | 161 | }else{ |
JSindelar | 0:9515d58c3408 | 162 | PaddleDif = LowSpeed; |
JSindelar | 0:9515d58c3408 | 163 | } |
JSindelar | 0:9515d58c3408 | 164 | if ((acc.getAccY() > 0)&&((*Pad_ptr+PadLength) < (minX - 3))){ |
JSindelar | 0:9515d58c3408 | 165 | *Pad_ptr += PaddleDif; |
JSindelar | 0:9515d58c3408 | 166 | } |
JSindelar | 0:9515d58c3408 | 167 | if ((acc.getAccY() < 0)&&(*Pad_ptr > (maxX + 1))){ |
JSindelar | 0:9515d58c3408 | 168 | *Pad_ptr -= PaddleDif; |
JSindelar | 0:9515d58c3408 | 169 | } |
JSindelar | 0:9515d58c3408 | 170 | } |
JSindelar | 0:9515d58c3408 | 171 | } |
JSindelar | 0:9515d58c3408 | 172 | display.FullRectangle(*Pad_ptr, PadY, *Pad_ptr+PadLength ,PadY+2,BLACK); |
JSindelar | 0:9515d58c3408 | 173 | } |
JSindelar | 0:9515d58c3408 | 174 | |
JSindelar | 0:9515d58c3408 | 175 | void reset(unsigned char* XBall, unsigned char* YBall, char* dxBall, char* dyBall, unsigned char* XPaddle, bool* Start, unsigned char score, unsigned char lifes){ |
JSindelar | 0:9515d58c3408 | 176 | display.FullCircle(*XBall, *YBall, BallD, WHITE); |
JSindelar | 0:9515d58c3408 | 177 | *XBall = XBallInit; |
JSindelar | 0:9515d58c3408 | 178 | *YBall = YBallInit; |
JSindelar | 0:9515d58c3408 | 179 | display.FullRectangle(*XPaddle, PadY, *XPaddle+PadLength ,PadY+2,WHITE); |
JSindelar | 0:9515d58c3408 | 180 | *XPaddle = XPadInit; |
JSindelar | 0:9515d58c3408 | 181 | wait(1); |
JSindelar | 0:9515d58c3408 | 182 | display.FullCircle(*XBall, *YBall, BallD, BLACK); |
JSindelar | 0:9515d58c3408 | 183 | display.FullRectangle(*XPaddle, PadY, *XPaddle+PadLength ,PadY+2,BLACK); |
JSindelar | 0:9515d58c3408 | 184 | DrawTable(score, lifes); |
JSindelar | 0:9515d58c3408 | 185 | *dxBall = 2; |
JSindelar | 0:9515d58c3408 | 186 | *dyBall = -2; |
JSindelar | 0:9515d58c3408 | 187 | *Start = false; |
JSindelar | 0:9515d58c3408 | 188 | wait(1); |
JSindelar | 0:9515d58c3408 | 189 | } |
JSindelar | 0:9515d58c3408 | 190 | |
JSindelar | 0:9515d58c3408 | 191 | void CreateGrid(unsigned char* col, unsigned char* ro){ |
JSindelar | 0:9515d58c3408 | 192 | char i; |
JSindelar | 0:9515d58c3408 | 193 | for (i = 0; i < columns; i++){ |
JSindelar | 0:9515d58c3408 | 194 | *(col+i) = maxX + i*(BrickW + 2); |
JSindelar | 0:9515d58c3408 | 195 | } |
JSindelar | 0:9515d58c3408 | 196 | for (i = 0; i < columns; i++){ |
JSindelar | 0:9515d58c3408 | 197 | *(ro+i) = minY + i*(BrickH + 2); |
JSindelar | 0:9515d58c3408 | 198 | } |
JSindelar | 0:9515d58c3408 | 199 | } |
JSindelar | 0:9515d58c3408 | 200 | |
JSindelar | 0:9515d58c3408 | 201 | void DrawBricks(unsigned char col[columns], unsigned char ro[rows]){ |
JSindelar | 0:9515d58c3408 | 202 | struct brick { |
JSindelar | 0:9515d58c3408 | 203 | unsigned char Xbrick; |
JSindelar | 0:9515d58c3408 | 204 | unsigned char Ybrick; |
JSindelar | 0:9515d58c3408 | 205 | bool exists; |
JSindelar | 0:9515d58c3408 | 206 | }BrickArray[rows][columns], cihla; |
JSindelar | 0:9515d58c3408 | 207 | |
JSindelar | 0:9515d58c3408 | 208 | char i; |
JSindelar | 0:9515d58c3408 | 209 | char j; |
JSindelar | 0:9515d58c3408 | 210 | for (j = 0; j < rows; j++){ |
JSindelar | 0:9515d58c3408 | 211 | for (i = 0; i < columns; i++){ |
JSindelar | 0:9515d58c3408 | 212 | cihla.Xbrick = col[i]; |
JSindelar | 0:9515d58c3408 | 213 | cihla.Ybrick = ro[j]; |
JSindelar | 0:9515d58c3408 | 214 | cihla.exists = true; |
JSindelar | 0:9515d58c3408 | 215 | BrickArray[j][i] = cihla; |
JSindelar | 0:9515d58c3408 | 216 | display.FullRectangle(cihla.Xbrick,cihla.Ybrick, (cihla.Xbrick + BrickW), (cihla.Ybrick + BrickH) ,((cihla.exists)? BLACK:WHITE)); |
JSindelar | 0:9515d58c3408 | 217 | } |
JSindelar | 0:9515d58c3408 | 218 | } |
JSindelar | 0:9515d58c3408 | 219 | } |
JSindelar | 0:9515d58c3408 | 220 | |
JSindelar | 0:9515d58c3408 | 221 | void BounceBricks(unsigned char* XBall, unsigned char* YBall, char* dxBall, char* dyBall, struct brick* ArrayOfBricks, struct brick* ExBrick, unsigned char ro[rows], unsigned char col[columns], char* dx, char* dy, unsigned char* score){ |
JSindelar | 0:9515d58c3408 | 222 | if (*YBall <= ro[rows-1]){ |
JSindelar | 0:9515d58c3408 | 223 | char i, j; |
JSindelar | 0:9515d58c3408 | 224 | for (i = columns - 1; i >= 0; i--){ |
JSindelar | 0:9515d58c3408 | 225 | if (*XBall >= col[i]){ |
JSindelar | 0:9515d58c3408 | 226 | break; |
JSindelar | 0:9515d58c3408 | 227 | } |
JSindelar | 0:9515d58c3408 | 228 | } |
JSindelar | 0:9515d58c3408 | 229 | for (j = rows - 1; j >= 0; j--){ |
JSindelar | 0:9515d58c3408 | 230 | if (*YBall >= ro[j]){ |
JSindelar | 0:9515d58c3408 | 231 | break; |
JSindelar | 0:9515d58c3408 | 232 | } |
JSindelar | 0:9515d58c3408 | 233 | } |
JSindelar | 0:9515d58c3408 | 234 | |
JSindelar | 0:9515d58c3408 | 235 | if ((*ArrayOfBricks)[i][j].exists){ |
JSindelar | 0:9515d58c3408 | 236 | (ArrayOfBricks)[i][j].exists = false; |
JSindelar | 0:9515d58c3408 | 237 | *score++; |
JSindelar | 0:9515d58c3408 | 238 | *dy = -(*dy); |
JSindelar | 0:9515d58c3408 | 239 | } |
JSindelar | 0:9515d58c3408 | 240 | } |
JSindelar | 0:9515d58c3408 | 241 | } |
JSindelar | 0:9515d58c3408 | 242 | */ |