commit bd001b1da3f21f46f51f06f5093312bad91932d4
parent 0587a7dce380a0b53b057b3b4ceda7a1e66406ac
Author: averagecoder <averagecoder@noreply.codeberg.org>
Date: Mon, 24 Aug 2026 17:34:57 +0300
feat: add jump
Diffstat:
| M | src/render.c | | | 65 | ++++++++++++++++++++++++++++++++++------------------------------- |
1 file changed, 34 insertions(+), 31 deletions(-)
diff --git a/src/render.c b/src/render.c
@@ -92,8 +92,8 @@ struct sys_gfx {
int in_chat, chat_len;
char chat_buf[128];
int menu_open;
- KeyCode key_w, key_a, key_s, key_d, key_t, key_esc;
- KeyCode key_up, key_down, key_left, key_right;
+ KeyCode key_w, key_a, key_s, key_d, key_t,
+ key_esc, key_up, key_down, key_left, key_right, key_space;
XIC ic;
XFontSet font_set;
};
@@ -2619,6 +2619,8 @@ main(int argc, char *argv[])
m_dy = 0;
while (XPending(g.dpy)) {
+ KeySym sym;
+
XNextEvent(g.dpy, &sa_event);
if (XFilterEvent(&sa_event, None)) {
continue;
@@ -2641,7 +2643,9 @@ main(int argc, char *argv[])
}
if (sa_event.type == KeyPress) {
code = sa_event.xkey.keycode;
- if (code == g.key_esc) {
+ sym = XLookupKeysym(&sa_event.xkey, 0);
+
+ if (code == g.key_esc || sym == XK_Escape) {
if (g.in_chat) {
g.in_chat = 0;
XGrabPointer(g.dpy, g.win, True,
@@ -2663,7 +2667,6 @@ main(int argc, char *argv[])
}
if (g.in_chat) {
char str[32];
- KeySym sym;
Status status;
int n = 0;
@@ -2713,11 +2716,12 @@ main(int argc, char *argv[])
g.chat_buf[g.chat_len] = '\0';
}
} else if (!g.menu_open) {
- if (code == g.key_w) g.keys['w'] = 1;
- else if (code == g.key_a) g.keys['a'] = 1;
- else if (code == g.key_s) g.keys['s'] = 1;
- else if (code == g.key_d) g.keys['d'] = 1;
- else if (code == g.key_t) {
+ if (code == g.key_w || sym == XK_w || sym == XK_W) g.keys['w'] = 1;
+ else if (code == g.key_a || sym == XK_a || sym == XK_A) g.keys['a'] = 1;
+ else if (code == g.key_s || sym == XK_s || sym == XK_S) g.keys['s'] = 1;
+ else if (code == g.key_d || sym == XK_d || sym == XK_D) g.keys['d'] = 1;
+ else if (code == g.key_space || sym == XK_space) g.keys[' '] = 1;
+ else if (code == g.key_t || sym == XK_t || sym == XK_T) {
g.in_chat = 1;
g.chat_len = 0;
g.chat_buf[0] = '\0';
@@ -2727,10 +2731,13 @@ main(int argc, char *argv[])
}
if (sa_event.type == KeyRelease && !g.menu_open) {
code = sa_event.xkey.keycode;
- if (code == g.key_w) g.keys['w'] = 0;
- else if (code == g.key_a) g.keys['a'] = 0;
- else if (code == g.key_s) g.keys['s'] = 0;
- else if (code == g.key_d) g.keys['d'] = 0;
+ sym = XLookupKeysym(&sa_event.xkey, 0);
+
+ if (code == g.key_w || sym == XK_w || sym == XK_W) g.keys['w'] = 0;
+ else if (code == g.key_a || sym == XK_a || sym == XK_A) g.keys['a'] = 0;
+ else if (code == g.key_s || sym == XK_s || sym == XK_S) g.keys['s'] = 0;
+ else if (code == g.key_d || sym == XK_d || sym == XK_D) g.keys['d'] = 0;
+ else if (code == g.key_space || sym == XK_space) g.keys[' '] = 0;
}
}
@@ -2785,11 +2792,6 @@ main(int argc, char *argv[])
if (g.keys['s']) move_forward -= 1.0f;
if (g.keys['d']) move_strafe += 1.0f;
if (g.keys['a']) move_strafe -= 1.0f;
-
- if (g.keys[' '] && is_grounded) {
- player_vy = JUMP_FORCE;
- is_grounded = 0;
- }
}
move_x = sinf(cam_yaw) * move_forward + cosf(cam_yaw) * move_strafe;
@@ -2807,20 +2809,21 @@ main(int argc, char *argv[])
ground_y = get_ground_height(player_x, player_z, player_y);
- if (is_grounded) {
- if (ground_y > -900.0f) {
- float diff = player_y - ground_y;
-
- if (diff <= STEP_SNAP_DOWN && diff >= -0.5f) {
- player_y = ground_y;
- player_vy = 0.0f;
- } else if (diff > STEP_SNAP_DOWN) {
- is_grounded = 0;
- }
- } else {
- is_grounded = 0;
- }
+ if (ground_y > -900.0f && player_y <= ground_y + 0.1f && player_vy <= 0.0f) {
+ player_y = ground_y;
+ player_vy = 0.0f;
+ is_grounded = 1;
} else {
+ is_grounded = 0;
+ }
+
+ if (g.keys[' '] && is_grounded && !g.in_chat && !g.menu_open) {
+ player_vy = JUMP_FORCE;
+ player_y += 0.05f;
+ is_grounded = 0;
+ }
+
+ if (!is_grounded) {
player_vy -= GRAVITY * dt;
if (player_vy < -TERMINAL_VEL) {
player_vy = -TERMINAL_VEL;