Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- brianeason92
- Date:
- 2016-11-01
- Revision:
- 0:64079f49da67
File content as of revision 0:64079f49da67:
#include "mbed.h"
#include "uLCD_4DGL.h"
/* ==== Navigation Switch ===== */
class Nav_Switch
{
public:
Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
int read();
//boolean functions to test each switch
bool up();
bool down();
bool left();
bool right();
bool fire();
//automatic read on RHS
operator int ();
//index to any switch array style
bool operator[](int index) {
return _pins[index];
};
private:
BusIn _pins;
};
Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
_pins(up, down, left, right, fire)
{
_pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
wait(0.001); //delays just a bit for pullups to pull inputs high
}
inline bool Nav_Switch::up()
{
return !(_pins[0]);
}
inline bool Nav_Switch::down()
{
return !(_pins[1]);
}
inline bool Nav_Switch::left()
{
return !(_pins[2]);
}
inline bool Nav_Switch::right()
{
return !(_pins[3]);
}
inline bool Nav_Switch::fire()
{
return !(_pins[4]);
}
inline int Nav_Switch::read()
{
return _pins.read();
}
inline Nav_Switch::operator int ()
{
return _pins.read();
}
uLCD_4DGL uLCD(p9,p10,p11);
Nav_Switch myNav(p15,p16,p12,p13,p14);
PwmOut myled(LED1);
AnalogIn mypotentiometer(p20);
void drawTile(int x, int y, int color){
uLCD.filled_rectangle(x, y, x+20, y+2, color);
}
void drawAllTiles(int *enemy_x1, int *enemy_y1, int *enemy_color, bool *alive){
int i = 0;
while(i < 16){
if(alive[i]){
drawTile(enemy_x1[i], enemy_y1[i], enemy_color[i]);
}
i++;
}
}
int position(float pot, int prev_position){
int player_x1 = pot*108;
drawTile(prev_position, 125, BLACK);
drawTile(player_x1, 125, WHITE);
return player_x1;
}
int moveRight(int player_x1){
int prev_position = player_x1;
player_x1 = player_x1 + 6;
if(player_x1 > 108){
player_x1 = 108;
}
else{
drawTile(prev_position, 125, BLACK);
drawTile(player_x1, 125, WHITE);
}
return player_x1;
}
int moveLeft(int player_x1){
int prev_position = player_x1;
player_x1 = player_x1 - 6;
if(player_x1 < 0){
player_x1 = 0;
}
else{
drawTile(prev_position, 125, BLACK);
drawTile(player_x1, 125, WHITE);
}
return player_x1;
}
void printInfo(int lives, int points){
uLCD.locate(0,0);
uLCD.printf("Lives:%i", lives);
uLCD.locate(9,0);
uLCD.printf("Points:%i", points);
}
void drawBall(int x1, int y1, int color){
uLCD.filled_circle(x1, y1, 5, color);
}
int main() {
uLCD.baudrate(3000000);
//draw initial player tile
int player_x1 = 5;
int player_y1 = 125;
//array to keep track of all enemy tiles
bool alive[16];
int enemy_x1[16];
int enemy_x2[16];
int enemy_y1[16];
int enemy_y2[16];
int enemy_color[16];
int i = 0;
int x = 5;
int y = 20;
int color = GREEN;
while(i<16){
alive[i] = true;
enemy_x1[i] = x;
enemy_x2[i] = x+20;
enemy_y1[i] = y;
enemy_y2[i] = y+2;
enemy_color[i] = color;
//setup next tile
y = y + 10;
if(y>50){
x = x + 30;
y = 20;
}
if(color == GREEN){
color = BLUE;
}
else if(color == BLUE){
color = LGREY;
}
else if(color == LGREY){
color = RED;
}
else{
color = GREEN;
}
i++;
}
int lives = 3;
int points = 0;
int ball_x1 = 7;
int ball_y1 = 70;
//0-up
//1-left
//2-down
//3-right
//4-topright
//5-topleft
//6-bottomleft
//7-bottomright
int dir = 7;
bool flip = true;
int start = true;
bool erase = false;
bool winner = false;
bool loser = false;
bool gameover = false;
while(1){
myled = mypotentiometer;
if(myNav.fire()){
if(start==true){erase = true;}
start = false;
}
if(start==true){
uLCD.media_init();
uLCD.set_sector_address(0x003A, 0x4001);
uLCD.display_image(0,0);
}
else if(gameover==false){
if(erase==true){uLCD.cls(); erase = false;}
if(winner==true){uLCD.locate(4,9); uLCD.printf("YOU WIN!!!!"); gameover = true;}
if(loser==true){uLCD.locate(4,9); uLCD.printf("YOU LOSE :("); gameover = true;}
if(lives==0 && loser==false){loser = true; erase=true;}
if(points==16 && winner==false){winner = true; erase = true;}
drawBall(ball_x1, ball_y1, RED);
drawAllTiles(enemy_x1, enemy_y1, enemy_color, alive);
drawTile(player_x1, player_y1, WHITE);
printInfo(lives, points);
player_x1 = position(mypotentiometer, player_x1);
if(myNav.right()){
flip = !flip;
player_x1 = moveRight(player_x1);
}
else if(myNav.left()){
flip = !flip;
player_x1 = moveLeft(player_x1);
}
drawBall(ball_x1, ball_y1, BLACK);
//move ball
if(dir==0){
ball_y1 = ball_y1 - 3;
}
if(dir==2){
ball_y1 = ball_y1 + 3;
}
if(dir==4){
ball_y1 = ball_y1 -2;
ball_x1 = ball_x1 +2;
}
if(dir==5){
ball_y1 = ball_y1 - 2;
ball_x1 = ball_x1 - 2;
}
if(dir==6){
ball_y1 = ball_y1 +2;
ball_x1 = ball_x1 - 2;
}
if(dir==7){
ball_y1 = ball_y1+2;
ball_x1 = ball_x1 + 2;
}
drawBall(ball_x1, ball_y1, RED);
drawTile(player_x1, player_y1, WHITE);
//check ball collision with player
int ball_bottom = ball_y1 + 2.5;
int ball_right = ball_x1 + 2.5;
int ball_left = ball_x1 - 2.5;
int ball_top = ball_y1 - 2.5;
if(ball_bottom>=player_y1 && ball_x1 >= player_x1 && ball_x1 <= player_x1+20){
if(dir==0){dir=2;}
if(dir==6){dir=5;if(flip){dir=4;}}
if(dir==7){dir=4;if(flip){dir=5;}}
}
//check ball collision with walls
if(ball_bottom>=128){
lives--;
drawBall(ball_x1, ball_y1, BLACK);
ball_x1 = 7;
ball_y1 = 70;
dir = 7;
}
if(ball_top<=9){
if(dir==0){dir=2;}
if(dir==5){dir=6;if(flip){dir=7;}}
if(dir==4){dir=7;if(flip){dir=6;}}
flip=!flip;
}
if(ball_left<=0){
if(dir==1){dir=3;}
if(dir==5){dir=4;if(flip){dir=7;}}
if(dir==6){dir=7;if(flip){dir=4;}}
flip=!flip;
}
if(ball_right>=128){
if(dir==3){dir=1;}
if(dir==4){dir=5;if(flip){dir=6;}}
if(dir==7){dir=6;if(flip){dir=5;}}
flip=!flip;
}
//check if ball collided with enemies
i = 0;
while(i < 16){
if(alive[i]==true){
int enemyX1 = enemy_x1[i];
int enemyX2 = enemy_x2[i];
int enemyY1 = enemy_y1[i];
int enemyY2 = enemy_y2[i];
if(ball_x1 >= enemyX1 && ball_x1 <= enemyX2){
if(ball_top <= enemyY2 && ball_top >=enemyY1){
points++;
alive[i] = false;
if(dir==0){dir=2;}
if(dir==5){dir=6;if(flip){dir=7;}}
if(dir==4){dir=7;if(flip){dir=6;}}
drawTile(enemyX1, enemyY1, BLACK);
}
else if(ball_bottom>=enemyY1 && ball_bottom <=enemyY2){
points++;
alive[i] = false;
if(dir==2){dir=0;}
if(dir==6){dir=5;if(flip){dir=4;}}
if(dir==7){dir=4;if(flip){dir=5;}}
drawTile(enemyX1, enemyY1, BLACK);
}
}
else if(ball_y1 >= enemyY1 && ball_y1 <= enemyY2){
if(ball_right >= enemyX1 && ball_right <= enemyX2){
points++;
alive[i] = false;
if(dir==3){dir=1;}
if(dir==4){dir=5;if(flip){dir=6;}}
if(dir==7){dir=6;if(flip){dir=5;}}
drawTile(enemyX1, enemyY1, BLACK);
}
else if(ball_left >= enemyX2 && ball_left <= enemyX1){
points++;
alive[i] = false;
if(dir==1){dir=3;}
if(dir==5){dir=4;if(flip){dir=6;}}
if(dir==6){dir=7;if(flip){dir=5;}}
drawTile(enemyX1, enemyY1, BLACK);
}
}
}
i++;
}
}}
}