Browse Source

Lesson 23.2

Godzil 3 years ago
parent
commit
69eb3ff214

+ 16 - 2
source/Game.cpp

@@ -171,6 +171,7 @@ void Game::LoadLevel(int level)
     this->registry->addSystem<RenderGUISystem>();
 
     this->assetStore->addTexture(this->renderer, "tank-image", "assets/images/tank-panther-right.png");
+    this->assetStore->addTexture(this->renderer, "tree-image", "assets/images/tree.png");
     this->assetStore->addTexture(this->renderer, "truck-image", "assets/images/truck-ford-right.png");
     this->assetStore->addTexture(this->renderer, "chopper-image", "assets/images/chopper-spritesheet.png");
     this->assetStore->addTexture(this->renderer, "main-tileset", "assets/tilemaps/jungle.png");
@@ -238,10 +239,9 @@ void Game::LoadLevel(int level)
 
     Entity tank = this->registry->createEntity();
     tank.addComponent<TransformComponent>(glm::vec2(500, 500), glm::vec2(1, 1), 0);
-    tank.addComponent<RigidBodyComponent>(glm::vec2(0, 0));
+    tank.addComponent<RigidBodyComponent>(glm::vec2(20, 0));
     tank.addComponent<SpriteComponent>("tank-image", 1, 32, 32);
     tank.addComponent<BoxColliderComponent>(25, 18, glm::vec2(5, 7));
-    tank.addComponent<ProjectileEmitterComponent>(glm::vec2(100, 0), 3000, 5000, 10, false);
     tank.addComponent<HealthComponent>(100);
     tank.group("enemies");
 
@@ -254,6 +254,19 @@ void Game::LoadLevel(int level)
     truck.addComponent<HealthComponent>(100);
     truck.group("enemies");
 
+
+    Entity treeA = registry->createEntity();
+    treeA.addComponent<TransformComponent>(glm::vec2(600, 495), glm::vec2(1, 1), 0);
+    treeA.addComponent<SpriteComponent>("tree-image", 2, 16, 32);
+    treeA.addComponent<BoxColliderComponent>(16, 32);
+    treeA.group("obstacles");
+
+    Entity treeB = registry->createEntity();
+    treeB.addComponent<TransformComponent>(glm::vec2(400, 495), glm::vec2(1, 1), 0);
+    treeB.addComponent<SpriteComponent>("tree-image", 2, 16, 32);
+    treeB.addComponent<BoxColliderComponent>(16, 32);
+    treeB.group("obstacles");
+
     SDL_Color green = { 64, 255, 127, 255 };
     Entity label = this->registry->createEntity();
     label.addComponent<TextLabelComponent>(glm::vec2(this->windowsWidth/2 - 60, 10), "SUPER CHOPPER BROS 1.0", "charriot-font", green);
@@ -280,6 +293,7 @@ void Game::Update()
     registry->getSystem<DamageSystem>().subscriptToEvents(eventBus);
     registry->getSystem<KeyboardMovementSystem>().subscriptToEvents(eventBus);
     registry->getSystem<ProjectileEmitSystem>().subscriptToEvents(eventBus);
+    registry->getSystem<MovementSystem>().subscriptToEvents(eventBus);
 
     registry->update();
 

+ 2 - 0
source/include/Components/Sprite.h

@@ -22,6 +22,7 @@ struct SpriteComponent
     int32_t zIndex;
     SDL_Rect sourceRect;
     bool isFixed;
+    SDL_RendererFlip flip;
 
     explicit SpriteComponent(std::string assetId = "", int32_t zIndex = 0,
                              uint32_t width = 0, uint32_t height = 0,
@@ -36,6 +37,7 @@ struct SpriteComponent
             static_cast<int>(width),
             static_cast<int>(height),
         };
+        this->flip = SDL_FLIP_NONE;
     };
 };
 

+ 8 - 2
source/include/Systems/Damage.h

@@ -39,6 +39,10 @@ public:
 
         if (!projectile.isFriendly)
         {
+            Logger::Debug("Damage: Player id#%d got hit by projectile id#%d",
+                          playerEntity.getId(),
+                          projectileEntity.getId());
+
             auto &playerHealth = playerEntity.getComponent<HealthComponent>();
             playerHealth.healthPercentage -= projectile.hitPercentDamage;
 
@@ -57,6 +61,10 @@ public:
 
         if (projectile.isFriendly)
         {
+            Logger::Debug("Damage: Enemy id#%d got hit by projectile id#%d",
+                          enemyEntity.getId(),
+                          projectileEntity.getId());
+
             auto &enemyHealth = enemyEntity.getComponent<HealthComponent>();
             enemyHealth.healthPercentage -= projectile.hitPercentDamage;
 
@@ -71,8 +79,6 @@ public:
 
     void onCollision(CollisionEvent &event)
     {
-        Logger::Debug("Damage: Got an event from A id#%d and B id#%d", event.a.getId(), event.b.getId());
-
         if (event.a.belongToGroup("projectiles") && event.b.hasTag("player"))
         {
             this->onProjectileHitPlayer(event.a, event.b);

+ 42 - 0
source/include/Systems/Movement.h

@@ -14,8 +14,10 @@
 #include <Game.h>
 #include <Logger.h>
 
+#include <Events/Collision.h>
 #include <Components/Transform.h>
 #include <Components/RigidBody.h>
+#include <Components/Sprite.h>
 
 class MovementSystem: public System
 {
@@ -26,6 +28,46 @@ public:
         this->requireComponent<RigidBodyComponent>();
     }
 
+    void subscriptToEvents(std::unique_ptr<EventBus> &eventBus)
+    {
+        eventBus->subscribeToEvent<CollisionEvent>(this, &MovementSystem::onCollision);
+    }
+
+    void onEnemyObstableCollision(Entity enemyEntity, Entity obstableEntity)
+    {
+        Logger::Debug("Movement: Entity id#%d hit obstacle id#%d", enemyEntity.getId(), obstableEntity.getId());
+
+        if (enemyEntity.hasComponent<RigidBodyComponent>() && enemyEntity.hasComponent<SpriteComponent>())
+        {
+            auto &rigidBody = enemyEntity.getComponent<RigidBodyComponent>();
+            auto &sprite = enemyEntity.getComponent<SpriteComponent>();
+            if (rigidBody.velocity.x != 0)
+            {
+                rigidBody.velocity.x *= -1;
+                sprite.flip = (sprite.flip == SDL_FLIP_NONE) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
+            }
+
+            if (rigidBody.velocity.y != 0)
+            {
+                rigidBody.velocity.y *= -1;
+                sprite.flip = (sprite.flip == SDL_FLIP_NONE) ? SDL_FLIP_VERTICAL : SDL_FLIP_NONE;
+            }
+        }
+    }
+
+    void onCollision(CollisionEvent &event)
+    {
+        if (event.a.belongToGroup("enemies") && event.b.belongToGroup("obstacles"))
+        {
+            onEnemyObstableCollision(event.a, event.b);
+        }
+
+        if (event.b.belongToGroup("enemies") && event.a.belongToGroup("obstacles"))
+        {
+            onEnemyObstableCollision(event.b, event.a);
+        }
+    }
+
     void update(double deltaTime)
     {
         for (auto entity: this->getSystemEntities())

+ 1 - 1
source/include/Systems/Render.h

@@ -62,7 +62,7 @@ public:
             };
 
             SDL_RenderCopyEx(renderer, texture, &sprite.sourceRect, &destRect,
-                             transform.rotation, NULL, SDL_FLIP_NONE);
+                             transform.rotation, NULL, sprite.flip);
 
         }
     }