X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp%2FApplication.cpp;h=e3c6a2b878bc1bb39c4294bd632192d8ebca40df;hb=1cb5ed22d7772abe6f9893be90f26f46dbde39f7;hp=d18c757eca9141e62b18ea112844bc49eb049cc4;hpb=a1fd5c4181db1da990b6280892eb1b9f31b73871;p=space.git diff --git a/src/app/Application.cpp b/src/app/Application.cpp index d18c757..e3c6a2b 100644 --- a/src/app/Application.cpp +++ b/src/app/Application.cpp @@ -1,20 +1,23 @@ #include "Application.h" +#include "../graphics/Canvas.h" #include "../graphics/Color.h" -#include "../graphics/primitive.h" -#include "../sdl/InitScreen.h" namespace space { -Application::Application(InitScreen &s) -: screen(s) -, univ(Vector(10, 10), Vector(10, 10), Vector(10, 10), 10) +Application::Application(Canvas &c) +: canvas(c) +, univ(Vector(10, 10), Vector(10, 10), Vector(10, 10)) , focus(Vector(500, 500), 500) -, cam(800, 800, focus.Pos()) +, cam(c.Size(), focus.Pos()) +, controlled(univ.AddShip(Ship())) +, autopilot(*controlled, focus.Pos()) +, apEnabled(false) , last(SDL_GetTicks()) -, running(false) { - controlled = univ.AddEntity(Entity()); +, running(false) +, paused(false) { + } @@ -31,9 +34,11 @@ void Application::Run() { void Application::Loop(int delta) { HandleEvents(); - Update(delta); + if (!paused) { + Update(delta); + } Render(); - screen.Flip(); + canvas.Present(); } @@ -44,15 +49,20 @@ void Application::HandleEvents() { case SDL_QUIT: running = false; break; - case SDL_VIDEORESIZE: - screen.Resize(event.resize.w, event.resize.h); - cam.Resize(event.resize.w, event.resize.h); + case SDL_WINDOWEVENT: + if (event.window.event == SDL_WINDOWEVENT_RESIZED) { + cam.Resize(event.window.data1, event.window.data2); + } break; case SDL_KEYDOWN: - OnKeyDown(event.key); + if (!event.key.repeat) { + OnKeyDown(event.key); + } break; case SDL_KEYUP: - OnKeyUp(event.key); + if (!event.key.repeat) { + OnKeyUp(event.key); + } break; default: // skip event @@ -93,6 +103,12 @@ void Application::OnKeyDown(const SDL_KeyboardEvent &e) { case SDLK_x: cam.StartShrink(); break; + case SDLK_c: + apEnabled = !apEnabled; + break; + case SDLK_p: + paused = !paused; + break; default: break; } @@ -138,9 +154,15 @@ void Application::OnKeyUp(const SDL_KeyboardEvent &e) { void Application::Update(int dt) { const float delta = dt / 1e3; - controlled->acc = Vector(control * 10); + if (apEnabled) { + autopilot.Update(delta); + } else { + controlled->rotThrottle = control.x; + controlled->linThrottle = -control.y; + } cam.Update(delta); univ.Update(delta); + focus.SetSpeed(500 / cam.Zoom()); focus.Update(delta); } @@ -152,19 +174,32 @@ void Application::Render() { constexpr Color entityColor(0x00, 0xAA, 0xAA); constexpr Color focusColor(0xFA, 0xFA, 0x00); - SDL_Surface *dst = screen.Screen(); - const Vector begin = cam.ToScreen(Vector(0, 0)); - const Vector end = - cam.ToScreen((univ.size * univ.secSize * univ.areaSize)) - + Vector(1, 1); - - Fill(dst, background); - Grid2(dst, begin, end, cam.ToScale(univ.areaSize), univ.secSize, secGrid, univGrid); - Cross(dst, cam.ToScreen(focus.Pos()), 15, focusColor); - - for (const Entity &e : univ.Entities()) { - Cross(dst, cam.ToScreen((e.area * univ.areaSize) + Vector(e.pos)), 10, entityColor); + canvas.SetColor(background); + canvas.Fill(); + + canvas.Grid2( + cam.ToScreen(Vector(0, 0)), + cam.ToScale(univ.size * univ.secSize * univ.areaSize), + cam.ToScale(univ.areaSize), + univ.secSize, + secGrid, + univGrid); + + canvas.SetColor(focusColor); + canvas.Cross(cam.ToScreen(focus.Pos()), 15); + + canvas.SetColor(entityColor); + for (const Ship &s : univ.Ships()) { + const Vector direction = s.Dir(); + const Vector position = cam.ToScreen(s.pos); + const Vector nose = position + Vector(direction * 15.0f); + const Vector left = position + Vector((Rotate90(direction) * 8.0f) - (direction * 4.0f)); + const Vector right = position + Vector((Rotate270(direction) * 8.0f) - (direction * 4.0f)); + canvas.Line(position, nose); + canvas.Quad(nose, left, position, right); } + + autopilot.Render(canvas, cam); } }