1D-Pong game based on a LED strip with 150 LPD6803-controlled pixels. Game keeps score for 'best-of-21' game. Written for KL25Z
Diff: main.cpp
- Revision:
- 21:a554229e884b
- Parent:
- 20:a63273c11af0
- Child:
- 22:a7619f315c0e
--- a/main.cpp Mon Aug 26 14:20:32 2013 +0000 +++ b/main.cpp Tue Aug 27 18:54:15 2013 +0000 @@ -1,12 +1,13 @@ #include "mbed.h" #include "MODSERIAL.h" +#include "paddle.h" +#include "GameButton.h" #define NUMBER_OF_PIXELS 50 #define PADDLE_LENGTH 5 #define STARTING_SPEED 20 #define LEFT false #define RIGHT true -#define MAX_PADDLE_SIZE 10 void Randomblinks(float seconds, bool colored = false); void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue); void WinLoose(float seconds, bool side); @@ -21,146 +22,6 @@ SPI ledstrip(PTD2,NC,PTD1); MODSERIAL pc(USBTX,USBRX); -class Paddle -{ - public: - Paddle();//constructor -// ~Paddle();//deconstructor - int16_t position; - uint8_t direction; - void setSpeed(float speed); //pixels per second - void setColor(uint8_t red, uint8_t green, uint8_t blue); - uint8_t getSize(void); - uint8_t getSpeed(void){return m_speed;}; - void setSize(uint8_t size); - uint8_t getColor(uint8_t pixel, uint8_t color); - private: - uint8_t m_red ,m_green ,m_blue; - uint8_t m_size; - uint8_t m_paddle[MAX_PADDLE_SIZE][3]; - float m_speed; - Ticker UpdatePosition; - void PositionUpdater(void); -}; - -Paddle::Paddle() -{ - setColor(255,255,255); - setSize(4); - position = -getSize(); - direction = 1; - setSpeed(50); -} - -void Paddle::setSpeed(float speed) -{ -//truncate - float time; - if(speed > 100000) - speed = 100000; - if(speed <= 0) - speed = 0.001; - m_speed = speed; - time = 1/m_speed; - UpdatePosition.detach(); - UpdatePosition.attach(this,&Paddle::PositionUpdater, time); -} - -void Paddle::PositionUpdater(void) -{ - if(direction == 1) - position++; - else - position--; -} - -uint8_t Paddle::getColor(uint8_t pixel, uint8_t color) -{ - if(pixel<MAX_PADDLE_SIZE && color < 3) - return m_paddle[pixel][color]; - else - return 0; -} - -uint8_t Paddle::getSize(void) -{ - return m_size; -} - -void Paddle::setSize(uint8_t size) -{ - if(size > MAX_PADDLE_SIZE) - size = MAX_PADDLE_SIZE; - m_size = size; - setColor(m_red, m_green, m_blue); -} - -void Paddle::setColor(uint8_t red, uint8_t green, uint8_t blue) -{ - uint8_t paddlepixel; - m_red = red; - m_green = green; - m_blue = blue; - for(paddlepixel = 0 ; paddlepixel < MAX_PADDLE_SIZE ; paddlepixel++) - { - float factor; - factor = 1.0*paddlepixel/(m_size*1.0); - if (factor > 1) - factor = 1; - factor = factor*factor*factor;// make the effect more dramatic - m_paddle[paddlepixel][0] = (float)m_red * factor; - m_paddle[paddlepixel][1] = (float)m_green * factor; - m_paddle[paddlepixel][2] = (float)m_blue * factor; - } -} - -class GameButton -{ - public: - GameButton(){}; - GameButton(PinName pin, float time); - bool pushflag; - bool getTimeoutActive(void); - protected: - virtual void pushhandlercallback(void){}; - private: - InterruptIn *intpin; - Timeout timeout; - float m_time; - bool m_timeoutactive; - void TimeOutHandler(void); - virtual void PushHandler(void); -}; - -GameButton::GameButton(PinName pin, float time=0.5) -{ - pushflag = false; - intpin = new InterruptIn(pin); - (*intpin).mode(PullUp); - (*intpin).fall(this, &GameButton::PushHandler); - m_time = time; - m_timeoutactive = false; - //timeout = new Timeout(m_time); -} - -void GameButton::PushHandler(void) -{ - pushflag = true; - m_timeoutactive = true; - timeout.attach(this, &GameButton::TimeOutHandler, m_time); - pushhandlercallback(); -} - -void GameButton::TimeOutHandler(void) -{ - m_timeoutactive = false; -} - -bool GameButton::getTimeoutActive(void) -{ - return m_timeoutactive; -} - Paddle paddle; class PongGameButton : public GameButton @@ -171,7 +32,7 @@ int16_t paddlepos; }; -PongGameButton::PongGameButton(PinName name, float time) : GameButton(name) +PongGameButton::PongGameButton(PinName name, float time) : GameButton(name, time) { paddlepos = 0; } @@ -224,10 +85,6 @@ uint8_t ledcounter; uint8_t left_score = 0, right_score = 0; pc.baud(115200); - // buttonleft.mode(PullUp); - // buttonright.mode(PullUp); - // buttonright.fall(right_pushed); - // buttonleft.fall(left_pushed); updater.attach(UpdateLEDstrip, .03); //demopaddlepos.attach(UpdateDemoPaddle, .03); ledstrip.format(8,0); //15 bits, mode '0' @@ -261,7 +118,7 @@ if(buttonright.paddlepos >= NUMBER_OF_PIXELS-1 ) //also count when hit at last pixel = NUMBER_OF_PIXELS-1 { paddle.direction = 0; - paddle.setSpeed(20+(buttonright.paddlepos-(NUMBER_OF_PIXELS-1))*2); + paddle.setSpeed(25+(buttonright.paddlepos-(NUMBER_OF_PIXELS-1))*8); paddle.position = NUMBER_OF_PIXELS-2; } pc.printf("\n\rright pushed. Paddle position: %d, registered: %d, speed: %", paddle.position, buttonright.paddlepos,paddle.getSpeed()); @@ -277,7 +134,7 @@ if(buttonleft.paddlepos <= 0 ) { paddle.direction = 1; - paddle.setSpeed(20+(-buttonleft.paddlepos)*2); + paddle.setSpeed(25+(-buttonleft.paddlepos)*8); paddle.position = 0; } pc.printf("\n\rleft pushed. Paddle position: %d, registered: %d, speed %d", paddle.position, buttonleft.paddlepos, paddle.getSpeed()); @@ -321,7 +178,7 @@ if(gametimer.read()>15 && !naglevel2) { naglevel2 = 1; - paddle.setSize(2); + paddle.setSize(10); //paddle.setSpeed(70); } wait(0.05);