University project - accelerometer controlled Arkanoid
Dependencies: KS0108 MMA8451Q mbed
backup3_non_functional_ptrs2struct_2Darray.cpp
- Committer:
- JSindelar
- Date:
- 2015-01-18
- Revision:
- 0:9515d58c3408
File content as of revision 0:9515d58c3408:
/* #include "mbed.h" #include "KS0108.h" #include "Arial12.h" #include "SystemFont5x7.h" #include "stdbool.h" #include "MMA8451Q.h" #define step (4) #define minX (125) #define maxX (39) #define minY (2) #define maxY (62) #define PadLength (10) #define PadY (59) #define LowSpeed (2) #define HighSpeed (4) #define XPadInit ((unsigned char)(0.5*(minX+maxX-PadLength))) #define XBallInit ((unsigned char)(XPadInit+0.5*PadLength)) #define BallD (1) #define YBallInit ((unsigned char)(PadY-BallD)) #define BrickH (4) #define BrickW (20) #define columns (4) #define rows (3) #define AccTres1 (0.12) #define AccTres2 (0.25) #define MMA8451_I2C_ADDRESS (0x1d<<1) KS0108 display (PTE22,PTE23, PTE29, PTE30, PTE20, PTE21, PTC7, PTC0, PTC3, PTC4, PTC5, PTC6, PTC10, PTC11); //prototypes of functions void DrawBorder(); void DrawBall(unsigned char* X, unsigned char* Y, char* dx, char* dy, unsigned char D, unsigned char PaddlePos, bool* Start, unsigned char* lifes); void MovePad(unsigned char* Pad_ptr, bool Start); void DrawLogo(void); void DrawTable(char sc, char liv); void reset(unsigned char* XBall, unsigned char* YBall, char* dxBall, char* dyBall, unsigned char* XPaddle, bool* Start, unsigned char score, unsigned char lifes); void CreateGrid(unsigned char* col, unsigned char* ro); void DrawBricks(unsigned char col[columns], unsigned char ro[rows]); MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); //main program int main() { display.ClearScreen(); unsigned char score = 0; //initial score and number of lifes unsigned char lifes = 3; DrawLogo(); //drawing ARM-kanoid title DrawTable(score,lifes); //drawing table with score and number of lifes DrawBorder(); //drawing border of the playing area unsigned char XBall = XBallInit; unsigned char YBall = YBallInit; char Balldx = 2; char Balldy = -2; unsigned char PadPos = XPadInit; //initializing position of the paddle bool StartFlag = true; unsigned char column[columns]; unsigned char row[rows]; struct brick { //structure for arkanoid bricks description (along with constants brickH and brickW) unsigned char Xbrick; unsigned char Ybrick; bool exists; }BrickArray[rows][columns], cihla; //array of bricks, single brick //struct brick (*BrickArr_ptr)[rows][columns] = &BrickArray; //pointer to array of bricks struct brick (*BrickArr_ptr)[rows][columns]; BrickArr_ptr = BrickArray; CreateGrid(&(column[0]), &(row[0])); //creating grid for bricks DrawBricks(column, row); //drawing bricks while(1) { display.TurnOn(); if (StartFlag){ reset(&XBall, &YBall, &Balldx, &Balldy, &PadPos, &StartFlag, score, lifes); } DrawBall(&XBall, &YBall, &Balldx, &Balldy, BallD, PadPos, &StartFlag, &lifes); //function for drawing the ball, computing its movement, bounces etc. MovePad(&PadPos, StartFlag); //function for paddle drawing and its control by accelerometer wait(0.05); } } void DrawLogo(void){ display.SelectFont(Arial12,BLACK,ReadData); display.GotoXY(8,8); display.PrintString("ARM"); display.GotoXY(4,24); display.PrintString("kanoid"); } void DrawTable(char sc, char liv){ static char score[5]; static char lifes[5]; display.EmptyRectangle(4,38, (maxX-6),56, BLACK); display.FullRectangle(20,39,(maxX-7), 55, WHITE); display.SelectFont(System5x7,BLACK,ReadData); sprintf(score,"S:%2d",sc); sprintf(lifes,"L:%2d",liv); display.GotoXY(8,40); display.PrintString(score); display.GotoXY(8,48); display.PrintString(lifes); } void DrawBorder(void){ display.HLine(maxX-2, 127,0,BLACK); display.VLine(maxX-2, 0,63,BLACK); display.VLine(minX+2, 0,63,BLACK); } void DrawBall(unsigned char* X, unsigned char* Y, char* dx, char* dy, unsigned char D, unsigned char PaddlePos, bool* Start, unsigned char* lifes){ display.FullCircle(*X, *Y, D, WHITE); (*X) += (*dx); (*Y) += (*dy); display.FullCircle(*X, *Y, D, BLACK); //if (!(*Start)){ if ((((unsigned char)(*X+D)) >= minX)||(((char)(*X-D)) <= maxX)){ *dx = -(*dx); } if (((unsigned char)(*Y-D)) <= minY){ *dy = -(*dy); } if (((char)(*Y+D)) >= PadY){ if ((((unsigned char)(*X+D)) <= (PaddlePos+PadLength+2))&&(((unsigned char)(*X-D)) >= (PaddlePos-2))){ *dy = -(*dy); }else{ if (*lifes > 1){ (*lifes)--; *Start = true; }else{ //doplnit kod na game over } } } } void MovePad(unsigned char* Pad_ptr, bool Start){ unsigned char PaddleDif; if ((abs(acc.getAccY()))>AccTres1){ display.FullRectangle(*Pad_ptr, PadY, *Pad_ptr+PadLength ,PadY+2,WHITE); if(Start){ *Pad_ptr = XPadInit; }else{ if ((abs(acc.getAccY()))>AccTres2){ PaddleDif = HighSpeed; }else{ PaddleDif = LowSpeed; } if ((acc.getAccY() > 0)&&((*Pad_ptr+PadLength) < (minX - 3))){ *Pad_ptr += PaddleDif; } if ((acc.getAccY() < 0)&&(*Pad_ptr > (maxX + 1))){ *Pad_ptr -= PaddleDif; } } } display.FullRectangle(*Pad_ptr, PadY, *Pad_ptr+PadLength ,PadY+2,BLACK); } void reset(unsigned char* XBall, unsigned char* YBall, char* dxBall, char* dyBall, unsigned char* XPaddle, bool* Start, unsigned char score, unsigned char lifes){ display.FullCircle(*XBall, *YBall, BallD, WHITE); *XBall = XBallInit; *YBall = YBallInit; display.FullRectangle(*XPaddle, PadY, *XPaddle+PadLength ,PadY+2,WHITE); *XPaddle = XPadInit; wait(1); display.FullCircle(*XBall, *YBall, BallD, BLACK); display.FullRectangle(*XPaddle, PadY, *XPaddle+PadLength ,PadY+2,BLACK); DrawTable(score, lifes); *dxBall = 2; *dyBall = -2; *Start = false; wait(1); } void CreateGrid(unsigned char* col, unsigned char* ro){ char i; for (i = 0; i < columns; i++){ *(col+i) = maxX + i*(BrickW + 2); } for (i = 0; i < columns; i++){ *(ro+i) = minY + i*(BrickH + 2); } } void DrawBricks(unsigned char col[columns], unsigned char ro[rows]){ struct brick { unsigned char Xbrick; unsigned char Ybrick; bool exists; }BrickArray[rows][columns], cihla; char i; char j; for (j = 0; j < rows; j++){ for (i = 0; i < columns; i++){ cihla.Xbrick = col[i]; cihla.Ybrick = ro[j]; cihla.exists = true; BrickArray[j][i] = cihla; display.FullRectangle(cihla.Xbrick,cihla.Ybrick, (cihla.Xbrick + BrickW), (cihla.Ybrick + BrickH) ,((cihla.exists)? BLACK:WHITE)); } } } 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){ if (*YBall <= ro[rows-1]){ char i, j; for (i = columns - 1; i >= 0; i--){ if (*XBall >= col[i]){ break; } } for (j = rows - 1; j >= 0; j--){ if (*YBall >= ro[j]){ break; } } if ((*ArrayOfBricks)[i][j].exists){ (ArrayOfBricks)[i][j].exists = false; *score++; *dy = -(*dy); } } } */