/* * 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 #include #include #include #include #include #include class MovementSystem: public System { public: MovementSystem() { this->requireComponent(); this->requireComponent(); } void subscriptToEvents(std::unique_ptr &eventBus) { eventBus->subscribeToEvent(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() && enemyEntity.hasComponent()) { auto &rigidBody = enemyEntity.getComponent(); auto &sprite = enemyEntity.getComponent(); 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(); const auto rigidbody = entity.getComponent(); 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 */