mouse controls on pc version
authorJohn Tsiombikas <nuclear@member.fsf.org>
Fri, 7 Oct 2022 18:00:14 +0000 (21:00 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Fri, 7 Oct 2022 18:00:14 +0000 (21:00 +0300)
src/game.h
src/gamescr.c
src/pc/main.c
src/player.c

index 66928f8..858144b 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef GAME_H_
 #define GAME_H_
 
+#include <stdint.h>
+
 struct screen {
        char *name;
        int (*start)(void);
@@ -15,4 +17,8 @@ int init_screens(void);
 int change_screen(struct screen *scr);
 struct screen *find_screen(const char *name);
 
+#ifndef BUILD_GBA
+int32_t view_dtheta, view_dphi, view_zoom;
+#endif
+
 #endif /* GAME_H_ */
index 7c027dc..bad3bec 100644 (file)
@@ -143,7 +143,9 @@ static void draw(void)
        struct cell *cell;
 
        xgl_load_identity();
-       /*xgl_translate(0, 0, 0x100000);*/
+#ifndef BUILD_GBA
+       xgl_translate(0, 0, view_zoom);
+#endif
        xgl_rotate_x(player.phi);
        xgl_rotate_y(player.theta);
        xgl_translate(player.x, 0, player.y);
index df6a3f7..cf6ffec 100644 (file)
@@ -16,7 +16,8 @@ static void keydown(unsigned char key, int x, int y);
 static void keyup(unsigned char key, int x, int y);
 static void skeydown(int key, int x, int y);
 static void skeyup(int key, int x, int y);
-static int translate_special(int skey);
+static void mouse(int bn, int st, int x, int y);
+static void motion(int x, int y);
 static unsigned int next_pow2(unsigned int x);
 static void set_fullscreen(int fs);
 static void set_vsync(int vsync);
@@ -51,7 +52,7 @@ static PROC wgl_swap_interval_ext;
 int main(int argc, char **argv)
 {
        glutInit(&argc, argv);
-       glutInitWindowSize(800, 600);
+       glutInitWindowSize(960, 640);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
        glutCreateWindow("GBAjam22 PC build");
 
@@ -62,8 +63,8 @@ int main(int argc, char **argv)
        glutKeyboardUpFunc(keyup);
        glutSpecialFunc(skeydown);
        glutSpecialUpFunc(skeyup);
-
-       glutSetCursor(GLUT_CURSOR_NONE);
+       glutMouseFunc(mouse);
+       glutMotionFunc(motion);
 
        glEnable(GL_TEXTURE_2D);
        glEnable(GL_CULL_FACE);
@@ -269,6 +270,42 @@ static void skeyup(int key, int x, int y)
        }
 }
 
+static int mbstate[3];
+static int prev_x, prev_y;
+
+static void mouse(int bn, int st, int x, int y)
+{
+       int bidx = bn - GLUT_LEFT_BUTTON;
+       int press = st == GLUT_DOWN ? 1 : 0;
+
+       if(bidx < 3) {
+               mbstate[bidx] = press;
+       }
+       prev_x = x;
+       prev_y = y;
+}
+
+static void motion(int x, int y)
+{
+       int dx, dy;
+
+       dx = x - prev_x;
+       dy = y - prev_y;
+       prev_x = x;
+       prev_y = y;
+
+       if(!(dx | dy)) return;
+
+       if(mbstate[0]) {
+               view_dtheta -= dx * 0x100;
+               view_dphi -= dy * 0x100;
+       }
+       if(mbstate[2]) {
+               view_zoom += dy * 0x100;
+               if(view_zoom < 0) view_zoom = 0;
+       }
+}
+
 static unsigned int next_pow2(unsigned int x)
 {
        x--;
index 5a39077..6c97e38 100644 (file)
@@ -1,4 +1,5 @@
 #include <string.h>
+#include "game.h"
 #include "player.h"
 #include "level.h"
 #include "gbaregs.h"
@@ -15,6 +16,17 @@ void init_player(struct player *p, struct level *lvl)
 
 void player_input(struct player *p, uint16_t bnstate)
 {
+#ifndef BUILD_GBA
+       p->theta = (p->theta + view_dtheta) % X_2PI;
+       if(p->theta < 0) p->theta += X_2PI;
+       p->phi += view_dphi;
+       if(p->phi > X_HPI) p->phi = X_HPI;
+       if(p->phi < -X_HPI) p->phi = -X_HPI;
+
+       view_dtheta = 0;
+       view_dphi = 0;
+#endif
+
        if(bnstate & KEY_UP) {
                p->phi += 0x800;
                if(p->phi > X_HPI) p->phi = X_HPI;