Breakout

Advice on general approaches or feasibility and discussions about game design

Breakout

Postby ripper121 » Sun Apr 20, 2014 9:45 am

My Breakout in early Alpha :D



Code: Select all
#include <SPI.h>
#include <Gamebuino.h>
Gamebuino gb = Gamebuino();
static unsigned char PROGMEM logo[] =
{
  64, 28,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00001111, B11100000, B00000000, B00000000, B01100000, B00000000, B00000001, B00000000,
  B00001111, B11100000, B00000000, B00000000, B01100000, B00000000, B00000011, B00000000,
  B00001100, B00100011, B01001110, B00011100, B01100110, B01110001, B10111111, B11000000,
  B00001111, B11100011, B10111011, B00010110, B01101100, B11111101, B10111011, B11000000,
  B00001111, B11100011, B00111110, B00001110, B01111000, B11011101, B10111011, B00000000,
  B00001100, B00100011, B00111000, B00110110, B01111100, B11011101, B10111011, B00000000,
  B00001111, B11100011, B00011110, B00111110, B01101100, B01111001, B11111011, B11000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B11111100, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000001, B11111110, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000001, B11111110, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000100, B11111110, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000001, B11111100, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00010000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
  B00000000, B00000000, B00111111, B11111111, B11111111, B11110000, B00000000, B00000000,
  B00000000, B00000000, B11111111, B11111111, B11111111, B11111110, B00000000, B00000000,
  B00000000, B00000001, B11111111, B11111111, B11111111, B11111110, B00000000, B00000000,
  B00000000, B00000001, B11111111, B11111111, B11111111, B11111110, B00000000, B00000000,
};

boolean paused = false;
#define BrickW 5
#define BrickH 2
#define BrickSpaceX 1
#define BrickSpaceY 1
#define BrickColsMax 11
#define BrickRows (LCDWIDTH/(BrickSpaceX+BrickW))-1
int BrickCols = 4;

static unsigned char PROGMEM explode0[] = {
  8, 8,
  B00010000,
  B01000001,
  B00000100,
  B10010000,
  B00000100,
  B01000001,
  B00001000,
  B10100100,
};

static unsigned char PROGMEM explode1[] = {
  8, 8,
  B00000000,
  B01000001,
  B00000100,
  B00010000,
  B00000100,
  B01000000,
  B00001000,
  B00000000,
};

static unsigned char PROGMEM explode2[] = {
  8, 8,
  B00000000,
  B00000000,
  B00000000,
  B00010000,
  B00000100,
  B01000000,
  B00001000,
  B00000000,
};


typedef struct
{
  int x;
  int y;
  int vx;
  int vy;
  byte w;
  byte h;
  int score;
}  PlayerStruct;
PlayerStruct Player = (PlayerStruct) {
  0, 0, 0, 0, 0, 0, 0
};

typedef struct
{
  int x;
  int y;
  int vx;
  int vy;
  int v;
  byte w;
  byte h;
  byte size;
  boolean exist;
}  BallStruct;
BallStruct Ball = (BallStruct) {
  0, 0, 0, 0, 0, 0, 0, true
};

typedef struct
{
  byte x;
  byte y;
  byte w;
  byte h;
  boolean exist;
}  BrickStruct;


///////////////////////////////////// SETUP
void setup() {
  randomSeed(gb.battery.voltage + gb.backlight.ambientLight);
  gb.begin(F("Breakout by Ripper121"), logo);
  gb.battery.show = false; //hide the battery indicator
}

BrickStruct Brick[BrickRows][BrickColsMax];
int BrickCount = 0;
int DestBrickCount = 0;
boolean GameReset = true;
boolean GameWin = false;
boolean GameFirstRun = true;
byte Level = 1;

