module; #include export module Steve; import GameObject; import Input; export struct Steve : GameObject { static constexpr const float ground_height = 50; static constexpr const float y_pos = 100; float a, v, h; bool jumping = false; float time = 0.0f; Rect IdleRect = { 76, 2, 164, 96 }; Rect NormalRect = { 1678, 2, 1766, 96 }; Rect CloseEyeRect = { 1766, 2, 1854, 96 }; Rect RightRect = { 1854, 2, 1942, 96 }; Rect LeftRect = { 1942, 2, 2030, 96 }; Rect BigEyeRect = { 2030, 2, 2118, 96 }; Rect DeadRect = { 2122, 2, 2202, 96 }; Rect CrawlingRightRect = { 2203, 2, 2321, 96 }; Rect CrawlingLeftRect = { 2321, 2, 2439, 96 }; enum Status { Idle, Running, Jumping, Freefall, Crawling, Dead } status; virtual void OnStartUp() override { imge = Texture::LoadFromFile(L"steve.png"); imge.rect = IdleRect; Posi = { y_pos, ground_height }; Anch = { 0.5f,0 }; Size = { 88, 94 }; a = v = h = 0.0f; } virtual void OnCleanUp() override { imge.bitmap = nullptr; } virtual void OnUpdate(float delta) override { time += delta; switch (status) { case Steve::Idle: if (KeyBoard::GetKey(VK_SPACE)) status = Running; imge.rect = IdleRect; break; case Steve::Running: if (KeyBoard::GetKey(VK_SPACE)) { status = Jumping; break; } imge.rect = (int)(time / 0.1) % 2 ? LeftRect : RightRect; break; case Steve::Jumping: imge.rect = NormalRect; 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: break; case Steve::Dead: break; default: break; } } virtual void OnLaterUpdate(float delta) override { } };