module; #include export module Steve; import GameObject; import Input; export struct Steve : GameObject { static constexpr const float ground_height = 50; static constexpr const float x_pos = 100; float a, v, h; bool jumping = false; float time = 0.0f; static constexpr Rect IdleRect = { 76, 2, 164, 96 }; static constexpr Rect NormalRect = { 1678, 2, 1766, 96 }; static constexpr Rect CloseEyeRect = { 1766, 2, 1854, 96 }; static constexpr Rect RightRect = { 1854, 2, 1942, 96 }; static constexpr Rect LeftRect = { 1942, 2, 2030, 96 }; static constexpr Rect BigEyeRect = { 2030, 2, 2118, 96 }; static constexpr Rect DeadRect = { 2122, 2, 2202, 96 }; static constexpr Rect CrawlingRightRect = { 2203, 36, 2321, 96 }; static constexpr Rect CrawlingLeftRect = { 2321, 36, 2439, 96 }; enum Status { Idle, Running, Jumping, Freefall, Crawling, Dead } status; virtual void OnStartUp() override { imge.rect = IdleRect; Anch = { 0.5f,0 }; Posi = { x_pos, ground_height }; Size = imge.rect.size(); a = v = h = 0.0f; } virtual void OnCleanUp() override { imge.bitmap = nullptr; } virtual void OnUpdate(float delta) override { if (isPaused) return; time += delta; switch (status) { case Steve::Idle: if (KeyBoard::GetKey(VK_SPACE)) status = Running; imge.rect = IdleRect; Size = imge.rect.size(); break; case Steve::Running: if (KeyBoard::GetKey(VK_SPACE)) { status = Jumping; break; } if (KeyBoard::GetKey(VK_DOWN)) { status = Crawling; break; } imge.rect = (int)(time / 0.1) % 2 ? LeftRect : RightRect; Size = imge.rect.size(); break; case Steve::Jumping: imge.rect = NormalRect; Size = imge.rect.size(); if ((h < 75 || KeyBoard::GetKey(VK_SPACE)) && h < 150.f) { v = 1000.f; h += v * delta; Posi.y = ground_height + h; } else { status = Freefall; } break; case Steve::Freefall: a = -8000.f; v += a * delta; if (v < -1200) v = -1200; h += v * delta; Posi.y = ground_height + h; if (Posi.y <= ground_height) { status = Running; Posi.y = ground_height; } break; case Steve::Crawling: if (KeyBoard::GetKey(VK_DOWN)) { imge.rect = (int)(time / 0.1) % 2 ? CrawlingLeftRect : CrawlingRightRect; Size = imge.rect.size(); } else { status = Running; } break; default: break; } } virtual void OnLaterUpdate(float delta) override { if (isPaused) return; } virtual void OnReset() override { imge.rect = IdleRect; status = Idle; Anch = { 0.5f,0 }; Posi = { x_pos, ground_height }; Size = imge.rect.size(); a = v = h = 0.0f; } };