]> git.localhorst.tv Git - orbi.git/commitdiff
addressed some float issues
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 6 May 2014 18:20:37 +0000 (20:20 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 6 May 2014 18:20:37 +0000 (20:20 +0200)
src/app/Application.cpp
src/graphics/Camera.h
src/graphics/Vector.h
src/orbi.cpp
src/world/AABB.h
src/world/Entity.cpp
src/world/Entity.h
src/world/World.cpp
src/world/World.h

index 44a71ccd7f5fddb33f06c0873c3228e2c1fd00d1..76ded2db2c9b15bc35ba637bf5567ccdfee369d4 100644 (file)
@@ -175,7 +175,7 @@ void Application::RenderBackground() {
        canvas.Fill();
 
        canvas.SetColor(outlineColor);
-       canvas.Grid(cam.ToScreen(Vector<int>(0, 0)), cam.ToScale(world.Size()), cam.ToScale(Vector<float>(1, 1)));
+       canvas.Grid(cam.ToScreen(Vector<int>(0, 0)), cam.ToScale(world.Size()), cam.ToScale(world.TileSize()));
 }
 
 void Application::RenderWorld() {
@@ -203,20 +203,20 @@ void Application::RenderEntities() {
                canvas.SetColor(vboxColor);
                canvas.Line(
                        cam.ToScreen(Vector<float>(e.vbox.Left(), e.vbox.Top())),
-                       cam.ToScreen(Vector<float>(e.vbox.Right(), e.vbox.Top()))
+                       cam.ToScreen(Vector<float>(e.vbox.Right(), e.vbox.Top())) - Vector<int>(1, 0)
                );
                canvas.Line(
-                       cam.ToScreen(Vector<float>(e.vbox.Left(), e.vbox.Bottom())),
-                       cam.ToScreen(Vector<float>(e.vbox.Right(), e.vbox.Bottom()))
+                       cam.ToScreen(Vector<float>(e.vbox.Left(), e.vbox.Bottom())) - Vector<int>(0, 1),
+                       cam.ToScreen(Vector<float>(e.vbox.Right(), e.vbox.Bottom())) - Vector<int>(1, 1)
                );
                canvas.SetColor(hboxColor);
                canvas.Line(
                        cam.ToScreen(Vector<float>(e.hbox.Left(), e.hbox.Top())),
-                       cam.ToScreen(Vector<float>(e.hbox.Left(), e.hbox.Bottom()))
+                       cam.ToScreen(Vector<float>(e.hbox.Left(), e.hbox.Bottom())) - Vector<int>(0, 1)
                );
                canvas.Line(
-                       cam.ToScreen(Vector<float>(e.hbox.Right(), e.hbox.Top())),
-                       cam.ToScreen(Vector<float>(e.hbox.Right(), e.hbox.Bottom()))
+                       cam.ToScreen(Vector<float>(e.hbox.Right(), e.hbox.Top())) - Vector<int>(1, 0),
+                       cam.ToScreen(Vector<float>(e.hbox.Right(), e.hbox.Bottom())) - Vector<int>(1, 1)
                );
        }
 }
index 7e8ba2f9c86183b3cb35d5c43e1f4cd57894f958..c50042d41ff13bbc84a7ab5cb9c1dd2d3a79d647 100644 (file)
@@ -23,11 +23,11 @@ public:
 
        /// transform v from world coords to screen coords
        Vector<int> ToScreen(Vector<float> v) const {
-               return ToScale(v - *target) + offset;
+               return Vector<int>(round(ToScale(v - *target))) + offset;
        }
        /// scale v from world to screen
-       Vector<int> ToScale(Vector<float> v) const {
-               return Vector<int>(v * scale);
+       Vector<float> ToScale(Vector<float> v) const {
+               return Vector<float>(v * scale);
        }
 
        /// transform v from screen coords to world coords
index 0fd5bfe49f84d878a688df600b919b29f8cc367e..6259b97f0cb9a78fab1b389347113b28a94e9a33 100644 (file)
@@ -164,6 +164,14 @@ constexpr Vector<Scalar> abs(Vector<Scalar> v) {
        return Vector<Scalar>(std::abs(v.x), std::abs(v.y));
 }
 template<class Scalar>
+inline Vector<Scalar> round(Vector<Scalar> v) {
+       return Vector<Scalar>(std::round(v.x), std::round(v.y));
+}
+template<>
+inline Vector<float> round(Vector<float> v) {
+       return Vector<float>(std::roundf(v.x), std::roundf(v.y));
+}
+template<class Scalar>
 constexpr Vector<Scalar> min(Vector<Scalar> lhs, Vector<Scalar> rhs) {
        return Vector<Scalar>(std::min(lhs.x, rhs.x), std::min(lhs.y, rhs.y));
 }
index fae15e87e8b53d9d09ac7796a5131da7b5682dd2..91974974704d67bd939023a8c9fe468af36fa733 100644 (file)
@@ -32,7 +32,7 @@ int main(int argc, const char *argv[]) {
 
        Tileset tiles(
                canv.LoadTexture(sdl.GetBasePath() + "../../data/test-tile.png"),
-               Vector<int>(32, 32)
+               Vector<int>(16, 16)
        );
 
        World world(Vector<int>(10, 10));
index a0e3436194fd57dbee28b06682babc553ef6edd2..5b482c4cc701ae9fe6fa9eb8d568bb5b56508f87 100644 (file)
@@ -13,9 +13,9 @@ class AABB {
 public:
        constexpr AABB() { }
        constexpr AABB(Vector<float> pos, Vector<float> size)
-       : lt(pos), rb(pos + size) { }
+       : size(size), lt(pos), rb(pos + size) { }
        constexpr AABB(float x, float y, float w, float h)
-       : lt(x, y), rb(x + w, y + h) { }
+       : size(w, h), lt(x, y), rb(x + w, y + h) { }
 
 public:
        float Left() const { return lt.x; }
@@ -26,16 +26,17 @@ public:
        Vector<float> Position() const { return lt; }
        Vector<float> Center() const { return lt + HalfSize(); }
        Vector<float> HalfSize() const { return Size() / 2.0f; }
-       Vector<float> Size() const { return rb - lt; }
+       Vector<float> Size() const { return size; }
 
 public:
-       void Move(Vector<float> delta) { lt += delta; rb += delta; }
+       void Move(Vector<float> delta) { lt += delta; rb = lt + size; }
        void Resize(Vector<float> size) { *this = AABB(lt, size); }
 
        bool Intersects(const AABB &other) const;
        bool Intersects(const AABB &other, Collision &) const;
 
 private:
+       Vector<float> size;
        Vector<float> lt;
        Vector<float> rb;
 
index d7d683830d6920132108f0c9f0363ce5c7823a9a..16c8491179c8a2b5cdc5ef934ddc98bb13150d8c 100644 (file)
@@ -11,6 +11,7 @@ void Entity::Update(float dt, Vector<float> extAcc, Vector<float> tv) {
 }
 
 void Entity::Move(Vector<float> delta) {
+       pos += delta;
        bounds.Move(delta);
        vbox.Move(delta);
        hbox.Move(delta);
index 53087b6972ef8e80cab44debef75c0373b1622a0..a7e45d292b277490c41d9657c68d2082e9f375b0 100644 (file)
@@ -17,11 +17,13 @@ public:
        void Move(Vector<float> delta);
 
 public:
+       Vector<float> pos;
+       Vector<float> vel;
+       Vector<float> acc;
+
        AABB bounds;
        AABB vbox;
        AABB hbox;
-       Vector<float> vel;
-       Vector<float> acc;
 
        float mass = 1.0f;
        float elast = 0.75f;
index aa17319cd8dfca6cd9e91d1fcddd7b66ce0e064c..088712acae45ac2720322954a7f68eac3216fc25 100644 (file)
@@ -24,8 +24,12 @@ World::World(Vector<int> size)
 
 void World::Update(float dt) {
        for (Entity &e : entities) {
-               e.Update(dt, gravity, terminal);
-               e.onGround = false;
+               if (e.onGround) {
+                       e.Update(dt, Vector<float>(), terminal);
+                       e.onGround = false;
+               } else {
+                       e.Update(dt, gravity, terminal);
+               }
 
                BoundsCollision(e, dt);
                TileCollision(e, dt);
@@ -145,12 +149,6 @@ void World::EntityCollision() {
 }
 
 
-const AABB &World::TileShapeAt(Vector<int> pos) const {
-       tileShape = AABB(pos, Vector<float>(1, 1));
-       return tileShape;
-}
-
-
 Entity &World::AddEntity(const Entity &e) {
        entities.emplace_back(e);
        return entities.back();
index cdfc5d5d807072e2ba546639e9d3b0fe9b10d479..6369757743d66c4d9d61a2ad04d1912e861995b0 100644 (file)
@@ -19,6 +19,7 @@ public:
 
 public:
        Vector<int> Size() const { return size; }
+       Vector<int> TileSize() const { return Vector<int>(1, 1); }
 
 public:
        void Update(float dt);
@@ -30,7 +31,6 @@ public:
        Tile &TileAt(Vector<int> pos) { return tiles[Index(pos)]; }
        const Tile &TileAt(Vector<int> pos) const { return tiles[Index(pos)]; }
        void SetTile(Vector<int> pos, const Tile &t) { tiles[Index(pos)] = t; }
-       const AABB &TileShapeAt(Vector<int> pos) const;
 
        const std::list<Entity> &Entities() const { return entities; }
        Entity &AddEntity(const Entity &);