///////////////////////////////////// LOOP
void loop() {
  //Game Init/NextLevel
  if (GameReset) {
    if (GameWin) {
      gb.display.clear();
      gb.display.setTextSize(1);
      Level++;
      if (BrickCols < BrickColsMax) {
        BrickCols++;
        gb.display.print("Next level!\n");
        gb.display.print("Level:\n");
        gb.display.print(Level);
        gb.display.print("\nScore:\n");
        gb.display.print(Player.score);
      }
      else
      {
        gb.display.print("You win the game!\n");
        gb.display.print("Level:\n");
        gb.display.print(Level);
        gb.display.print("\nScore:\n");
        gb.display.print(Player.score);
      }
      gb.display.update();
      gb.sound.playOK();
      delay(5000);
    }
    else if (!GameFirstRun)
    {
      gb.display.clear();
      gb.display.setTextSize(1);
      gb.display.print("Game Over!\n");
      gb.display.print("Level:\n");
      gb.display.print(Level);
      gb.display.print("\nScore:\n");
      gb.display.print(Player.score);
      gb.sound.playCancel();
      gb.display.update();
      BrickCols = 4;
      Player.score = 0;
      Level = 0;
      DestBrickCount = 0;
      delay(5000);
    }

    //Brick Init
    BrickCount = 0;
    for (byte row = 0; row < BrickRows; row++)
      for (byte col = 0; col < BrickCols; col++) {
        Brick[row][col] = (BrickStruct) {
          (LCDWIDTH / (BrickSpaceX + BrickW)) / 4 + row * (BrickW + BrickSpaceX), 5 + BrickSpaceY + col * (BrickH + BrickSpaceY), BrickW, BrickH, true
        };
        BrickCount++;
      }

    GameReset = false;
    GameWin = false;
    GameFirstRun = false;

    //Player Init
    Player.w = 10;
    Player.h = 2;
    Player.x = (LCDWIDTH - Player.w) / 2;
    Player.vx = 2;
    Player.y = LCDHEIGHT - Player.h;
    Player.vy = 0;



    //Ball Init
    Ball.size = 3;
    Ball.x = (LCDWIDTH - Player.w) / 2;
    Ball.y = LCDHEIGHT - Player.h - Ball.size;
    Ball.v = 1;
    Ball.vx = -Ball.v;
    Ball.vy = -Ball.v;
    //Random move the ball left or right   
    if (random(0, 2) == 1) {
      Ball.vx = -Ball.vx;
    }
  }

  //Game Run
  if (gb.update()) {

    //pause the game if C is pressed
    if (gb.buttons.pressed(BTN_C)) {
      paused = !paused; //toggle paused state
    }
    if (!paused) {

      //move the player
      if (gb.buttons.repeat(BTN_LEFT, 1)) {
        Player.x = max(0, Player.x - Player.vx );
      }
      if (gb.buttons.repeat(BTN_RIGHT, 1)) {
        Player.x = min(LCDWIDTH - Player.w, Player.x + Player.vx );
      }
      //move the ball
      Ball.x = Ball.x + Ball.vx;
      Ball.y = Ball.y + Ball.vy;
      //collision with the top
      if (Ball.x < 0) {
        Ball.x = 0;
        Ball.vx = -Ball.vx;
        gb.sound.playTick();
      }
      //collision with the left
      if (Ball.y < 0) {
        Ball.y = 0;
        Ball.vy = -Ball.vy;
        gb.sound.playTick();
      }
      //collision with the right
      if ((Ball.x + Ball.size) > LCDWIDTH) {
        Ball.x = LCDWIDTH - Ball.size;
        Ball.vx = -Ball.vx;
        gb.sound.playTick();
      }
      //collision with the bottom
      if ((Ball.y + Ball.size) > LCDHEIGHT) {
        Ball.y = LCDHEIGHT - Ball.size;
        Ball.vy = -Ball.vy;       
        GameReset = true;
        gb.sound.playTick();       
      }
      //collision with the player
      if (gb.collideRectRect(Ball.x, Ball.y, Ball.size, Ball.size, Player.x, Player.y, Player.w, Player.h)) {
        int BallOnPlayer = ((Ball.x + ( Ball.size / 2 )) - Player.x) + 1;
        if (BallOnPlayer > (Player.w / 2))
          Ball.vx = Ball.v;
        else
          Ball.vx = -Ball.v;
        Ball.vy = -Ball.vy;
        gb.sound.playTick();
      }

    }
   
        //draw the ball
    gb.display.fillRect(Ball.x, Ball.y, Ball.size, Ball.size);
    //draw the player
    gb.display.fillRect(Player.x, Player.y, Player.w, Player.h);
    //Draw Bricks
    for (byte row = 0; row < BrickRows; row++)
      for (byte col = 0; col < BrickCols; col++) {
        //draw the bricks if they do exist
        if (Brick[row][col].exist)
          gb.display.fillRect(Brick[row][col].x, Brick[row][col].y, Brick[row][col].w, Brick[row][col].h);
      }
    //collision with the bricks
    for (byte row = 0; row < BrickRows; row++)
      for (byte col = 0; col < BrickCols; col++) {
        //collision with the bricks
        if (gb.collideRectRect(Ball.x, Ball.y, Ball.size, Ball.size, Brick[row][col].x, Brick[row][col].y, Brick[row][col].w, Brick[row][col].h) && Brick[row][col].exist) {
          //Incr Score
          Player.score++;
          //Incr Destroyed Bricks
          DestBrickCount++;
          //Hide the Brick
          Brick[row][col].exist = false;
          Ball.vy = -Ball.vy;
          //Explosion Animation
          byte AnimationDelay=40;
          gb.sound.playCancel();
          gb.display.drawBitmap(Ball.x - Ball.size, Ball.y - Ball.size, explode2);
          gb.display.update();
          delay(AnimationDelay);
          gb.display.drawBitmap(Ball.x - Ball.size, Ball.y - Ball.size, explode1);
          gb.display.update();
          delay(AnimationDelay);
          gb.display.drawBitmap(Ball.x - Ball.size, Ball.y - Ball.size, explode0);
          gb.display.update();
          delay(AnimationDelay);
          gb.display.drawBitmap(Ball.x - Ball.size, Ball.y - Ball.size, explode1);
          gb.display.update();
          delay(AnimationDelay);
          gb.display.drawBitmap(Ball.x - Ball.size, Ball.y - Ball.size, explode2);
          gb.display.update();
          delay(AnimationDelay);
          gb.sound.playTick();
        }
      }
    //No more Bricks exist
    if (DestBrickCount >= BrickCount) {
      GameWin = true;
      GameReset = true;
      DestBrickCount = 0;
    }
  }
}



