Godzil 3 роки тому
батько
коміт
0be0ae93e3

+ 10 - 3
source/Game.cpp

@@ -26,6 +26,7 @@
 #include <Components/BoxCollider.h>
 #include <Components/KeyboardControl.h>
 #include <Components/CameraFollow.h>
+#include <Components/ProjectileEmitter.h>
 
 #include <Systems/Movement.h>
 #include <Systems/Render.h>
@@ -33,12 +34,13 @@
 #include <Systems/Collision.h>
 #include <Systems/Damage.h>
 #include <Systems/KeyboardMovement.h>
+#include <Systems/CameraMovement.h>
+#include <Systems/ProjectileEmit.h>
 
 uint32_t Game::windowsWidth = 0;
 uint32_t Game::windowsHeight = 0;
 uint32_t Game::mapWidth = 0;
 uint32_t Game::mapHeight = 0;
-#include <Systems/CameraMovement.h>
 
 Game::Game()
 {
@@ -130,12 +132,14 @@ void Game::LoadLevel(int level)
     this->registry->addSystem<DamageSystem>();
     this->registry->addSystem<KeyboardMovementSystem>();
     this->registry->addSystem<CameraMovementSystem>();
+    this->registry->addSystem<ProjectileEmitSystem>();
 
     this->assetStore->addTexture(this->renderer, "tank-image", "assets/images/tank-panther-right.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");
     this->assetStore->addTexture(this->renderer, "radar-image", "assets/images/radar.png");
+    this->assetStore->addTexture(this->renderer, "bullet-image", "assets/images/bullet.png");
 
     Logger::Debug("struct SpriteComponent size is %d", sizeof(struct SpriteComponent));
 
@@ -188,15 +192,17 @@ void Game::LoadLevel(int level)
 
     Entity tank = this->registry->createEntity();
     tank.addComponent<TransformComponent>(glm::vec2(500, 10), glm::vec2(1, 1), 0);
-    tank.addComponent<RigidBodyComponent>(glm::vec2(-30, 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, 10000, 0, false);
 
     Entity truck = this->registry->createEntity();
     truck.addComponent<TransformComponent>(glm::vec2(10, 10), glm::vec2(1, 1), 0);
-    truck.addComponent<RigidBodyComponent>(glm::vec2(20, 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, 10000, 0, false);
 }
 
 void Game::Setup()
@@ -225,6 +231,7 @@ void Game::Update()
     registry->getSystem<MovementSystem>().update(deltaTime);
     registry->getSystem<AnimationSystem>().update();
     registry->getSystem<CollisionSystem>().update(this->eventBus);
+    registry->getSystem<ProjectileEmitSystem>().update(this->registry);
     registry->getSystem<CameraMovementSystem>().update(this->camera);
 }
 

+ 40 - 0
source/include/Components/ProjectileEmitter.h

@@ -0,0 +1,40 @@
+/*
+ * 2D Game Engine 
+ * ProjectileEmitter.h: 
+ * Based on pikuma.com 2D game engine in C++ and Lua course
+ * Copyright (c) 2021 986-Studio. All rights reserved.
+ *
+ * Created by Manoël Trapier on 27/02/2021.
+ */
+
+#ifndef GAMEENGINE_SOURCE_INCLUDE_COMPONENTS_PROJECTILEEMITTER_H
+#define GAMEENGINE_SOURCE_INCLUDE_COMPONENTS_PROJECTILEEMITTER_H
+
+#include <SDL.h>
+
+#include <ECS.h>
+#include <glm/glm.hpp>
+
+struct ProjectileEmitterComponent
+{
+    glm::vec2 projectileVelocity;
+    uint32_t repeatFrequency;
+    uint32_t projectileDuration;
+    uint32_t hitPercentDamage;
+    bool isFriendly;
+    int lastEmissionTime;
+
+    ProjectileEmitterComponent(glm::vec2 projectileVelocity = glm::vec2 (0, 0), uint32_t repeatFrequency = 0,
+                               uint32_t projectileDuration = 10000,
+                               uint32_t hitPercentageDamage = 10,
+                               bool isFriendly= false) : projectileVelocity(projectileVelocity),
+                                                         repeatFrequency(repeatFrequency),
+                                                         projectileDuration(projectileDuration),
+                                                         hitPercentDamage(hitPercentageDamage),
+                                                         isFriendly(isFriendly)
+    {
+        this->lastEmissionTime = SDL_GetTicks();
+    };
+};
+
+#endif /* GAMEENGINE_SOURCE_INCLUDE_COMPONENTS_PROJECTILEEMITTER_H */

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

@@ -34,8 +34,9 @@ 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());
-        event.a.kill();
-        event.b.kill();
+
+        //event.a.kill();
+        //event.b.kill();
     }
 
     void Update()

+ 64 - 0
source/include/Systems/ProjectileEmit.h

@@ -0,0 +1,64 @@
+/*
+ * 2D Game Engine 
+ * ProjectileEmit.h: 
+ * Based on pikuma.com 2D game engine in C++ and Lua course
+ * Copyright (c) 2021 986-Studio. All rights reserved.
+ *
+ * Created by Manoël Trapier on 27/02/2021.
+ */
+
+#ifndef GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_PROJECTILEEMIT_H
+#define GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_PROJECTILEEMIT_H
+
+#include <SDL.h>
+
+#include <ECS.h>
+
+#include <Components/ProjectileEmitter.h>
+#include <Components/RigidBody.h>
+#include <Components/Sprite.h>
+#include <Components/Transform.h>
+#include <Components/BoxCollider.h>
+
+class ProjectileEmitSystem: public System
+{
+public:
+    ProjectileEmitSystem()
+    {
+        this->requireComponent<ProjectileEmitterComponent>();
+        this->requireComponent<TransformComponent>();
+    }
+
+    void update(std::unique_ptr<Registry> &registry)
+    {
+        for(auto entity: this->getSystemEntities())
+        {
+            auto &emitter = entity.getComponent<ProjectileEmitterComponent>();
+            const auto transform = entity.getComponent<TransformComponent>();
+
+            if ((SDL_GetTicks() - emitter.lastEmissionTime) > emitter.repeatFrequency)
+            {
+                Entity projectile = registry->createEntity();
+
+                glm::vec2 projectilePosition = transform.position;
+                if ( entity.hasComponent<SpriteComponent>() )
+                {
+                    auto sprite = entity.getComponent<SpriteComponent>();
+                    projectilePosition.x += (transform.scale.x * sprite.width) / 2.;
+                    projectilePosition.y += (transform.scale.y * sprite.height) / 2.;
+                }
+
+                projectile.addComponent<TransformComponent>(projectilePosition, glm::vec2(1, 1), 0);
+                projectile.addComponent<RigidBodyComponent>(emitter.projectileVelocity);
+                projectile.addComponent<SpriteComponent>("bullet-image", 4, 4, 4);
+                projectile.addComponent<BoxColliderComponent>(4, 4);
+
+                emitter.lastEmissionTime = SDL_GetTicks();
+            }
+
+        }
+    }
+};
+
+
+#endif /* GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_PROJECTILEEMIT_H */