123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- /*
- * 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>
- #include <Components/Projectile.h>
- #include <Components/CameraFollow.h>
- class ProjectileEmitSystem: public System
- {
- public:
- ProjectileEmitSystem()
- {
- this->requireComponent<ProjectileEmitterComponent>();
- this->requireComponent<TransformComponent>();
- }
- void subscriptToEvents(std::unique_ptr<EventBus> &eventBus)
- {
- eventBus->subscribeToEvent<KeyPressedEvent>(this, &ProjectileEmitSystem::onKeyPressed);
- }
- void onKeyPressed(KeyPressedEvent &event)
- {
- if (event.keyCode == SDLK_SPACE)
- {
- for (auto entity: this->getSystemEntities())
- {
- if (entity.hasComponent<CameraFollowComponent>())
- {
- auto &emitter = entity.getComponent<ProjectileEmitterComponent>();
- const auto transform = entity.getComponent<TransformComponent>();
- const auto rigidBody = entity.getComponent<RigidBodyComponent>();
- Entity projectile = entity.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.;
- }
- glm::vec2 projectileVelocity = glm::vec2(0, 0);
- if (rigidBody.velocity.x != 0)
- {
- projectileVelocity.x = (rigidBody.velocity.x > 0) ? emitter.projectileVelocity.x : -emitter.projectileVelocity.x;
- }
- if (rigidBody.velocity.y != 0)
- {
- projectileVelocity.y = (rigidBody.velocity.y > 0) ? emitter.projectileVelocity.y : -emitter.projectileVelocity.y;
- }
- projectile.addComponent<TransformComponent>(projectilePosition, glm::vec2(1, 1), 0);
- projectile.addComponent<RigidBodyComponent>(projectileVelocity);
- 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();
- }
- }
- }
- }
- void update(std::unique_ptr<Registry> ®istry)
- {
- for(auto entity: this->getSystemEntities())
- {
- auto &emitter = entity.getComponent<ProjectileEmitterComponent>();
- const auto transform = entity.getComponent<TransformComponent>();
- if ((emitter.repeatFrequency > 0) && ((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);
- projectile.addComponent<ProjectileComponent>(emitter.projectileDuration, emitter.hitPercentDamage, emitter.isFriendly);
- emitter.lastEmissionTime = SDL_GetTicks();
- }
- }
- }
- };
- #endif /* GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_PROJECTILEEMIT_H */
|