commit 8a2aa9af35102225421a60132735a0c0414c9f39
parent 529f1754ff15880c8e668f02d0b7144d37fabeba
Author: Matsuda Kenji <info@mtkn.jp>
Date: Thu, 22 Dec 2022 13:46:37 +0900
add input processing
Diffstat:
M | ex2/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();