std::string map;\r
\r
clock_t game_clock;\r
-double dt;\r
+double frame_time = 30;\r
+\r
+int lvl = 0;\r
+\r
+// Util\r
+\r
+double get_dur(clock_t then) {\r
+ double result = (double)(clock() - then) / CLOCKS_PER_SEC;\r
+ return result * 1000;\r
+}\r
\r
// Edit\r
\r
\r
// Player\r
struct Player {\r
- int x_screen = -1, y_screen = -1;\r
- double x, y, x_vel, y_vel;\r
+ bool left = false;\r
+ int x, y;\r
+ int x_spawn, y_spawn;\r
+ int jumping = 0;\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
+ replace({ left ? '<' : '>', 0 });\r
}\r
\r
void move_to(int x, int y) {\r
clear();\r
+ if (this->x > x) left = true;\r
+ if (this->x < x) left = false;\r
this->x = x;\r
this->y = y;\r
draw();\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
+ if (get_block(x + i + (n < 0 ? -1 : 1), y) == 'X')\r
return true;\r
return false;\r
}\r
if (y + n < 0 || y + n >= 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
+ if (get_block(x, y + i + (n < 0 ? -1 : 1)) == 'X')\r
return true;\r
return false;\r
}\r
void redraw() {\r
select_all();\r
replace(map);\r
+ player.draw();\r
}\r
\r
-void load_level(int lvl) {\r
- map = read_map(lvl);\r
+void load_level(int l) {\r
+ lvl = l;\r
+ map = read_map(l);\r
redraw();\r
for (int x = 0; x < WIDTH; x++) {\r
for (int y = 0; y < HEIGHT; y++) {\r
- if (map[get_pos(x, y)] == 'S')\r
+ if (map[get_pos(x, y)] == 'S') {\r
+ player.x_spawn = x;\r
+ player.y_spawn = y;\r
player.move_to(x, y);\r
+ return;\r
+ }\r
}\r
}\r
}\r
return !key_state[(int)key];\r
}\r
\r
+// Gameplay\r
+ \r
+clock_t jump_clock = clock();\r
+int jump_height = 3;\r
+double jump_time1 = 50;\r
+double jump_time2 = 100;\r
+int text_speed = 50;\r
+\r
+void update_play(bool can_jump = true, int x_min = 0, int x_max = WIDTH - 1) {\r
+ if (key_down(Key::Left) &&\r
+ !player.collision_x(-1) &&\r
+ player.x > x_min)\r
+ player.move(-1, 0);\r
+ if (key_down(Key::Right) &&\r
+ !player.collision_x(1) &&\r
+ player.x < x_max)\r
+ player.move(+1, 0);\r
+\r
+ if (key_pressed(Key::Jump) &&\r
+ can_jump &&\r
+ player.jumping == 0 &&\r
+ !player.collision_y(-1)) {\r
+ player.jumping = 1;\r
+ player.move(0, -1);\r
+ jump_clock = clock();\r
+ }\r
+ if (player.jumping != 0) {\r
+ if (player.jumping < jump_height && get_dur(jump_clock) > jump_time1) {\r
+ if (!player.collision_y(-1)) {\r
+ player.move(0, -1);\r
+ player.jumping++;\r
+ jump_clock = clock();\r
+ } else {\r
+ player.jumping = jump_height;\r
+ }\r
+ } else if (player.jumping == jump_height && get_dur(jump_clock) > jump_time2) {\r
+ player.jumping = 0;\r
+ }\r
+ }\r
+ if (!player.jumping && !player.collision_y(1))\r
+ player.move(0, +1);\r
+\r
+ char b = get_block(player.x, player.y);\r
+ if (b == '/' || b == '\\' || b == '<' || b == '>')\r
+ player.move_to(player.x_spawn, player.y_spawn);\r
+}\r
+\r
+void print_text(int x, int y, string text, int delay) {\r
+ for (int i = 0; i < text.size(); i++) {\r
+ select_length(get_pos(x + i, y), 1);\r
+ replace(text.substr(i, 1));\r
+ Sleep(delay);\r
+ }\r
+}\r
+\r
+void intro() {\r
+ static int progress = 0;\r
+ switch (progress) {\r
+ case 0:\r
+ print_text(4, 2, "Move with left/right.", text_speed);\r
+\r
+ progress++;\r
+ break;\r
+ case 1:\r
+ update_play(false);\r
+ if (player.x == 17) {\r
+ print_text(4, 4, "Jump with up.", text_speed);\r
+ print_text(4, 6, "Stand on x.", text_speed);\r
+ progress++;\r
+ }\r
+ break;\r
+ case 2:\r
+ update_play();\r
+ if (player.x == 22) {\r
+ print_text(4, 8, "Collect ? for ???.", text_speed);\r
+ progress++;\r
+ }\r
+ break;\r
+ case 3:\r
+ update_play(true, 0, 33);\r
+ if (get_block(player.x, player.y) == '?') {\r
+ print_text(4, 10, "Avoid /\\.", text_speed);\r
+ progress++;\r
+ }\r
+ break;\r
+ case 4:\r
+ update_play();\r
+ if (player.x == 39) {\r
+ print_text(4, 14, "Finish lvl by reaching O.", text_speed);\r
+ progress++;\r
+ }\r
+ break;\r
+ case 5:\r
+ update_play();\r
+ if (get_block(player.x, player.y) == 'O') {\r
+ load_level(1);\r
+ }\r
+ break;\r
+ }\r
+}\r
+\r
+void lvl1() {\r
+ static int progress = 0;\r
+ switch (progress) {\r
+ case 0:\r
+ print_text(4, 2, "Also avoid > and <.", text_speed);\r
+ progress++;\r
+ break;\r
+ case 1:\r
+ update_play();\r
+ break;\r
+ }\r
+}\r
+\r
+void update_game() {\r
+ switch (lvl) {\r
+ case 0:\r
+ intro();\r
+ break;\r
+ case 1:\r
+ lvl1();\r
+ break;\r
+ }\r
+}\r
+\r
#ifdef CONSOLE\r
int main(int argc, char **argv) {\r
#else\r
puts("error");\r
return 1;\r
}\r
+\r
load_level(0);\r
+ \r
while (true) {\r
- dt = ((double)clock() - game_clock) / CLOCKS_PER_SEC * 1000;\r
+ //dt = ((double)clock() - game_clock) / CLOCKS_PER_SEC * 1000;\r
+ if (get_dur(game_clock) < frame_time) continue;\r
game_clock = clock();\r
update_key_state();\r
\r
break;\r
if (key_pressed(Key::Redraw))\r
redraw();\r
- if (key_down(Key::Left) && !player.collision_x(-1))\r
- player.move(-1, 0);\r
- if (key_down(Key::Right) && !player.collision_x(1))\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
+ \r
+ update_game();\r
\r
update_key_state_old();\r
}\r