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.