commit c6f41d99f974563a206a100b638fb7576c1fa7ca
parent 9c0a77eeab8dbfdbdb27c254753490b26ebed1fd
Author: Matsuda Kenji <info@mtkn.jp>
Date: Fri, 16 Dec 2022 12:02:04 +0900
add menu
Diffstat:
M | main.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;