Bouncing ball demo for the Gameduino

Dependencies:   Gameduino mbed

main.cpp

Committer:
TheChrisyd
Date:
2012-12-21
Revision:
1:620429301ada
Parent:
0:a0257f241e9e

File content as of revision 1:620429301ada:

#include "mbed.h"
#include "GD.h"
#include "shield.h"
#include "ball.h"

GDClass GD(ARD_MOSI, ARD_MISO, ARD_SCK, ARD_D9, USBTX, USBRX) ;

void setup() {
    GD.begin();

    // Background image
    GD.copy(RAM_PIC, bg_pic, sizeof(bg_pic));
    GD.copy(RAM_CHR, bg_chr, sizeof(bg_chr));
    GD.copy(RAM_PAL, bg_pal, sizeof(bg_pal));

    // Sprite graphics
    GD.uncompress(RAM_SPRIMG, ball);

    // Palettes 0 and 1 are for the ball itself,
    // and palette 2 is the shadow.  Set it to
    // all gray.
    int i;
    for (i = 0; i < 256; i++)
        GD.wr16(RAM_SPRPAL + (2 * (512 + i)), RGB(64, 64, 64));

    // Set color 255 to transparent in all three palettes
    GD.wr16(RAM_SPRPAL + 2 * 0xff,  TRANSPARENT);
    GD.wr16(RAM_SPRPAL + 2 * 0x1ff, TRANSPARENT);
    GD.wr16(RAM_SPRPAL + 2 * 0x2ff, TRANSPARENT);
}

#define RADIUS (112 / 2) // radius of the ball, in pixels

#define YBASE (300 - RADIUS)

int main() {
    setup();
    while (1) {
        int x = 200, y = RADIUS;              // ball position
        int xv = 2, yv = 0;                   // ball velocity

        int r;                                // frame counter
        for (r = 0; ; r++) {
            GD.__wstartspr((r & 1) ? 256 : 0);  // write sprites to other frame
            draw_ball(x + 15, y + 15, 2);       // draw shadow using palette 2
            draw_ball(x, y, r & 1);             // draw ball using palette 0 or 1
            GD.__end();

            // paint the new palette
            uint16_t palette = RAM_SPRPAL + 512 * (r & 1);
            byte li;
            for (li = 0; li < 7; li++) {
                byte liv = 0x90 + 0x10 * li;      // brightness goes 0x90, 0xa0, etc
                uint16_t red = RGB(liv, 0, 0);
                uint16_t white = RGB(liv, liv, liv);
                byte i;
                for (i = 0; i < 32; i++) {        // palette cycling using 'r'
                    GD.wr16(palette, ((i + r) & 16) ? red : white);
                    palette += 2;
                }
            }

            // bounce the ball around
            x += xv;
            if ((x < RADIUS) || (x > (400 - RADIUS)))
                xv = -xv;
            y += yv;
            if ((yv > 0) && (y > YBASE)) {
                y = YBASE - (y - YBASE);          // reflect in YBASE
                yv = -yv;                         // reverse Y velocity
            }
            if (0 == (r & 3))
                yv++;                             // gravity

            // swap frames
            GD.waitvblank();
            GD.wr(SPR_PAGE, (r & 1));
        }
    }
}