ST7735 Pong by Jonne Valola, derived work from William Johnston\'s mbed Pong for NokiaLCD / PS2 keyboard This pong uses a rotary encoder hooked to pins 21 and 22, ST7735_TFT library by me, RotaryEncoder library by Shinichiro Nakamura. All copyrights of respective owners. Use on your own risk and discretion.

Dependencies:   mbed ST7735_TFT RotaryEncoder TFT_fonts_old

main.cpp

Committer:
smultron1977
Date:
2011-12-12
Revision:
0:2353da390056

File content as of revision 0:2353da390056:

/** ST7735 Pong by Jonne Valola, derived work from William Johnston's mbed Pong for NokiaLCD / PS2 keyboard
* This pong uses a rotary encoder hooked to pins 21 and 22,
* ST7735_TFT library by me, RotaryEncoder library by Shinichiro Nakamura
* All copyrights of respective owners. Use on your own risk and discretion.  
*/ 

#include "mbed.h"
#include "ball.h"
#include "paddle.h"
#include "ST7735_TFT.h"
#include "string"
#include "Arial12x12.h"
#include "Arial24x23.h"
#include "RotaryEncoder.h"

RotaryEncoder re(p21, p22, 0, 600, 300);

// State enumerator
typedef enum {
  RESET, RUN, PAUSE
} STATES;

ST7735_TFT lcd(p5, p6, p7, p8, p11, p15,"TFT"); // mosi, miso, sclk, cs, rs, reset

/* 
 * Subroutine drawScreen:
 * Description: Draws both paddles
 *  and the ball.
 */
void drawScreen(Paddle paddle1, Paddle paddle2, Ball theBall, bool isBlack) {
  paddle1.draw(lcd, isBlack);
  paddle2.draw(lcd ,isBlack);
  theBall.draw(lcd ,isBlack);
}

/* 
 * Subroutine drawScores:
 * Description: Draws the scoreboard
 */
void drawScores(Paddle paddle1, Paddle paddle2) {
  lcd.locate(60,1);
  lcd.printf("%d", paddle1.getScore());
  lcd.locate(90,1);
  lcd.printf("%d", paddle2.getScore());
  lcd.fillrect(79,0,81,128,0xFFFFFF);
}

int main() {
  lcd.background(0x000000);
  lcd.cls();
  lcd.set_orientation(1);
  lcd.set_font((unsigned char*) Arial12x12);  // select the font
  Paddle paddle1, paddle2;
  Ball theBall;
  int temp, count=0, oldY;
  drawScreen(paddle1, paddle2, theBall, false);
  drawScores(paddle1, paddle2);
  STATES state = RESET; // Initial state is RESET
  while(1) {  
    switch(state) {
      case RESET: // Reset objects, draw the screen, state = PAUSE
        lcd.cls();
        paddle1 = Paddle(0,40,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
        paddle2 = Paddle(154,40,5,25,0xFFFFFF,paddle2.getLives(),paddle2.getScore());
        theBall = Ball(80,64,5,5,0xFFFF00,1,1);
        drawScreen(paddle1, paddle2, theBall, false);
        drawScores(paddle1, paddle2);
        oldY = re.getVal();
        state = RUN;
        break;
      case RUN: 
        if (oldY > re.getVal()) { // Executes if encoder turned
                if(paddle1.getY()>2)
                paddle1.move(lcd, -2);
        }
         if (oldY < re.getVal()) { // Executes if encoder turned
              if(paddle1.getY()+paddle1.getHeight()<128)
                paddle1.move(lcd, 2);
        }
        oldY = re.getVal();
       
        if(count%2) // Only let CPU move once every 2 times through the loop
          paddle2.moveCPU(lcd, theBall.getY());
        if(++count==5) { // Only move the ball once every 5 times through the loop
          count = 0;
          if(theBall.hitP1((paddle1.getX()+paddle1.getWidth()), paddle1.getY(), paddle1.getHeight()))
            theBall.reverseX();
          if(theBall.hitP2(paddle2.getX(), paddle2.getY(), paddle2.getHeight()))
            theBall.reverseX();
          if(theBall.hitX()) { // If the ball hits one of the sides of the screen
            if(theBall.getX()<7) { // If the ball hit paddle1's side
                paddle2.addPoint();              
            }
            else if(theBall.getX()>153) { // If the ball hit paddle2's side
                paddle1.addPoint();            
            }
            theBall.reverseX();
            state = RESET; // Reset the objects
          }
          if(theBall.hitY()) 
            theBall.reverseY();
          theBall.move(lcd);
        }
        break;
    }
    drawScreen(paddle1, paddle2, theBall, false);
    drawScores(paddle1, paddle2);
  }
}