]> gitweb.ps.run Git - npengine/commitdiff
pre double
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 30 Sep 2020 18:23:57 +0000 (20:23 +0200)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 30 Sep 2020 18:23:57 +0000 (20:23 +0200)
src/main.cpp

index 18294f44a70ffcda10de3135608d1e3579ea4c98..f6d131b075e131bae155d20c7df1a6b88c36b06b 100644 (file)
@@ -68,20 +68,40 @@ char get_block(int x, int y) {
 \r
 // Player\r
 struct Player {\r
 \r
 // Player\r
 struct Player {\r
-  int x, y;\r
+  int x_screen = -1, y_screen = -1;\r
+  double x, y, x_vel, y_vel;\r
 \r
   void clear() {\r
 \r
   void clear() {\r
-    int pos = get_pos(x, y);\r
+    if (x_screen < 0 || y_screen < 0) return;\r
+    int pos = get_pos(x_screen, y_screen);\r
     select_length(pos, 1);\r
     replace({ map[pos], 0 });\r
   }\r
   \r
   void draw() {\r
     select_length(pos, 1);\r
     replace({ map[pos], 0 });\r
   }\r
   \r
   void draw() {\r
-    int pos = get_pos(x, y);\r
+    if (collision_x(x - x_screen) || collision_y(y - y_screen)) {\r
+      x = x_screen;\r
+      y = y_screen;\r
+      return;\r
+    }\r
+    x_screen = round(x);\r
+    y_screen = round(y);\r
+    int pos = get_pos(x_screen, y_screen);\r
     select_length(pos, 1);\r
     replace({ 'Q', 0 });\r
   }\r
 \r
     select_length(pos, 1);\r
     replace({ 'Q', 0 });\r
   }\r
 \r
+  void update() {\r
+    x += x_vel;\r
+    y += y_vel;\r
+    if (!collision_y(1) && y_vel < 9)\r
+      y_vel += 1;\r
+    if (abs(x - x_screen) >= 1 || abs(x - x_screen) >= 1) {\r
+      clear();\r
+      draw();\r
+    }\r
+  }\r
+\r
   void move_to(int x, int y) {\r
     clear();\r
     this->x = x;\r
   void move_to(int x, int y) {\r
     clear();\r
     this->x = x;\r
@@ -93,12 +113,21 @@ struct Player {
     move_to(x + dx, y + dy);\r
   }\r
 \r
     move_to(x + dx, y + dy);\r
   }\r
 \r
-  bool collision(int xdir, int ydir) {\r
-    int newx = x + xdir;\r
-    int newy = y + ydir;\r
-    if (newx < 0 || newx >= WIDTH || newy < 0 || newy >= HEIGHT)\r
+  bool collision_x(int n) {\r
+    if (x + n < 0 || x + n >= WIDTH)\r
+      return true;\r
+    for (int i = 0; i != n; i += (n < 0 ? -1 : 1))\r
+      if (get_block(x_screen + i + (n < 0 ? -1 : 1), y_screen) == 'X')\r
+        return true;\r
+    return false;\r
+  }\r
+  bool collision_y(int n) {\r
+    if (y + n < 0 || y + n >= HEIGHT)\r
       return true;\r
       return true;\r
-    return get_block(newx, newy) == 'X';\r
+    for (int i = 0; i != n; i += (n < 0 ? -1 : 1))\r
+      if (get_block(x_screen, y_screen + i + (n < 0 ? -1 : 1)) == 'X')\r
+        return true;\r
+    return false;\r
   }\r
 };\r
 Player player { 0, 0 };\r
   }\r
 };\r
 Player player { 0, 0 };\r
@@ -261,12 +290,16 @@ int WinMain(HINSTANCE a0, HINSTANCE a1, LPSTR a2, int a3) {
       break;\r
     if (key_pressed(Key::Redraw))\r
       redraw();\r
       break;\r
     if (key_pressed(Key::Redraw))\r
       redraw();\r
-    if (key_down(Key::Left) && !player.collision(-1, 0))\r
+    if (key_down(Key::Left) && !player.collision_x(-1))\r
       player.move(-1, 0);\r
       player.move(-1, 0);\r
-    if (key_down(Key::Right) && !player.collision(1, 0))\r
+    if (key_down(Key::Right) && !player.collision_x(1))\r
       player.move(+1, 0);\r
       player.move(+1, 0);\r
-    if (key_pressed(Key::Jump) && player.collision(0, 1))\r
-      player.move(0, -1);\r
+    if (key_pressed(Key::Jump) && player.collision_y(1))\r
+      player.y_vel = -5;\r
+\r
+    player.update();\r
+\r
+    printf("%f %f\n", player.x, player.y);\r
 \r
     update_key_state_old();\r
   }\r
 \r
     update_key_state_old();\r
   }\r