diff --git a/include/ColliderComponent.h b/include/ColliderComponent.h index 7c587ae..ef4d5c8 100644 --- a/include/ColliderComponent.h +++ b/include/ColliderComponent.h @@ -3,6 +3,7 @@ #include #include "Component.h" +#include "Vector2D.h" class TransformComponent; @@ -15,10 +16,14 @@ public: bool hasCollision; //added for removing collision of destroyed projectiles float hitboxScale; //adds a seperate variable for the scale of the hitbox (not the sprite) so each sprite can have a different hitbox size if needed + bool isProjectile = false; + ColliderComponent(const char* tag); ColliderComponent(const char* tag, float hitboxScale); void init() override; void update() override; void removeCollision(); + + void handleCollision(Vector2D& characterPos, SDL_Rect& characterCollider, SDL_Rect& componentCollider); }; \ No newline at end of file diff --git a/include/Game.h b/include/Game.h index 1a40716..117bb29 100644 --- a/include/Game.h +++ b/include/Game.h @@ -4,6 +4,8 @@ #include #include +#include "Vector2D.h" + class AssetManager; class ColliderComponent; diff --git a/src/ColliderComponent.cpp b/src/ColliderComponent.cpp index d1c59c0..5ba9ad5 100644 --- a/src/ColliderComponent.cpp +++ b/src/ColliderComponent.cpp @@ -25,6 +25,10 @@ void ColliderComponent::init() entity->addComponent(); } + if (strcmp(this->tag, "projectile") == 0) { + this->isProjectile = true; + } + transform = &entity->getComponent(); Game::colliders.push_back(this); } @@ -43,3 +47,16 @@ void ColliderComponent::removeCollision() { this->hasCollision = false; } + +void ColliderComponent::handleCollision(Vector2D& entityPos, SDL_Rect& entityCollider, SDL_Rect& componentCollider) +{ + // collision to right of character + if (entityPos.x < componentCollider.x) + { + entityPos.x = componentCollider.x - entityCollider.w; + } + else // collision to left of character + { + entityPos.x = componentCollider.x + componentCollider.w; + } +} \ No newline at end of file diff --git a/src/Game.cpp b/src/Game.cpp index 21f0d35..faa6b57 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -260,11 +260,25 @@ void Game::update() { if (SDL_HasIntersection(&player.getComponent().collider, &cc->collider) && strcmp(cc->tag, "player") && cc->hasCollision) { - player.getComponent().position = playerPos; + if (!cc->isProjectile) + { + player.getComponent().handleCollision(player.getComponent().position, player.getComponent().collider, cc->collider); + } + else + { + player.getComponent().position = playerPos; + } } if (SDL_HasIntersection(&enemy.getComponent().collider, &cc->collider) && strcmp(cc->tag, "enemy") && cc->hasCollision) { - enemy.getComponent().position = enemyPos; + if (!cc->isProjectile) + { + enemy.getComponent().handleCollision(enemy.getComponent().position, enemy.getComponent().collider, cc->collider); + } + else + { + enemy.getComponent().position = enemyPos; + } } } diff --git a/src/TransformComponent.cpp b/src/TransformComponent.cpp index 9f73934..8e02ad3 100644 --- a/src/TransformComponent.cpp +++ b/src/TransformComponent.cpp @@ -44,12 +44,29 @@ void TransformComponent::update() // if(velocity.x != 0 && velocity.y != 0) float multiplier = velocity.x != 0 && velocity.y != 0 ? 0.707 : 1; //normalizes vector + Vector2D newPos( position.x + velocity.x * speed * multiplier, position.y + velocity.y * speed * multiplier ); - if (newPos.x < 0 || newPos.x + (this->width * this->scale) > SCREEN_SIZE_WIDTH || newPos.y < 0 || newPos.y + (this->height * this->scale) > SCREEN_SIZE_HEIGHT) - return; + + if (newPos.x < 0) + { + newPos.x = 0; + } + else if (newPos.x + (this->width * this->scale) > SCREEN_SIZE_WIDTH) + { + newPos.x = SCREEN_SIZE_WIDTH - (this->width * this->scale); + } + + if (newPos.y < 0) + { + newPos.y = 0; + } + else if (newPos.y + (this->height * this->scale) > SCREEN_SIZE_HEIGHT) + { + newPos.y = SCREEN_SIZE_HEIGHT - (this->height * this->scale); + } position = newPos; }