xlib_playground

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit c6f41d99f974563a206a100b638fb7576c1fa7ca
parent 9c0a77eeab8dbfdbdb27c254753490b26ebed1fd
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri, 16 Dec 2022 12:02:04 +0900

add menu

Diffstat:
Mmain.c | 244++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 175 insertions(+), 69 deletions(-)

diff --git a/main.c b/main.c @@ -1,6 +1,7 @@ #include <stdio.h> #include <stdlib.h> #include <time.h> +#include <string.h> #include <X11/Xlib.h> @@ -16,7 +17,7 @@ Display *display; Window window; unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT; -GC gc; +GC gc, fgc; Atom wm_delete_window; Obj square = {100, 100, 0, 0, 0, 0, 20, 20}; int quit = 0; @@ -25,29 +26,37 @@ enum Keys { Key_S, Key_A, Key_W, - Num_Key, + Key_Space, + Num_Key, //number of keys in this enum }; enum Key_State { - Key_Down, Key_Up, + Key_Down, +}; +int key_state[Num_Key]; +enum Next_Menu { + Start_Menu, + Game_Play, + End_Menu, + Quit, }; -int key_state[Num_Key]; +int next_menu = Start_Menu; /* function prototypes */ void setup(void); +void start_menu(void); +void game_init(void); +void game_play(void); +void end_menu(void); void next_tick(void); void cleanup(void); - void setup(void) { - for(int i = 0; i < Num_Key; i++) - key_state[i] = Key_Up; - - if((display = XOpenDisplay(NULL)) == NULL){ + if ((display = XOpenDisplay(NULL)) == NULL){ fprintf(stderr, "ERROR: could not open display\n"); exit(1); } @@ -60,73 +69,91 @@ setup(void) 0); XStoreName(display, window, "UNKO"); gc = XCreateGC(display, window, 0, NULL); + fgc = XCreateGC(display, window, 0, NULL); wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False); XSetWMProtocols(display, window, &wm_delete_window, 1); - XSelectInput(display, window, KeyPressMask | KeyReleaseMask); + XSelectInput(display, window, ExposureMask|KeyPressMask|KeyReleaseMask); XSetForeground(display, gc, 0x00FF00); + XSetForeground(display, fgc, 0xFF00FF); XMapWindow(display, window); } void -next_tick(void) +start_menu(void) { - square.vx = 0; - if(key_state[Key_D] == Key_Down) - square.vx += 300; - if(key_state[Key_A] == Key_Down) - square.vx += -300; - if(key_state[Key_D] == Key_Up && key_state[Key_A] == Key_Up) - square.vx = 0; - - if(key_state[Key_W] == Key_Down && win_height <= square.py + square.height){ - square.vy = -400; - } + XEvent event; + char *menu_char_q = "press q to quit."; + char *menu_char_s = "press <space> to start."; - obj_next_tick(&square, 1.0/FPS); + 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)); + XDrawString(display, window, fgc, + win_width/2 - strlen(menu_char_s)/2, win_height/2 + 20, + menu_char_s, strlen(menu_char_s)); - if(square.px <= 0){ - square.px = 0; - } - if(win_width <= square.px + square.width){ - square.px = win_width - square.width; - } - - square.ay = 980; - if(square.py <= 0){ - square.py = 0; - square.vy = 0; - } - if(win_height <= square.py + square.height){ - square.py = win_height - square.height; - square.vy = 0; + while (next_menu == Start_Menu) { + XNextEvent(display, &event); + switch (event.type) { + case Expose: { + XDrawString(display, window, fgc, + win_width/2 - strlen(menu_char_q)/2, win_height/2, + menu_char_q, strlen(menu_char_q)); + XDrawString(display, window, fgc, + win_width/2 - strlen(menu_char_s)/2, win_height/2 + 20, + menu_char_s, strlen(menu_char_s)); + + } break; + case KeyPress: { + switch (XLookupKeysym(&event.xkey, 0)) { + case 'q': + next_menu = Quit; + break; + case ' ': + next_menu = Game_Play; + break; + default: + break; + } + } break; + case ClientMessage: { + if ((Atom) event.xclient.data.l[0] == wm_delete_window) { + next_menu = Quit; + } + } break; + default: + break; + } } } void -cleanup(void) +game_init(void) { - - XCloseDisplay(display); + square.px = 100; + square.py = 100; + square.vx = square.vy = 0; + square.ax = square.ay = 0; } -int -main(void) +void +game_play(void) { - setup(); - - while (!quit) { - while (XPending(display) > 0) { - XEvent event; - XNextEvent(display, &event); - switch (event.type) { - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'q': - quit = 1; - break; + game_init(); + 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; @@ -139,12 +166,15 @@ main(void) case 's': key_state[Key_S] = Key_Down; break; - default: + case ' ': + key_state[Key_Space] = Key_Down; break; - } - } break; - case KeyRelease: { - switch (XLookupKeysym(&event.xkey, 0)) { + default: + break; + } + } break; + case KeyRelease: { + switch (XLookupKeysym(&event.xkey, 0)) { case 'd': key_state[Key_D] = Key_Up; break; @@ -157,15 +187,22 @@ main(void) 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) { - quit = 1; - } - } 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); @@ -176,10 +213,79 @@ main(void) XClearArea(display, window, 0, 0, win_width, win_height, False); XFillRectangle(display, window, gc, square.px, square.py, square.width, square.height); + XDrawString(display, window, fgc, square.px, square.py, "player", 6); struct timespec timetosleep = {0, 1000*1000*1000/FPS}; //not accurate - nanosleep(&timetosleep, NULL); - } + nanosleep(&timetosleep, NULL); + } +} + +void +end_menu(void) +{ + next_menu = Start_Menu; +} + +void +next_tick(void) +{ + square.vx = 0; + if (key_state[Key_D] == Key_Down) + square.vx += 300; + if (key_state[Key_A] == Key_Down) + square.vx += -300; + if (key_state[Key_D] == Key_Up && key_state[Key_A] == Key_Up) + square.vx = 0; + if (key_state[Key_Space] == Key_Down && win_height <= square.py + square.height){ + square.vy = -1000; + } + + obj_next_tick(&square, 1.0/FPS); + + if (square.px <= 0){ + square.px = 0; + } + if (win_width <= square.px + square.width){ + square.px = win_width - square.width; + } + + square.ay = 980; + if (square.py <= 0){ + square.py = 0; + square.vy = 0; + } + if (win_height <= square.py + square.height){ + square.py = win_height - square.height; + square.vy = 0; + } +} + +void +cleanup(void) +{ + XCloseDisplay(display); +} + +int +main(void) +{ + setup(); + + while (next_menu != Quit){ + switch (next_menu){ + case Start_Menu: + start_menu(); + break; + case Game_Play: + game_play(); + break; + case End_Menu: + end_menu(); + break; + default: + break; + } + } cleanup(); return 0;