xlib_playground

Xlib playground for experiments.
Log | Files | Refs

commit 8a2aa9af35102225421a60132735a0c0414c9f39
parent 529f1754ff15880c8e668f02d0b7144d37fabeba
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu, 22 Dec 2022 13:46:37 +0900

add input processing

Diffstat:
Mex2/ex2.c | 136++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 107 insertions(+), 29 deletions(-)

diff --git a/ex2/ex2.c b/ex2/ex2.c @@ -11,8 +11,23 @@ #define INIT_HEIGHT 600 #define FPS 60 +/* #define COUNT_FPS - +*/ + + +enum Keys { + Key_D, + Key_S, + Key_A, + Key_W, + Key_Space, + Num_Key, //number of keys in this enum +}; +enum Key_State { + Key_Up, + Key_Down, +}; /* variables */ Display *display; @@ -20,6 +35,12 @@ Window window; unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT; GC gc; Atom wm_delete_window; +int key_state[Num_Key]; +int quit; +float px = 200, py = 200; +float vx = 0, vy = 0; +int width = 40, height = 40; + /* function prototypes */ void setup(void); @@ -50,11 +71,80 @@ setup(void) XSelectInput(display, window, ExposureMask|KeyPressMask|KeyReleaseMask); - XSetForeground(display, gc, 0x0000FF); + XSetForeground(display, gc, 0x00FFFF); XMapWindow(display, window); } void +handle_inputs(void) +{ + XEvent event; + while (XPending(display) > 0) { + XNextEvent(display, &event); + switch (event.type) { + case KeyPress: { + switch (XLookupKeysym(&event.xkey, 0)) { + case 'q': + quit = 1; + 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; + 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; + default: + break; + } + } break; + case ClientMessage: { + if ((Atom) event.xclient.data.l[0] == wm_delete_window) { + quit = 1; + } + } break; + default: + break; + } + } + + + vx = vy = 0; + if (key_state[Key_D] == Key_Down) + vx += 300; + if (key_state[Key_A] == Key_Down) + vx += -300; + if (key_state[Key_S] == Key_Down) + vy += 300; + if (key_state[Key_W] == Key_Down) + vy += -300; + +} + +void cleanup(void) { XCloseDisplay(display); @@ -63,14 +153,11 @@ cleanup(void) int main(void) { - int px, py; - int quit; long t0, t1, dt; #ifdef COUNT_FPS int fps_count = 0; #endif struct timespec ts; - XEvent event; setup(); quit = 0; @@ -78,27 +165,7 @@ main(void) t0 = ts.tv_nsec; while (!quit){ - while(XPending(display) > 0){ - XNextEvent(display, &event); - switch (event.type){ - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)){ - case 'q': - quit = 1; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - quit = 1; - } - } break; - default: - break; - } - } + handle_inputs(); // fix fps dt = 0; @@ -120,15 +187,26 @@ main(void) clock_gettime(CLOCK_MONOTONIC, &ts); t0 = ts.tv_nsec; - px = 200 + (int) (100 * sinf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - py = 200 + (int) (100 * cosf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); + px = px + vx * dt / 1000 / 1000 / 1000; + py = py + vy * dt / 1000 / 1000 / 1000; + // bind within the window + if (px < 0) + px = 0; + if (win_width < px + width) + px = win_width - width; + if (py < 0) + py = 0; + if (win_height < py + height) + py = win_height - height; + XClearArea(display, window, 0, 0, // position win_width, win_height, // width and height False); XFillRectangle(display, window, gc, px, py, // position - 100, 100); // width and height + width, height); // width and height + } cleanup();