From 1f8ef3dcab45bedfe0bd1e5dd8c7c6c6c2ef60ae Mon Sep 17 00:00:00 2001 From: "K. Lange" Date: Wed, 9 May 2018 19:43:15 +0900 Subject: [PATCH] Add pong --- apps/pong.c | 308 ++++++++++++++++++++++++++++ base/usr/share/pong/ball.bmp | Bin 0 -> 10138 bytes base/usr/share/pong/paddle-blue.bmp | Bin 0 -> 60138 bytes base/usr/share/pong/paddle-red.bmp | Bin 0 -> 60138 bytes 4 files changed, 308 insertions(+) create mode 100644 apps/pong.c create mode 100644 base/usr/share/pong/ball.bmp create mode 100644 base/usr/share/pong/paddle-blue.bmp create mode 100644 base/usr/share/pong/paddle-red.bmp diff --git a/apps/pong.c b/apps/pong.c new file mode 100644 index 00000000..e823bb26 --- /dev/null +++ b/apps/pong.c @@ -0,0 +1,308 @@ +/* This file is part of ToaruOS and is released under the terms + * of the NCSA / University of Illinois License - see LICENSE.md + * Copyright (C) 2015 Kevin Lange + * + * Window Manager Pong + * + * Play pong where the paddles and ball are all windows. + * Use the WM bindings to drag the left paddle to play. + * Press `q` to quit. + * + * Rendering updates are all done by the compositor, while the game + * only renders to the windows once at start up. + * + * Window movement tracking keeps the game logic aware of the paddle + * position, and window moves for the ball and other paddle keep + * things in the right place visually. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define GAME_PATH "/usr/share/pong" + +#define PADDLE_WIDTH 50 +#define PADDLE_HEIGHT 300 +#define BALL_SIZE 50 + +static yutani_t * yctx; +static int spkr = 0; + +struct object { + double x; + double y; + int width; + int height; + double vel_x; + double vel_y; + sprite_t sprite; +}; + +static yutani_window_t * paddle_left; +static yutani_window_t * paddle_right; +static yutani_window_t * ball_win; + +static struct object left; +static struct object right; +static struct object ball; + +static gfx_context_t * paddle_left_ctx; +static gfx_context_t * paddle_right_ctx; +static gfx_context_t * ball_ctx; + +static int should_exit = 0; + +static int left_score = 0; +static int right_score = 0; + +struct spkr { + int length; + int frequency; +}; + +static void note(int frequency) { + struct spkr s = { + .length = 2, + .frequency = frequency, + }; + + write(spkr, &s, sizeof(s)); +} + + +static uint32_t current_time() { + static uint32_t start_time = 0; + static uint32_t start_subtime = 0; + + struct timeval t; + gettimeofday(&t, NULL); + + if (!start_time) { + start_time = t.tv_sec; + start_subtime = t.tv_usec; + } + + uint32_t sec_diff = t.tv_sec - start_time; + uint32_t usec_diff = t.tv_usec - start_subtime; + + if (t.tv_usec < (int)start_subtime) { + sec_diff -= 1; + usec_diff = (1000000 + t.tv_usec) - start_subtime; + } + + return (uint32_t)(sec_diff * 1000 + usec_diff / 1000); +} + +static int colliding(struct object * a, struct object * b) { + if (a->x >= b->x + b->width) return 0; + if (a->y >= b->y + b->height) return 0; + if (b->x >= a->x + a->width) return 0; + if (b->y >= a->y + a->height) return 0; + return 1; +} + + +void redraw(void) { + draw_fill(paddle_left_ctx, rgba(0,0,0,0)); + draw_fill(paddle_right_ctx, rgba(0,0,0,0)); + draw_fill(ball_ctx, rgba(0,0,0,0)); + + draw_sprite(paddle_left_ctx, &left.sprite, 0, 0); + draw_sprite(paddle_right_ctx, &right.sprite, 0, 0); + draw_sprite(ball_ctx, &ball.sprite, 0, 0); + + yutani_flip(yctx, paddle_left); + yutani_flip(yctx, paddle_right); + yutani_flip(yctx, ball_win); +} + +void update_left(void) { + yutani_window_move(yctx, paddle_left, left.x, left.y); +} +void update_right(void) { + yutani_window_move(yctx, paddle_right, right.x, right.y); +} +void update_ball(void) { + yutani_window_move(yctx, ball_win, ball.x, ball.y); +} + +void update_stuff(void) { + + right.vel_y = (right.y + right.height / 2 < ball.y + ball.height / 2) ? 2.0 : -2.0; + right.y += right.vel_y; + update_right(); + + ball.x += ball.vel_x; + ball.y += ball.vel_y; + + if (ball.y < 0) { + ball.vel_y = -ball.vel_y; + ball.y = 0; + } + if (ball.y > yctx->display_height - ball.height) { + ball.vel_y = -ball.vel_y; + ball.y = yctx->display_height - ball.height; + } + + if (ball.x < 0) { + ball.x = yctx->display_width / 2 - ball.width / 2; + ball.y = yctx->display_height / 2 - ball.height / 2; + ball.vel_x = -10.0; + ball.vel_y = ((double)rand() / RAND_MAX) * 6.0 - 3.0; + note(10000); + right_score++; + printf("%d : %d\n", left_score, right_score); + } + + if (ball.x > yctx->display_width - ball.width ) { + ball.x = yctx->display_width / 2 - ball.width / 2; + ball.y = yctx->display_height / 2 - ball.height / 2; + ball.vel_x = 10.0; + ball.vel_y = ((double)rand() / RAND_MAX) * 6.0 - 3.0; + note(17000); + left_score++; + printf("%d : %d\n", left_score, right_score); + } + + if (colliding(&ball, &left)) { + ball.x = left.x + left.width + 2; + ball.vel_x = (abs(ball.vel_x) < 8.0) ? -ball.vel_x * 1.05 : -ball.vel_x; + + double intersect = ((ball.y + ball.height/2) - (left.y)) / ((double)left.height) - 0.5; + ball.vel_y = intersect * 8.0; + note(15680); + } + + if (colliding(&ball, &right)) { + ball.x = right.x - ball.width - 2; + ball.vel_x = (abs(ball.vel_x) < 8.0) ? -ball.vel_x * 1.05 : -ball.vel_x; + + double intersect = ((ball.y + ball.height/2) - (right.y)) / ((double)right.height/2.0); + ball.vel_y = intersect * 3.0; + note(11747); + } + + update_ball(); +} + +int main (int argc, char ** argv) { + + yctx = yutani_init(); + + left.width = PADDLE_WIDTH; + left.height = PADDLE_HEIGHT; + + right.width = PADDLE_WIDTH; + right.height = PADDLE_HEIGHT; + + ball.width = BALL_SIZE; + ball.height = BALL_SIZE; + + ball.x = yctx->display_width / 2 - ball.width / 2; + ball.y = yctx->display_height / 2 - ball.height / 2; + + left.x = 10; + left.y = yctx->display_height / 2 - left.height / 2; + + right.x = yctx->display_width - right.width - 10; + right.y = yctx->display_height / 2 - right.height / 2; + + paddle_left = yutani_window_create(yctx, PADDLE_WIDTH, PADDLE_HEIGHT); + paddle_right = yutani_window_create(yctx, PADDLE_WIDTH, PADDLE_HEIGHT); + ball_win = yutani_window_create(yctx, BALL_SIZE, BALL_SIZE); + + paddle_left_ctx = init_graphics_yutani(paddle_left); + paddle_right_ctx = init_graphics_yutani(paddle_right); + ball_ctx = init_graphics_yutani(ball_win); + + srand(time(NULL)); + + ball.vel_y = ((double)rand() / RAND_MAX) * 6.0 - 3.0; + ball.vel_x = -10.0; + + fprintf(stderr, "Loading sprites...\n"); + load_sprite(&left.sprite, GAME_PATH "/paddle-red.bmp"); + left.sprite.alpha = ALPHA_EMBEDDED; + load_sprite(&right.sprite,GAME_PATH "/paddle-blue.bmp"); + right.sprite.alpha = ALPHA_EMBEDDED; + load_sprite(&ball.sprite, GAME_PATH "/ball.bmp"); + ball.sprite.alpha = ALPHA_EMBEDDED; + + redraw(); + update_left(); + update_right(); + update_ball(); + + uint32_t last_tick = current_time(); + + spkr = open("/dev/spkr", O_WRONLY); + + while (!should_exit) { + uint32_t t = current_time(); + if (t > last_tick + 10) { + last_tick += 10; + update_stuff(); + } + yutani_msg_t * m = yutani_poll_async(yctx); + if (m) { + switch (m->type) { + case YUTANI_MSG_KEY_EVENT: + { + struct yutani_msg_key_event * ke = (void*)m->data; + + if (ke->event.key == 'q' && ke->event.action == KEY_ACTION_DOWN) { + should_exit = 1; + } + } + break; + case YUTANI_MSG_WINDOW_MOVE: + { + struct yutani_msg_window_move * wm = (void*)m->data; + if (wm->wid == paddle_left->wid) { + /* Update paddle speed and position */ + left.y = (double)wm->y; + if (wm->x != (int)left.x) { + update_left(); + } + } + } + break; + case YUTANI_MSG_WINDOW_MOUSE_EVENT: + { + struct yutani_msg_window_mouse_event * me = (void*)m->data; + if (me->command == YUTANI_MOUSE_EVENT_DOWN && me->buttons & YUTANI_MOUSE_BUTTON_LEFT) { + if (me->wid == paddle_left->wid) { + yutani_window_drag_start(yctx, paddle_left); + } + } + } + break; + case YUTANI_MSG_SESSION_END: + should_exit = 1; + break; + default: + break; + } + free(m); + } else { + syscall_yield(); + } + } + + yutani_close(yctx, paddle_left); + yutani_close(yctx, paddle_right); + yutani_close(yctx, ball_win); + + return 0; +} diff --git a/base/usr/share/pong/ball.bmp b/base/usr/share/pong/ball.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9d9a10a768c43386898eaa808de0e6ae21782bea GIT binary patch literal 10138 zcmdto39Md46$kLIEuw4%l}M}`idaEWgG#_?j8#(=AxhjrqQ(Uf14e0r8;LQ|XozS` zOiYknpr|ZmtF#p;r9fL-p@nXMl~NE&5xQ8E()M_MbML(G`<_x?g*3je;qd0ooaKM! zEHn4sH|dzOCw9ueGxPsvBpu$;n9hNnaXH>E*O%|pQ2tu~MW-|LUuV+fDc>%f5tu+_LDhlc<_=TOGk-a*B`dn z90|6O@_Z}xZR_*l8;Sp{?YXyG<3;B^6MLQibiusuMgNEw|N5zT$;F%FrI&1u{V(}@ zADOd;2QNR#(m@xUoz&ghVw3HW;(Ru~JyPe?KKz;2V}1nxwg!Lh?f4cuj4!)%QyegL zW4!#bjWOXj8{!p(*5^;Oq0CvsgO?1S=n$vIpUk8Myky9V8(nnL zE#KHGb=Tw?EdPry{c)HQG47X54ED}_+b{Q!Z5Zrx#eUG0kH^7Rt&2BITNe|rek|U2 z_1ZY3C1Z2e@ZhaJ(NX=On+>sHvy-;l{e)>pdp~?lPFC5XXSeJx>QX-2H#srkvJLU7 z+*f=2`ouJG+GBCZHEZKd*FGADUH3@5<@&$ITha8Ea%|2T9=v48(m@xUbhE)0n{4;^ zGSYg{Bf2%6xnxhO4{G#)shdi^zb5m;p2BiyVuBCm!+-x!y#0nX@y;1*;)od!#t}1H z%CR|Xc<_=TO9x$aswFnqs=k!CH2oR2|JKL!Z2hi@Mb@+&6<_+Q5As?*$PGF3=EU;0 z=?^EqhYIc^XRVHR{o#Rl_l*6{F=3|TtpqLXemdVPVR)Jt=I!nmXJ z#rZRoPkM%WldIxPFa2_WJ^Lt6>@7@3&1$f}_vSyx`)1!ClWw^$-k23SfTYcRq(ydM1SKF~d&hYgaDQUqlK9l3#qsGs-4&l{$=IAVJk=kvbW~sHW`iv@^)Wpe7MNh`xN|o5 z)ZUo5H&-9aU8lq%&sh7Qx64;OMLo)8dBAS*A@k&;cPuM=4I{kA-+5%A{ z`6UYr8Jn|)2e0^$m21@(y4hfhO}1euF-c4%ChlVmX4q>?JOecI+1uRP+!^1)uhA!k0haPbiSFWmjd_|nn^al*3sapJOhg^bNvtNxH7TYO1fbkfZR zTWqooLy1XZf(^#@tcRT+p2@n;KzaAp7xYbne3d3rw)VSe{>+Jo1d}S-J5e<})o(+0)N{@1nD0PuNr8gGpRj$hu zdko*#?wecipZ>t?`1XT0#dlgVHpd@4c*&5ZgRb6~I4jv?8;0K8f)UpCPF&v!G=Ajs zrv9uaIJ@1i#nZj6$*DEvEG~7Cb=eyWIWJ%AHJsmEeRG_#=EnHm!?WW1kIXD&Y|a`U zyky9VXN`%PXT!O#cd-ovEHJ^=^sV&6Gjj9p!aIz{k9>Ca-07LE)<)@5c}LX;-HpUs z+?{7~S|6>kko)q+p2G|O57*uhKVCPzkg+*yc<_>`F`G*gnf2dk^=Sk6#}@ee&8u z#^$Wy!ApiL9dyx2HydoR$u2IaX{ zOa|dS13$!M5Z?RnWf0!O@ncZli}Ga<-c$1f4Z?SW>dPQ}$KlJMd{?W!^v7lNednzC z<)?b-exq_18(rU>dwtQzy5Fkmy>fK@9YFQR`QohXp8M4w-|j}o-(^%^{B(zLAM1WI zss8xs8=m)k|G$4H)9Xw1$DQBvOZT09uTMK3lOan-@AsJDc6R0O_1%4aXS}Qbj_hAC Cwzi-E literal 0 HcmV?d00001 diff --git a/base/usr/share/pong/paddle-blue.bmp b/base/usr/share/pong/paddle-blue.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a0bc3faf6fe47d0b1b189f156481412dd2c0514d GIT binary patch literal 60138 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 literal 0 HcmV?d00001 diff --git a/base/usr/share/pong/paddle-red.bmp b/base/usr/share/pong/paddle-red.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ba08e31778c88dd94701efab12a978090c97fc6d GIT binary patch literal 60138 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 x#}>z~+d=ir%`@TO{VJ!D>FLPLX&$Ywx{}1gKu literal 0 HcmV?d00001