git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

gbdk-lib/examples/cross-platform/pong/src/pong.c

      1 #include <gbdk/platform.h>
      2 #include <gbdk/console.h>
      3 
      4 #include <stdint.h>
      5 #include <stdio.h>
      6 
      7 uint8_t sprite_data[] = {
      8     0x3C,0x3C,0x42,0x7E,0x99,0xFF,0xA9,0xFF,0x89,0xFF,0x89,0xFF,0x42,0x7E,0x3C,0x3C,
      9     0x3C,0x3C,0x42,0x7E,0xB9,0xFF,0x89,0xFF,0x91,0xFF,0xB9,0xFF,0x42,0x7E,0x3C,0x3C,
     10     0x3C,0x3C,0x42,0x7E,0x99,0xFF,0x89,0xFF,0x99,0xFF,0x89,0xFF,0x5A,0x7E,0x3C,0x3C,
     11     0x3C,0x3C,0x42,0x7E,0xA9,0xFF,0xA9,0xFF,0xB9,0xFF,0x89,0xFF,0x42,0x7E,0x3C,0x3C
     12 
     13 };
     14 
     15 // initializes sprites for pad. every pad uses 3 sprites which id's are aligned by 4
     16 void init_pad(uint8_t n) {
     17     set_sprite_tile(n << 2, n);
     18     set_sprite_tile((n << 2) + 1, n);
     19     set_sprite_tile((n << 2) + 2, n);
     20 }
     21 
     22 // inline function for moving pads; code of this function will be inlined with the code of main()
     23 inline void draw_pad(uint8_t n, uint8_t x, uint8_t y) {
     24     move_sprite(n << 2, x, y);
     25     move_sprite((n << 2) + 1, x, y + 8);
     26     move_sprite((n << 2) + 2, x, y + 16);
     27 }
     28 
     29 joypads_t joypads;
     30 
     31 // absolute Y coordinates of player 1 & 2
     32 uint8_t player1, player2;
     33 uint16_t player1_score, player2_score;
     34 
     35 // player constraints
     36 #define YMIN 28
     37 #define YMAX 100
     38 #define PLAYER1_X DEVICE_SPRITE_PX_OFFSET_X
     39 #define PLAYER2_X (uint8_t)(DEVICE_SPRITE_PX_OFFSET_X + DEVICE_SCREEN_PX_WIDTH - 8)
     40 
     41 // coordinates and speeds of ball
     42 uint8_t ballX, ballY;
     43 int8_t spd_ballX, spd_ballY;
     44 
     45 #define INITBALLX 80 + 4 
     46 #define INITBALLY 64 + 8
     47 
     48 const unsigned char HUD[] = " p1: %d   p2: %d";
     49 
     50 // main funxction
     51 void main(void) {
     52     // init palettes
     53 //    BGP_REG = OBP0_REG = OBP1_REG = 0xE4;
     54 
     55     // load tile data into VRAM
     56     set_sprite_data(0, 4, sprite_data);
     57     
     58     // init pad sprites
     59     init_pad(0);
     60     init_pad(1);
     61     
     62     // init ball sprite
     63     set_sprite_tile(3, 2);
     64 
     65     // show bkg and sprites
     66     SHOW_BKG; SHOW_SPRITES;
     67 
     68     // init 2 joypads
     69     if (joypad_init(2, &joypads) != 2) {
     70         printf("Device must support\nat least two joypads");
     71         return;
     72     }
     73  
     74     // init players
     75     player1 = 64, player2 = 64;
     76     player1_score = player2_score = 0;
     77     
     78     // draw score
     79     printf(HUD, player1_score, player2_score);
     80     
     81     // init ball
     82     ballX = INITBALLX, ballY = INITBALLY;
     83     spd_ballX = 1, spd_ballY = 1;
     84     
     85     while(1) {
     86         // poll joypads
     87         joypad_ex(&joypads);
     88         
     89         // player 1
     90         if (joypads.joy0 & J_UP) {
     91             player1 -= 2;
     92             if (player1 < YMIN) player1 = YMIN;
     93         } else if (joypads.joy0 & J_DOWN) {
     94             player1 += 2;
     95             if (player1 > YMAX) player1 = YMAX;            
     96         }
     97         draw_pad(0, PLAYER1_X, player1);
     98         
     99         // player 2
    100         if (joypads.joy1 & J_UP) {
    101             player2 -= 2;
    102             if (player2 < YMIN) player2 = YMIN;
    103         } else if (joypads.joy1 & J_DOWN) {
    104             player2 += 2;
    105             if (player2 > YMAX) player2 = YMAX;            
    106         }
    107         draw_pad(1, PLAYER2_X, player2);
    108 
    109         // move ball
    110         ballX += spd_ballX, ballY += spd_ballY;
    111         // check bounce from limits
    112         if ((ballY < YMIN) || (ballY > (YMAX + 24))) {
    113             spd_ballY = -spd_ballY; 
    114         }
    115         // check bounce from bats
    116         if (ballX < (PLAYER1_X + 8)) {
    117             if ((ballY > player1) && (ballY < (player1 + 24)) && (spd_ballX < 0)) 
    118                 spd_ballX = -spd_ballX;
    119         } else if (ballX > (PLAYER2_X - 8)) {
    120             if ((ballY > player2) && (ballY < (player2 + 24)) && (spd_ballX > 0)) 
    121                 spd_ballX = -spd_ballX;
    122         }
    123         // check player1 or 2 wins, update scores, start from center
    124         if (ballX <= PLAYER1_X) {
    125             // player2 wins
    126             ballX = INITBALLX, ballY = INITBALLY;
    127             spd_ballX = -spd_ballX;
    128             player2_score++;
    129             gotoxy(0, 0); printf(HUD, player1_score, player2_score);
    130         } else if (ballX > PLAYER2_X) {
    131             // player1 wins
    132             ballX = INITBALLX, ballY = INITBALLY;
    133             spd_ballX = -spd_ballX;
    134             player1_score++;
    135             gotoxy(0, 0); printf(HUD, player1_score, player2_score);
    136         }
    137         // move ball sprite
    138         move_sprite(3, ballX, ballY);
    139 
    140         // wait for VBlank to slow down everything
    141         vsync();
    142     }
    143 }

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.