Update 0.1: Now with Gamebuino.
Download the HEX (out of date): Download

Update 0.2:
- Animation
- Paddle (if the ball hides the paddle on the left it goes to left and if it hits the right it go to right)
- some bugfixes
Last edited by ripper121 on Fri May 23, 2014 7:16 pm, edited 10 times in total.
User avatar
ripper121
 
Posts: 224
Joined: Fri Apr 04, 2014 2:02 pm
Location: Germany

Re: BrickBreaker

Postby rodot » Sun Apr 20, 2014 10:08 am

Nice! You could easily use the Gamebuino library, you just have to change the pins in settings.c (except for sound, it can't be changed).
User avatar
rodot
Site Admin
 
Posts: 1290
Joined: Mon Nov 19, 2012 11:54 pm
Location: France

Re: BrickBreaker

Postby ripper121 » Sun Apr 20, 2014 12:05 pm

Update:
- Level (more rows of bricks and faster gameplay)
- Score
- Animations
User avatar
ripper121
 
Posts: 224
Joined: Fri Apr 04, 2014 2:02 pm
Location: Germany

Re: BrickBreaker

Postby adekto » Sun Apr 20, 2014 12:09 pm

why arent u using the gamebuino lib?
User avatar
adekto
 
Posts: 448
Joined: Tue Feb 25, 2014 9:47 pm
Location: belgium

Re: BrickBreaker

Postby ripper121 » Sun Apr 20, 2014 12:15 pm

It don´t work after change the settings.c (because of the button matrix and other pin settings) .
So before i test a hour i have write my own ^^.
User avatar
ripper121
 
Posts: 224
Joined: Fri Apr 04, 2014 2:02 pm
Location: Germany

Re: Breakout

Postby ripper121 » Wed May 21, 2014 12:58 pm

UPDATE!
Show at the first Post.
Feel free to edit the source and make the game better looking ;).
I hope i made good comments to understand the code.
User avatar
ripper121
 
Posts: 224
Joined: Fri Apr 04, 2014 2:02 pm
Location: Germany

Re: Breakout

Postby rotyler » Thu May 22, 2014 3:12 pm

This is awesome! I've always loved breakout and similar games. The only thing this needs is a level system. :D
User avatar
rotyler
 
Posts: 22
Joined: Mon Apr 28, 2014 12:24 am

Re: Breakout

Postby ripper121 » Thu May 22, 2014 7:04 pm

It have a level system every level one line more xD
User avatar
ripper121
 
Posts: 224
Joined: Fri Apr 04, 2014 2:02 pm
Location: Germany

Re: Breakout

Postby ripper121 » Fri May 23, 2014 11:32 am

Update:
- Animation
- Paddle (if the ball hides the paddle on the left it goes to left and if it hits the right it go to right)
- some bugfixes
User avatar
ripper121
 
Posts: 224
Joined: Fri Apr 04, 2014 2:02 pm
Location: Germany


Return to Project Guidance & Game development

Who is online

Users browsing this forum: No registered users and 105 guests

cron