Movement.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * 2D Game Engine
  3. * Movement.h:
  4. * Based on pikuma.com 2D game engine in C++ and Lua course
  5. * Copyright (c) 2021 986-Studio. All rights reserved.
  6. *
  7. * Created by Manoël Trapier on 11/02/2021.
  8. */
  9. #ifndef GAMEENGINE_MOVEMENT_H
  10. #define GAMEENGINE_MOVEMENT_H
  11. #include <ECS.h>
  12. #include <Game.h>
  13. #include <Logger.h>
  14. #include <Events/Collision.h>
  15. #include <Components/Transform.h>
  16. #include <Components/RigidBody.h>
  17. #include <Components/Sprite.h>
  18. class MovementSystem: public System
  19. {
  20. public:
  21. MovementSystem()
  22. {
  23. this->requireComponent<TransformComponent>();
  24. this->requireComponent<RigidBodyComponent>();
  25. }
  26. void subscriptToEvents(std::unique_ptr<EventBus> &eventBus)
  27. {
  28. eventBus->subscribeToEvent<CollisionEvent>(this, &MovementSystem::onCollision);
  29. }
  30. void onEnemyObstableCollision(Entity enemyEntity, Entity obstableEntity)
  31. {
  32. Logger::Debug("Movement: Entity id#%d hit obstacle id#%d", enemyEntity.getId(), obstableEntity.getId());
  33. if (enemyEntity.hasComponent<RigidBodyComponent>() && enemyEntity.hasComponent<SpriteComponent>())
  34. {
  35. auto &rigidBody = enemyEntity.getComponent<RigidBodyComponent>();
  36. auto &sprite = enemyEntity.getComponent<SpriteComponent>();
  37. if (rigidBody.velocity.x != 0)
  38. {
  39. rigidBody.velocity.x *= -1;
  40. sprite.flip = (sprite.flip == SDL_FLIP_NONE) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
  41. }
  42. if (rigidBody.velocity.y != 0)
  43. {
  44. rigidBody.velocity.y *= -1;
  45. sprite.flip = (sprite.flip == SDL_FLIP_NONE) ? SDL_FLIP_VERTICAL : SDL_FLIP_NONE;
  46. }
  47. }
  48. }
  49. void onCollision(CollisionEvent &event)
  50. {
  51. if (event.a.belongsToGroup("enemies") && event.b.belongsToGroup("obstacles"))
  52. {
  53. onEnemyObstableCollision(event.a, event.b);
  54. }
  55. if (event.b.belongsToGroup("enemies") && event.a.belongsToGroup("obstacles"))
  56. {
  57. onEnemyObstableCollision(event.b, event.a);
  58. }
  59. }
  60. void update(double deltaTime)
  61. {
  62. for (auto entity: this->getSystemEntities())
  63. {
  64. auto &transform = entity.getComponent<TransformComponent>();
  65. const auto rigidbody = entity.getComponent<RigidBodyComponent>();
  66. transform.position.x += rigidbody.velocity.x * deltaTime;
  67. transform.position.y += rigidbody.velocity.y * deltaTime;
  68. bool isOutsideMap = (transform.position.x < 0) ||
  69. (transform.position.x > Game::mapWidth) ||
  70. (transform.position.y < 0 ) ||
  71. (transform.position.y > Game::mapHeight);
  72. if (entity.hasTag("player"))
  73. {
  74. double paddingLeft = 10;
  75. double paddingTop = 10;
  76. double paddingRight = 50;
  77. double paddingBottom = 50;
  78. transform.position.x = (transform.position.x < paddingLeft) ? paddingLeft : transform.position.x;
  79. transform.position.x = (transform.position.x > (Game::mapWidth - paddingRight)) ? (Game::mapWidth - paddingRight): transform.position.x;
  80. transform.position.y = (transform.position.y < paddingTop) ? paddingTop : transform.position.y;
  81. transform.position.y = (transform.position.y > (Game::mapHeight - paddingBottom)) ? (Game::mapHeight - paddingBottom) : transform.position.y;
  82. }
  83. if (isOutsideMap && !entity.hasTag("player"))
  84. {
  85. entity.kill();
  86. }
  87. }
  88. }
  89. };
  90. #endif /* GAMEENGINE_MOVEMENT_H */