#include "../graphics/Canvas.h"
#include "../graphics/Color.h"
+#include "../world/Character.h"
#include "../world/Entity.h"
#include "../world/Tileset.h"
#include "../world/World.h"
: canvas(c)
, world(w)
, tiles(t)
-, focus(Vector<float>(5, 5), 2)
-, cam(c.Size(), focus.Pos())
+, ctrl()
+, focus(5, 5)
+, target(focus, 2)
+, cam(c.Size(), focus)
, last(SDL_GetTicks())
, running(false)
, paused(false) {
}
+void Application::Control(Entity &e) {
+ ctrl.Control(e);
+}
+
+void Application::Relinquish() {
+ ctrl.Relinquish();
+}
+
+
void Application::Run() {
running = true;
while (running) {
void Application::OnKeyDown(const SDL_KeyboardEvent &e) {
switch (e.keysym.sym) {
- case SDLK_UP:
- focus.MoveUp();
+ case SDLK_w:
+ target.MoveUp();
break;
- case SDLK_DOWN:
- focus.MoveDown();
+ case SDLK_s:
+ target.MoveDown();
break;
- case SDLK_LEFT:
- focus.MoveLeft();
+ case SDLK_a:
+ ctrl.MoveLeft();
+ target.MoveLeft();
break;
- case SDLK_RIGHT:
- focus.MoveRight();
+ case SDLK_d:
+ ctrl.MoveRight();
+ target.MoveRight();
+ break;
+ case SDLK_SPACE:
+ ctrl.StartJump();
break;
case SDLK_p:
paused = !paused;
void Application::OnKeyUp(const SDL_KeyboardEvent &e) {
switch (e.keysym.sym) {
- case SDLK_UP:
- focus.StopUp();
+ case SDLK_w:
+ target.StopUp();
+ break;
+ case SDLK_s:
+ target.StopDown();
break;
- case SDLK_DOWN:
- focus.StopDown();
+ case SDLK_a:
+ ctrl.StopLeft();
+ target.StopLeft();
break;
- case SDLK_LEFT:
- focus.StopLeft();
+ case SDLK_d:
+ ctrl.StopRight();
+ target.StopRight();
break;
- case SDLK_RIGHT:
- focus.StopRight();
+ case SDLK_SPACE:
+ ctrl.StopJump();
break;
default:
break;
void Application::Update(int dt) {
const float delta = dt / 1e3;
+ for (int i = 0; i < dt; ++i) {
+ ctrl.Update(1e-3);
+ world.Update(1e-3);
+ }
+ target.Update(delta);
+ focus = ctrl.Controlling()
+ ? ctrl.Controlled().vbox.Center()
+ : target.Pos();
cam.Update(delta);
- world.Update(dt);
- focus.Update(delta);
+
+ // testing arm rotation
+ //dynamic_cast<Character *>(*world.Entities().begin())->armAngle -= 3 * delta;
}
void Application::RenderBackground() {
constexpr Color background(0x00, 0x00, 0x00);
+ constexpr Color outlineColor(0x00, 0x00, 0xFA);
canvas.SetColor(background);
canvas.Fill();
+
+ canvas.SetColor(outlineColor);
+ canvas.Grid(cam.ToScreen(Vector<int>(0, 0)), cam.ToScale(world.Size()), cam.ToScale(world.TileSize()));
}
void Application::RenderWorld() {
}
void Application::RenderEntities() {
- constexpr Color entityColor(0x00, 0xFA, 0x00);
- canvas.SetColor(entityColor);
-
- for (const Entity &e : world.Entities()) {
- const Vector<float> pos(e.Bounds().Left(), e.Bounds().Top());
- const Vector<float> size(e.Bounds().Size());
- canvas.OutlineRect(cam.ToScreen(pos), cam.ToScale(size));
+ constexpr Color boundsColor(0xFA, 0x00, 0x00);
+ constexpr Color vboxColor(0xFA, 0xFA, 0x00);
+ constexpr Color hboxColor(0x00, 0xFA, 0x00);
+ constexpr Color dotColor(0x00, 0xFA, 0xFA);
+
+ for (const Entity *e : world.Entities()) {
+ canvas.SetColor(boundsColor);
+ canvas.OutlineRect(
+ cam.ToScreen(e->bounds.LeftTop()),
+ cam.ToScale(e->bounds.Size())
+ );
+ if (const Character *c = dynamic_cast<const Character *>(e)) {
+ if (c->orient == Entity::LOOKS_LEFT) {
+ canvas.OutlineRectRot(
+ Rect<float>(
+ cam.ToScreen(c->bounds.LeftTop() + c->arm.LeftTop()),
+ cam.ToScale(c->arm.Size())
+ ),
+ cam.ToScreen(c->bounds.LeftTop() + c->armOrigin),
+ c->armAngle
+ );
+ //canvas.SetColor(dotColor);
+ //canvas.Cross(cam.ToScreen(c->bounds.LeftTop() + c->armOrigin), 5);
+ } else {
+ canvas.OutlineRectRot(
+ Rect<float>(
+ cam.ToScreen(c->bounds.RightTop() + MirrorY(c->arm.RightTop())),
+ cam.ToScale(c->arm.Size())
+ ),
+ cam.ToScreen(c->bounds.RightTop() + MirrorY(c->armOrigin)),
+ -c->armAngle
+ );
+ //canvas.SetColor(dotColor);
+ //canvas.Cross(cam.ToScreen(c->bounds.RightTop() + MirrorY(c->armOrigin)), 5);
+ }
+ }
+ canvas.SetColor(vboxColor);
+ canvas.OutlineRect(
+ cam.ToScreen(e->vbox.LeftTop()),
+ cam.ToScale(e->vbox.Size())
+ );
+ canvas.SetColor(hboxColor);
+ canvas.OutlineRect(
+ cam.ToScreen(e->hbox.LeftTop()),
+ cam.ToScale(e->hbox.Size())
+ );
}
}
void Application::RenderUI() {
- constexpr Color outlineColor(0x00, 0x00, 0xFA);
- constexpr Color focusColor(0xFA, 0xFA, 0x00);
-
- canvas.SetColor(outlineColor);
- canvas.Grid(cam.ToScreen(Vector<int>(0, 0)), cam.ToScale(world.Size()), cam.ToScale(Vector<float>(1, 1)));
+ constexpr Color targetColor(0xFA, 0xFA, 0x00);
- canvas.SetColor(focusColor);
- canvas.Cross(cam.ToScreen(focus.Pos()), 15);
+ canvas.SetColor(targetColor);
+ canvas.Cross(cam.ToScreen(target.Pos()), 15);
}
}