commit c2d31b1964cdc6f691c9fa31f7f40fae79de4183
parent 2955b2015a96d34d2d51760cf9843628dda3e984
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sun, 18 Dec 2022 10:08:41 +0900
refactor
Diffstat:
M | main.c | | | 159 | ++++++++++++++++++++++++++++++++++++++++--------------------------------------- |
1 file changed, 80 insertions(+), 79 deletions(-)
diff --git a/main.c b/main.c
@@ -43,12 +43,13 @@ enum Next_Menu {
int next_menu = Start_Menu;
-
/* function prototypes */
void setup(void);
void start_menu(void);
void game_init(void);
void game_play(void);
+void square_handle_collision(void);
+void handle_inputs(void);
void end_menu(void);
void next_tick(float);
void cleanup(void);
@@ -91,6 +92,7 @@ start_menu(void)
char *menu_char_s = "press <space> to start.";
XClearArea(display, window, 0, 0, win_width, win_height, False);
+
XDrawString(display, window, fgc,
win_width/2 - strlen(menu_char_q)/2, win_height/2,
menu_char_q, strlen(menu_char_q));
@@ -146,74 +148,14 @@ void
game_play(void)
{
long t0, t1, dt;
- long t2; // for frame count
struct timespec ts;
game_init();
clock_gettime(CLOCK_MONOTONIC, &ts);
- t0 = t2 = ts.tv_nsec;
+ t0 = ts.tv_nsec;
while (next_menu == Game_Play){
- while (XPending(display) > 0) {
- XEvent event;
- XNextEvent(display, &event);
- switch (event.type) {
- case KeyPress: {
- switch (XLookupKeysym(&event.xkey, 0)) {
- case 'q':
- next_menu = End_Menu;
- break;
- case 'd':
- key_state[Key_D] = Key_Down;
- break;
- case 'a':
- key_state[Key_A] = Key_Down;
- break;
- case 'w':
- key_state[Key_W] = Key_Down;
- break;
- case 's':
- key_state[Key_S] = Key_Down;
- break;
- case ' ':
- key_state[Key_Space] = Key_Down;
- break;
- default:
- break;
- }
- } break;
- case KeyRelease: {
- switch (XLookupKeysym(&event.xkey, 0)) {
- case 'd':
- key_state[Key_D] = Key_Up;
- break;
- case 'a':
- key_state[Key_A] = Key_Up;
- break;
- case 'w':
- key_state[Key_W] = Key_Up;
- break;
- case 's':
- key_state[Key_S] = Key_Up;
- break;
- case ' ':
- key_state[Key_Space] = Key_Up;
- break;
- default:
- break;
- }
- } break;
- case ClientMessage: {
- if ((Atom) event.xclient.data.l[0] == wm_delete_window) {
- next_menu = Quit;
- }
- } break;
- default:
- break;
- }
- }
-
XWindowAttributes window_attributes_return;
XGetWindowAttributes(display, window, &window_attributes_return);
win_width = window_attributes_return.width;
@@ -227,7 +169,11 @@ game_play(void)
t1 = ts.tv_nsec;
dt = t1 - t0 > 0 ? t1 - t0 : t1 - t0 + 1000 * 1000 * 1000;
}
- next_tick(1.0/FPS);
+
+ obj_next_tick(&square, 1.0/FPS);
+ square_handle_collision();
+ handle_inputs();
+
clock_gettime(CLOCK_MONOTONIC, &ts);
t0 = ts.tv_nsec;
@@ -244,16 +190,78 @@ end_menu(void)
}
void
-square_handle_inputs(void)
+handle_inputs(void)
{
+ while (XPending(display) > 0) {
+ XEvent event;
+ XNextEvent(display, &event);
+ switch (event.type) {
+ case KeyPress: {
+ switch (XLookupKeysym(&event.xkey, 0)) {
+ case 'q':
+ next_menu = End_Menu;
+ break;
+ case 'd':
+ key_state[Key_D] = Key_Down;
+ break;
+ case 'a':
+ key_state[Key_A] = Key_Down;
+ break;
+ case 'w':
+ key_state[Key_W] = Key_Down;
+ break;
+ case 's':
+ key_state[Key_S] = Key_Down;
+ break;
+ case ' ':
+ key_state[Key_Space] = Key_Down;
+ break;
+ default:
+ break;
+ }
+ } break;
+ case KeyRelease: {
+ switch (XLookupKeysym(&event.xkey, 0)) {
+ case 'd':
+ key_state[Key_D] = Key_Up;
+ break;
+ case 'a':
+ key_state[Key_A] = Key_Up;
+ break;
+ case 'w':
+ key_state[Key_W] = Key_Up;
+ break;
+ case 's':
+ key_state[Key_S] = Key_Up;
+ break;
+ case ' ':
+ key_state[Key_Space] = Key_Up;
+ break;
+ default:
+ break;
+ }
+ } break;
+ case ClientMessage: {
+ if ((Atom) event.xclient.data.l[0] == wm_delete_window) {
+ next_menu = Quit;
+ }
+ } break;
+ default:
+ break;
+ }
+ }
+
+ square.vx = 0;
if (key_state[Key_D] == Key_Down)
- square.vx = 300;
+ square.vx += 300;
if (key_state[Key_A] == Key_Down)
- square.vx = -300;
+ square.vx += -300;
+
+ square.vy = 0;
if (key_state[Key_S] == Key_Down)
- square.vy = 300;
+ square.vy += 300;
if (key_state[Key_W] == Key_Down)
- square.vy = -300;
+ square.vy += -300;
}
void
@@ -261,30 +269,23 @@ square_handle_collision(void)
{
if (square.px <= 0){
square.px = 0;
- square.vx *= -0.7;
+ square.vx = 0;
}
if (win_width <= square.px + square.width){
square.px = win_width - square.width;
- square.vx *= -0.7;
+ square.vx = 0;
}
if (square.py <= 0){
square.py = 0;
- square.vy *= -0.7;
+ square.vy = 0;
}
if (win_height <= square.py + square.height){
square.py = win_height - square.height;
- square.vy *= -0.7;
+ square.vy = 0;
}
}
-void
-next_tick(float dt)
-{
- obj_next_tick(&square, dt);
- square_handle_collision();
- square_handle_inputs();
-}
void
cleanup(void)