From: Daniel Karbach Date: Tue, 14 Jan 2014 18:06:22 +0000 (+0100) Subject: basic entities X-Git-Url: http://git.localhorst.tv/?p=gworm.git;a=commitdiff_plain;h=3694504331ca888f2cacbcb841a83c402d26934a basic entities --- diff --git a/src/app/Application.cpp b/src/app/Application.cpp index e1ac201..d798b37 100644 --- a/src/app/Application.cpp +++ b/src/app/Application.cpp @@ -2,6 +2,7 @@ #include "../graphics/Canvas.h" #include "../graphics/Color.h" +#include "../world/Entity.h" #include "../world/World.h" #include @@ -15,7 +16,7 @@ namespace gworm { Application::Application(Canvas &c, World &w) : canvas(c) , world(w) -, focus(Vector(5, 5), 25) +, focus(Vector(250, 250), 25) , cam(c.Size(), focus.Pos()) , last(SDL_GetTicks()) , running(false) @@ -37,16 +38,28 @@ void Application::Run() { void Application::Loop(int delta) { cout << "delta: " << delta << endl << endl; + auto enter = chrono::system_clock::now(); + HandleEvents(); + auto event = chrono::system_clock::now(); + cout << " event: " << duration_cast(event - enter).count() << endl; + if (delta == 0) { SDL_Delay(1); return; } + auto update = event; if (!paused) { Update(delta); + update = chrono::system_clock::now(); + cout << " update: " << duration_cast(update - event).count() << endl; } + Render(); + auto render = chrono::system_clock::now(); + cout << " render: " << duration_cast(render - update).count() << endl; + canvas.Present(); } @@ -131,19 +144,10 @@ void Application::Update(int dt) { void Application::Render() { - auto enter = chrono::system_clock::now(); RenderBackground(); - auto background = chrono::system_clock::now(); - cout << " background: " << duration_cast(background - enter).count() << endl; RenderWorld(); - auto world = chrono::system_clock::now(); - cout << " world: " << duration_cast(world - background).count() << endl; RenderEntities(); - auto entities = chrono::system_clock::now(); - cout << " entities: " << duration_cast(entities - world).count() << endl; RenderUI(); - auto ui = chrono::system_clock::now(); - cout << " UI: " << duration_cast(ui - entities).count() << endl; } void Application::RenderBackground() { @@ -190,22 +194,33 @@ void Application::RenderWorld() { } void Application::RenderEntities() { + constexpr Color entityColor(0x00, 0xFA, 0x00); + canvas.SetColor(entityColor); + for (const Entity &e : world.Entities()) { + canvas.Cross(cam.ToScreen(e.pos), 10); + } } void Application::RenderUI() { constexpr Color focusColor(0xFA, 0xFA, 0x00); constexpr Color forceColor(0xFA, 0x00, 0x00); + constexpr Color speedColor(0x00, 0xFA, 0x00); canvas.SetColor(focusColor); canvas.Cross(cam.ToScreen(focus.Pos()), 15); - const Vector force = world.ForceAt(focus.Pos(), 1); - const Vector screenFocus = cam.ToScreen(focus.Pos()); + for (const Entity &e : world.Entities()) { + const Vector screenPos = cam.ToScreen(e.pos); + + canvas.SetColor(forceColor); + canvas.Arrow(screenPos, screenPos + Vector(e.acc * e.mass * 10.0f)); - canvas.SetColor(forceColor); - canvas.Arrow(screenFocus, screenFocus + Vector(force * 10.0f)); - cout << "force on 1kg at " << focus.Pos() << ": " << force << endl; + canvas.SetColor(speedColor); + canvas.Arrow(screenPos, screenPos + Vector(e.vel * 10.0f)); + + cout << "entity: pos " << e.pos << ", vel " << e.vel << ", acc " << e.acc << endl; + } } } diff --git a/src/gworm.cpp b/src/gworm.cpp index 5f35fd9..efd5757 100644 --- a/src/gworm.cpp +++ b/src/gworm.cpp @@ -2,6 +2,7 @@ #include "app/SDL.h" #include "graphics/Canvas.h" #include "graphics/Window.h" +#include "world/Entity.h" #include "world/World.h" using namespace gworm; @@ -47,6 +48,11 @@ int main(int argc, const char *argv[]) { World world(Vector(500, 500)); make_planet(world, Vector(250, 250), 220); + Entity e; + e.vel = Vector(-19, 19); + e.mass = 1; + world.AddEntity(e); + Application app(canv, world); app.Run(); diff --git a/src/world/Entity.cpp b/src/world/Entity.cpp new file mode 100644 index 0000000..d1cf34d --- /dev/null +++ b/src/world/Entity.cpp @@ -0,0 +1,21 @@ +#include "Entity.h" + + +namespace gworm { + +Entity::Entity() +: pos(0, 0) +, vel(0, 0) +, acc(0, 0) +, mass(1) { + +} + + +void Entity::Update(float dt) { + // euler + vel += dt * acc; + pos += dt * vel; +} + +} diff --git a/src/world/Entity.h b/src/world/Entity.h new file mode 100644 index 0000000..b8706d2 --- /dev/null +++ b/src/world/Entity.h @@ -0,0 +1,28 @@ +#ifndef GWORM_ENTITY_H_ +#define GWORM_ENTITY_H_ + +#include "../graphics/Vector.h" + + +namespace gworm { + +class Entity { + +public: + Entity(); + +public: + void Update(float dt); + +public: + Vector pos; + Vector vel; + Vector acc; + + float mass; + +}; + +} + +#endif diff --git a/src/world/World.cpp b/src/world/World.cpp index 219708e..206105b 100644 --- a/src/world/World.cpp +++ b/src/world/World.cpp @@ -15,7 +15,16 @@ World::World(Vector size) void World::Update(float dt) { + for (Entity &e : entities) { + e.acc = ForceAt(e.pos, e.mass) / e.mass; + e.Update(dt); + } +} + +Entity &World::AddEntity(const Entity &e) { + entities.emplace_back(e); + return entities.back(); } diff --git a/src/world/World.h b/src/world/World.h index 4cb5a27..f15d43b 100644 --- a/src/world/World.h +++ b/src/world/World.h @@ -1,9 +1,11 @@ #ifndef GWORM_WORLD_H_ #define GWORM_WORLD_H_ +#include "Entity.h" #include "../graphics/Color.h" #include "../graphics/Vector.h" +#include #include @@ -27,6 +29,9 @@ public: Color ColorAt(Vector pos) const { return colors[Index(pos)]; } void SetColor(Vector pos, Color c) { colors[Index(pos)] = c; } + const std::list &Entities() const { return entities; } + Entity &AddEntity(const Entity &); + Vector ForceAt(Vector, float m) const; private: @@ -36,6 +41,8 @@ private: std::vector masses; std::vector colors; + std::list entities; + }; }