123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- /*
- * 2D Game Engine
- * Movement.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 11/02/2021.
- */
- #ifndef GAMEENGINE_MOVEMENT_H
- #define GAMEENGINE_MOVEMENT_H
- #include <ECS.h>
- #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
- {
- public:
- MovementSystem()
- {
- this->requireComponent<TransformComponent>();
- 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.belongsToGroup("enemies") && event.b.belongsToGroup("obstacles"))
- {
- onEnemyObstableCollision(event.a, event.b);
- }
- if (event.b.belongsToGroup("enemies") && event.a.belongsToGroup("obstacles"))
- {
- onEnemyObstableCollision(event.b, event.a);
- }
- }
- void update(double deltaTime)
- {
- for (auto entity: this->getSystemEntities())
- {
- auto &transform = entity.getComponent<TransformComponent>();
- const auto rigidbody = entity.getComponent<RigidBodyComponent>();
- transform.position.x += rigidbody.velocity.x * deltaTime;
- transform.position.y += rigidbody.velocity.y * deltaTime;
- bool isOutsideMap = (transform.position.x < 0) ||
- (transform.position.x > Game::mapWidth) ||
- (transform.position.y < 0 ) ||
- (transform.position.y > Game::mapHeight);
- if (entity.hasTag("player"))
- {
- double paddingLeft = 10;
- double paddingTop = 10;
- double paddingRight = 50;
- double paddingBottom = 50;
- transform.position.x = (transform.position.x < paddingLeft) ? paddingLeft : transform.position.x;
- transform.position.x = (transform.position.x > (Game::mapWidth - paddingRight)) ? (Game::mapWidth - paddingRight): transform.position.x;
- transform.position.y = (transform.position.y < paddingTop) ? paddingTop : transform.position.y;
- transform.position.y = (transform.position.y > (Game::mapHeight - paddingBottom)) ? (Game::mapHeight - paddingBottom) : transform.position.y;
- }
- if (isOutsideMap && !entity.hasTag("player"))
- {
- entity.kill();
- }
- }
- }
- };
- #endif /* GAMEENGINE_MOVEMENT_H */
|