Bladeren bron

Lesson 19.4

Godzil 3 jaren geleden
bovenliggende
commit
72e4e51afe
3 gewijzigde bestanden met toevoegingen van 66 en 10 verwijderingen
  1. 6 5
      source/Game.cpp
  2. 57 2
      source/include/Systems/Damage.h
  3. 3 3
      source/include/Systems/ProjectileEmit.h

+ 6 - 5
source/Game.cpp

@@ -183,10 +183,11 @@ void Game::LoadLevel(int level)
     chopper.addComponent<TransformComponent>(glm::vec2(10, 100), glm::vec2(1, 1), 0);
     chopper.addComponent<SpriteComponent>("chopper-image", 2, 32, 32);
     chopper.addComponent<RigidBodyComponent>(glm::vec2(0, 0));
+    chopper.addComponent<BoxColliderComponent>(32, 32);
     chopper.addComponent<AnimationComponent>(2, 15, true);
     chopper.addComponent<KeyboardControlComponent>(glm::vec2(0, -80), glm::vec2(80, 0),
                                                    glm::vec2(0, 80), glm::vec2(-80, 0));
-    chopper.addComponent<ProjectileEmitterComponent>(glm::vec2(180, 180), 0, 10000, 0, true);
+    chopper.addComponent<ProjectileEmitterComponent>(glm::vec2(180, 180), 0, 10000, 10, true);
     chopper.addComponent<HealthComponent>(100);
     chopper.addComponent<CameraFollowComponent>();
     chopper.tag("player");
@@ -202,8 +203,8 @@ void Game::LoadLevel(int level)
     tank.addComponent<TransformComponent>(glm::vec2(500, 10), glm::vec2(1, 1), 0);
     tank.addComponent<RigidBodyComponent>(glm::vec2(-3, 0));
     tank.addComponent<SpriteComponent>("tank-image", 1, 32, 32);
-    tank.addComponent<BoxColliderComponent>(32, 32, glm::vec2(0, 0));
-    tank.addComponent<ProjectileEmitterComponent>(glm::vec2(100, 0), 5000, 3000, 0, false);
+    tank.addComponent<BoxColliderComponent>(32, 32);
+    tank.addComponent<ProjectileEmitterComponent>(glm::vec2(100, 0), 5000, 3000, 10, false);
     tank.addComponent<HealthComponent>(100);
     tank.group("enemies");
 
@@ -211,8 +212,8 @@ void Game::LoadLevel(int level)
     truck.addComponent<TransformComponent>(glm::vec2(10, 10), glm::vec2(1, 1), 0);
     truck.addComponent<RigidBodyComponent>(glm::vec2(2, 0));
     truck.addComponent<SpriteComponent>("truck-image", 1, 32, 32);
-    truck.addComponent<BoxColliderComponent>(32, 32, glm::vec2(0, 0));
-    truck.addComponent<ProjectileEmitterComponent>(glm::vec2(0, 100), 2000, 5000, 0, false);
+    truck.addComponent<BoxColliderComponent>(32, 32);
+    truck.addComponent<ProjectileEmitterComponent>(glm::vec2(0, 100), 2000, 5000, 10, false);
     truck.addComponent<HealthComponent>(100);
     truck.group("enemies");
 }

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

@@ -17,6 +17,8 @@
 
 #include <Events/Collision.h>
 #include <Components/BoxCollider.h>
+#include <Components/Projectile.h>
+#include <Components/Heakth.h>
 
 class DamageSystem : public System
 {
@@ -31,12 +33,65 @@ public:
         eventBus->subscribeToEvent<CollisionEvent>(this, &DamageSystem::onCollision);
     }
 
+    void onProjectileHitPlayer(Entity projectileEntity, Entity playerEntity)
+    {
+        auto projectile = projectileEntity.getComponent<ProjectileComponent>();
+
+        if (!projectile.isFriendly)
+        {
+            auto &playerHealth = playerEntity.getComponent<HealthComponent>();
+            playerHealth.healthPercentage -= projectile.hitPercentDamage;
+
+            if (playerHealth.healthPercentage <= 0)
+            {
+                playerEntity.kill();
+            }
+
+            projectileEntity.kill();
+        }
+    }
+
+    void onProjectileHitEnemy(Entity projectileEntity, Entity enemyEntity)
+    {
+        auto projectile = projectileEntity.getComponent<ProjectileComponent>();
+
+        if (projectile.isFriendly)
+        {
+            auto &enemyHealth = enemyEntity.getComponent<HealthComponent>();
+            enemyHealth.healthPercentage -= projectile.hitPercentDamage;
+
+            if (enemyHealth.healthPercentage <= 0)
+            {
+                enemyEntity.kill();
+            }
+            
+            projectileEntity.kill();
+        }
+    }
+
     void onCollision(CollisionEvent &event)
     {
         Logger::Debug("Damage: Got an event from A id#%d and B id#%d", event.a.getId(), event.b.getId());
 
-        //event.a.kill();
-        //event.b.kill();
+        if (event.a.belongToGroup("projectiles") && event.b.hasTag("player"))
+        {
+            this->onProjectileHitPlayer(event.a, event.b);
+        }
+        if (event.b.belongToGroup("projectiles") && event.a.hasTag("player"))
+        {
+            this->onProjectileHitPlayer(event.b, event.a);
+        }
+
+        if (event.a.belongToGroup("projectiles") && event.b.belongToGroup("enemies"))
+        {
+            this->onProjectileHitEnemy(event.a, event.b);
+        }
+        if (event.b.belongToGroup("projectiles") && event.a.belongToGroup("enemies"))
+        {
+            this->onProjectileHitEnemy(event.b, event.a);
+        }
+
+
     }
 
     void Update()

+ 3 - 3
source/include/Systems/ProjectileEmit.h

@@ -74,9 +74,7 @@ public:
                     projectile.addComponent<SpriteComponent>("bullet-image", 4, 4, 4);
                     projectile.addComponent<BoxColliderComponent>(4, 4);
                     projectile.addComponent<ProjectileComponent>(emitter.projectileDuration, emitter.hitPercentDamage, emitter.isFriendly);
-
-                    emitter.lastEmissionTime = SDL_GetTicks();
-
+                    projectile.group("projectiles");
                 }
             }
         }
@@ -107,6 +105,8 @@ public:
                 projectile.addComponent<BoxColliderComponent>(4, 4);
                 projectile.addComponent<ProjectileComponent>(emitter.projectileDuration, emitter.hitPercentDamage, emitter.isFriendly);
 
+                projectile.group("projectiles");
+
                 emitter.lastEmissionTime = SDL_GetTicks();
             }