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);
        }
    }
}
*/