Start work on the HitboxComponent.

This commit is contained in:
SeanOMik 2020-07-07 00:52:03 -05:00
parent 9013efcf31
commit 63b2d506ba
No known key found for this signature in database
GPG Key ID: FA4D55AC05268A88
3 changed files with 80 additions and 2 deletions

View File

@ -10,6 +10,7 @@
#include <simpleengine/components/movement/movement_component.h> #include <simpleengine/components/movement/movement_component.h>
#include <simpleengine/components/ssma_component.h> #include <simpleengine/components/ssma_component.h>
#include <simpleengine/events/entity_event.h> #include <simpleengine/events/entity_event.h>
#include <simpleengine/components/hitbox_component.h>
#include <simpleengine/animation.h> #include <simpleengine/animation.h>
#include <chrono> #include <chrono>
@ -22,7 +23,6 @@ private:
float movement_speed = 130; float movement_speed = 130;
sf::Vector2u window_size; sf::Vector2u window_size;
std::unique_ptr<simpleengine::SideScrollerMovementAnimationComponent> move_anim_component;
public: public:
explicit PlayerEntity(sf::Vector2u window_size) : window_size(window_size) { explicit PlayerEntity(sf::Vector2u window_size) : window_size(window_size) {
texture.loadFromFile("player_sheet.png"); texture.loadFromFile("player_sheet.png");
@ -30,13 +30,17 @@ public:
sprite.setTexture(texture); sprite.setTexture(texture);
sprite.setScale(.7, .7); sprite.setScale(.7, .7);
move_anim_component = std::make_unique<simpleengine::SideScrollerMovementAnimationComponent>(*this, sprite, auto move_anim_component = std::make_unique<simpleengine::SideScrollerMovementAnimationComponent>(*this, sprite,
texture, movement_speed, 5, 1.1); texture, movement_speed, 5, 1.1);
move_anim_component->SetAnimation(simpleengine::MovementAnimationType::WALK_LEFT, 8, 0, 8, move_anim_component->SetAnimation(simpleengine::MovementAnimationType::WALK_LEFT, 8, 0, 8,
9, 8, 128, 128); 9, 8, 128, 128);
move_anim_component->SetAnimation(simpleengine::MovementAnimationType::IDLE_LEFT, 20, 0, 0, move_anim_component->SetAnimation(simpleengine::MovementAnimationType::IDLE_LEFT, 20, 0, 0,
6, 0, 128, 128); 6, 0, 128, 128);
AddComponent(std::move(move_anim_component)); AddComponent(std::move(move_anim_component));
AddComponent(std::make_unique<simpleengine::HitboxComponent>(*this, sprite,
0, 0,
sprite.getGlobalBounds().width, sprite.getGlobalBounds().height));
} }
~PlayerEntity() override { ~PlayerEntity() override {
@ -62,6 +66,8 @@ public:
} }
void Render(sf::RenderTarget* target) override { void Render(sf::RenderTarget* target) override {
Entity::Render(target);
target->draw(sprite); target->draw(sprite);
} }
}; };

View File

@ -0,0 +1,33 @@
//
// Created by SeanOMik on 7/6/2020.
// Github: https://github.com/SeanOMik
// Email: seanomik@gmail.com
//
#ifndef SIMPLEENGINE_HITBOX_COMPONENT_H
#define SIMPLEENGINE_HITBOX_COMPONENT_H
#include "../component.h"
#include <SFML/Graphics.hpp>
namespace simpleengine {
class HitboxComponent : public Component {
private:
sf::Sprite& sprite;
sf::RectangleShape hitbox;
float offset_x;
float offset_y;
public:
HitboxComponent(Entity& owning_entity, sf::Sprite& sprite, float sprite_offset_x, float sprite_offset_y,
float width, float height);
bool DoesIntersect(const sf::FloatRect& rect);
void Update(const float &delta_time) override;
void Render(sf::RenderTarget *target) override;
};
}
#endif //SIMPLEENGINE_HITBOX_COMPONENT_H

View File

@ -0,0 +1,39 @@
//
// Created by SeanOMik on 7/6/2020.
// Github: https://github.com/SeanOMik
// Email: seanomik@gmail.com
//
#include "components/hitbox_component.h"
#include "components/ssma_component.h"
#include "entity.h"
#include <iostream>
simpleengine::HitboxComponent::HitboxComponent(Entity& owning_entity, sf::Sprite &sprite, float sprite_offset_x, float sprite_offset_y,
float width, float height) : Component(owning_entity), sprite(sprite), offset_x(sprite_offset_x), offset_y(sprite_offset_y) {
hitbox.setPosition(sprite.getPosition().x + sprite_offset_x, sprite.getPosition().y + sprite_offset_y);
hitbox.setSize(sf::Vector2f(width, height));
hitbox.setFillColor(sf::Color::Transparent);
hitbox.setOutlineThickness(1);
hitbox.setOutlineColor(sf::Color::Red);
// SSMA Component set's the sprites texture offset so we need to set
// the offset to the origin if the entity has the SSMA component.
if (owning_entity.HasComponent<simpleengine::SideScrollerMovementAnimationComponent>()) {
offset_x += sprite.getGlobalBounds().width * -0.5f;
}
}
bool simpleengine::HitboxComponent::DoesIntersect(const sf::FloatRect &rect) {
return hitbox.getGlobalBounds().intersects(rect);
}
void simpleengine::HitboxComponent::Update(const float &delta_time) {
hitbox.setPosition(sprite.getPosition().x + offset_x, sprite.getPosition().y + offset_y);
}
void simpleengine::HitboxComponent::Render(sf::RenderTarget *target) {
target->draw(hitbox);
}