\r
// Player\r
struct Player {\r
- int x_screen = -1, y_screen = -1;\r
- double x, y, x_vel, y_vel;\r
+ int x, y;\r
\r
void clear() {\r
- if (x_screen < 0 || y_screen < 0) return;\r
- int pos = get_pos(x_screen, y_screen);\r
+ int pos = get_pos(x, y);\r
select_length(pos, 1);\r
replace({ map[pos], 0 });\r
}\r
\r
void draw() {\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
+ int pos = get_pos(x, y);\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
move_to(x + dx, y + dy);\r
}\r
\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
+ 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
return true;\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
+ return get_block(newx, newy) == 'X';\r
}\r
};\r
Player player { 0, 0 };\r
break;\r
if (key_pressed(Key::Redraw))\r
redraw();\r
- if (key_down(Key::Left) && !player.collision_x(-1))\r
+ if (key_down(Key::Left) && !player.collision(-1, 0))\r
player.move(-1, 0);\r
- if (key_down(Key::Right) && !player.collision_x(1))\r
+ if (key_down(Key::Right) && !player.collision(1, 0))\r
player.move(+1, 0);\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
+ if (key_pressed(Key::Jump) && player.collision(0, 1))\r
+ player.move(0, -1);\r
\r
update_key_state_old();\r
}\r