]> git.localhorst.tv Git - gworm.git/commitdiff
basic entities
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 14 Jan 2014 18:06:22 +0000 (19:06 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 14 Jan 2014 18:06:22 +0000 (19:06 +0100)
src/app/Application.cpp
src/gworm.cpp
src/world/Entity.cpp [new file with mode: 0644]
src/world/Entity.h [new file with mode: 0644]
src/world/World.cpp
src/world/World.h

index e1ac2018958cec7c0a70f67519f788ae2797b1a8..d798b37c757f89b75aab6b41a524ed727caaa076 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "../graphics/Canvas.h"
 #include "../graphics/Color.h"
+#include "../world/Entity.h"
 #include "../world/World.h"
 
 #include <chrono>
@@ -15,7 +16,7 @@ namespace gworm {
 Application::Application(Canvas &c, World &w)
 : canvas(c)
 , world(w)
-, focus(Vector<float>(5, 5), 25)
+, focus(Vector<float>(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<milliseconds>(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<milliseconds>(update - event).count() << endl;
        }
+
        Render();
+       auto render = chrono::system_clock::now();
+       cout << "       render: " << duration_cast<milliseconds>(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<milliseconds>(background - enter).count() << endl;
        RenderWorld();
-       auto world = chrono::system_clock::now();
-       cout << "       world:      " << duration_cast<milliseconds>(world - background).count() << endl;
        RenderEntities();
-       auto entities = chrono::system_clock::now();
-       cout << "       entities:   " << duration_cast<milliseconds>(entities - world).count() << endl;
        RenderUI();
-       auto ui = chrono::system_clock::now();
-       cout << "       UI:         " << duration_cast<milliseconds>(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<float> force = world.ForceAt(focus.Pos(), 1);
-       const Vector<int> screenFocus = cam.ToScreen(focus.Pos());
+       for (const Entity &e : world.Entities()) {
+               const Vector<int> screenPos = cam.ToScreen(e.pos);
+
+               canvas.SetColor(forceColor);
+               canvas.Arrow(screenPos, screenPos + Vector<int>(e.acc * e.mass * 10.0f));
 
-       canvas.SetColor(forceColor);
-       canvas.Arrow(screenFocus, screenFocus + Vector<int>(force * 10.0f));
-       cout << "force on 1kg at " << focus.Pos() << ": " << force << endl;
+               canvas.SetColor(speedColor);
+               canvas.Arrow(screenPos, screenPos + Vector<int>(e.vel * 10.0f));
+
+               cout << "entity: pos " << e.pos << ", vel " << e.vel << ", acc " << e.acc << endl;
+       }
 }
 
 }
index 5f35fd956803250dd1b884b8ac233a1106b298b9..efd5757324b36bcd89b8d71fe12ba6c21038f707 100644 (file)
@@ -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<int>(500, 500));
        make_planet(world, Vector<int>(250, 250), 220);
 
+       Entity e;
+       e.vel = Vector<float>(-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 (file)
index 0000000..d1cf34d
--- /dev/null
@@ -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 (file)
index 0000000..b8706d2
--- /dev/null
@@ -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<float> pos;
+       Vector<float> vel;
+       Vector<float> acc;
+
+       float mass;
+
+};
+
+}
+
+#endif
index 219708ecb066749179c08603dc731761318a9837..206105ba3d9c3cdf1ffdc5bd943fb3058e9cee99 100644 (file)
@@ -15,7 +15,16 @@ World::World(Vector<int> 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();
 }
 
 
index 4cb5a2711096f4b7be4e3361aa8d8a292616a0b3..f15d43b8ae818c0a9a6cacf51baa230b48866763 100644 (file)
@@ -1,9 +1,11 @@
 #ifndef GWORM_WORLD_H_
 #define GWORM_WORLD_H_
 
+#include "Entity.h"
 #include "../graphics/Color.h"
 #include "../graphics/Vector.h"
 
+#include <list>
 #include <vector>
 
 
@@ -27,6 +29,9 @@ public:
        Color ColorAt(Vector<int> pos) const { return colors[Index(pos)]; }
        void SetColor(Vector<int> pos, Color c) { colors[Index(pos)] = c; }
 
+       const std::list<Entity> &Entities() const { return entities; }
+       Entity &AddEntity(const Entity &);
+
        Vector<float> ForceAt(Vector<float>, float m) const;
 
 private:
@@ -36,6 +41,8 @@ private:
        std::vector<float> masses;
        std::vector<Color> colors;
 
+       std::list<Entity> entities;
+
 };
 
 }