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.
Dependencies: 4DGL-uLCD-SE PinDetect mbed SparkfunAnalogJoystick mbed-rtos
Fork of ECE2036Lab2StarterCode by
main.cpp
- Committer:
- jlind6
- Date:
- 2014-06-17
- Revision:
- 0:356124c0bafc
- Child:
- 2:6163865f5ce3
File content as of revision 0:356124c0bafc:
#include "mbed.h"
#include "PinDetect.h"
#include "uLCD_4DGL.h"
#include "Speaker.h"
// Pushbuttons
PinDetect pbUp(p15);
PinDetect pbDown(p16);
// uLCD
uLCD_4DGL uLCD(p28, p27, p29);
//Speaker
Speaker mySpeaker(p21);
// Global variables needed for the push button interrupts
int cornerX = 118, cornerY = 1;
int oldCornerY = 1;
int paddleMove = 8;
int length = 40;
int width = 3;
// State machine definitions
enum gameStateType {START, WAIT, GAME_SETUP, GAME, LOSE};
/* State Definitions:
* START -- Creates the start screen
* WAIT -- After the start screen, goes into wait where mbed spins and does nothing
* GAME_SETUP -- Sets up one time things (like boarders, initializes beginning velocity
* GAME -- When the user actually gets to play
* LOSE -- clears the screen, prints you lose, waits, then goes back to start
*/
// Global state machine variable (So that the pushbuttons can modify it)
gameStateType gameState = START;
// Pushbutton callbacks
// WARNING: Do not call to draw anything to the uLCD in these
// as this will cause the uLCD to crash sometimes. Update positions
// and draw elsewhere (like it's done here).
// Only modify the logic inside the callback functions.
void pbUp_hit_callback (void)
{
switch (gameState)
{
case WAIT:
gameState = GAME_SETUP;
break;
case GAME:
if(cornerY > paddleMove) {
cornerY -= paddleMove;
}
break;
}
}
void pbDown_hit_callback (void)
{
switch (gameState)
{
case WAIT:
gameState = GAME_SETUP;
break;
case GAME:
if(cornerY < 127 - paddleMove - length){
cornerY += paddleMove;
}
break;
}
}
int main()
{
// This is setting up the pushbuttons
// Don't modify this code.
pbUp.mode(PullUp);
pbDown.mode(PullUp);
wait(0.1);
pbUp.attach_deasserted(&pbUp_hit_callback);
pbDown.attach_deasserted(&pbDown_hit_callback);
pbUp.setSampleFrequency();
pbDown.setSampleFrequency();
// Don't modify this code.
uLCD.display_control(PORTRAIT);
uLCD.cls();
uLCD.baudrate(BAUD_3000000);
uLCD.background_color(BLACK);
// Initialize all your variables outside the while/switch statement
// to avoid compiler warning/errors
int vxSign = 1, vySign = 1;
float fx=50.0,fy=21.0,vx=1.6,vy=1.2;
int x=50, y=21, radius=5;
int score = 0;
int i = 0;
int random;
while (1)
{
switch (gameState)
{
case START:
uLCD.cls();
uLCD.locate(0,0);
uLCD.printf("Pong!!!\n\n");
uLCD.printf("Press Key to Start");
gameState = WAIT;
break;
case GAME_SETUP:
uLCD.cls();
uLCD.line(0, 0, 127, 0, 0xCFB53B);
uLCD.line(127, 0, 127, 127, 0xCFB53B);
uLCD.line(127, 127, 0, 127, 0xCFB53B);
uLCD.line(0, 127, 0, 0, 0xCFB53B);
vx = 1.6;
vy = 1.2;
srand(i);
random = (rand() % (118 - 2*radius)) + radius;
fx = random;
random = (rand() % (127 - 2*radius)) + radius;
fy = random;
x=(int)fx; y=(int)fy;
random = rand() % 1;
vxSign=-1; vySign=((float)random - 0.5)*2;
uLCD.filled_rectangle(cornerX, cornerY, cornerX+width, cornerY+length, BLUE);
gameState = GAME;
break;
case GAME:
if ((fx+vxSign*vx<=radius+1))
{
vxSign = -vxSign;
}
if ((fy+vySign*vy<=radius+1) || (fy+vySign*vy>=126-radius))
{
vySign = -vySign;
}
if (((fx+vxSign*vx >= cornerX) && (fx+vxSign*vy <= cornerX+3)) &&
((fy+vySign*vy>=cornerY) && (fy+vySign*vy<=cornerY+length)))
{
vySign = -vySign;
}
if ((fx+vxSign*vx>=126-radius))
{
vx = 0;
vy = 0;
gameState = LOSE;
}
if ((fx+vxSign*vx>=cornerX-radius) && (fy+vySign*vy<=cornerY+length) && (fy+vySign*vy>=cornerY))
{
vxSign = -vxSign;
score++;
uLCD.locate(1,1);
uLCD.printf("%d", score);
}
uLCD.circle(x, y, radius, BLACK);
fx=fx+(vxSign*vx);
fy=fy+(vySign*vy);
x=(int)fx;
y=(int)fy;
uLCD.circle(x, y, radius, WHITE);
// We can assume that these for loops are quick enough that the paddle will move only one interval.
// These movements of the paddle have been optimized. Feel free to draw it out to see how it's been done.
if(oldCornerY > cornerY) {
uLCD.filled_rectangle(cornerX, oldCornerY-paddleMove+1, cornerX+width, oldCornerY, BLUE);
uLCD.filled_rectangle(cornerX, oldCornerY+length-paddleMove+1, cornerX+width, oldCornerY+length, BLACK);
oldCornerY = cornerY;
}
else if(oldCornerY < cornerY) {
uLCD.filled_rectangle(cornerX, oldCornerY, cornerX+width, oldCornerY+paddleMove, BLACK);
uLCD.filled_rectangle(cornerX, oldCornerY+length, cornerX+width, oldCornerY+length+paddleMove, BLUE);
oldCornerY = cornerY;
}
break;
case LOSE:
uLCD.cls();
uLCD.printf("YOU LOSE D:");
score = 0;
wait(5.0);
gameState = START;
break;
case WAIT:
// Used to seed the rand() function so we don't get the same starting position every time.
i++;
break;
}
}
}
