Skip to content

Commit 5f66878

Browse files
committed
more collisions stuff
1 parent c095f15 commit 5f66878

17 files changed

+293
-156
lines changed

FluffyEngine/CollidersHandler.h

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#pragma once
2+
#include "Singleton.h"
3+
#include <unordered_set>
4+
5+
namespace Fluffy
6+
{
7+
class CollidersHandler final : public Singleton<CollidersHandler>
8+
{
9+
public:
10+
inline void RegisterCollisionLayer(const std::string& layerName)
11+
{
12+
m_CollisionLayers.emplace(layerName, 1 << (unsigned int)m_CollisionLayers.size());
13+
}
14+
15+
inline void RegisterColliderComponent(class RectColliderComponent* pCollider)
16+
{
17+
m_ColliderComponents.insert(pCollider);
18+
}
19+
20+
inline void UnregisterColliderComponent(class RectColliderComponent* pCollider)
21+
{
22+
const auto& componentIt{ m_ColliderComponents.find(pCollider) };
23+
if (componentIt != m_ColliderComponents.end())
24+
m_ColliderComponents.erase(componentIt);
25+
}
26+
27+
inline const std::unordered_set<class RectColliderComponent*>& GetAllColliderComponents() const { return m_ColliderComponents; }
28+
29+
inline void Clear()
30+
{
31+
m_ColliderComponents.clear();
32+
}
33+
34+
private:
35+
std::unordered_set<class RectColliderComponent*> m_ColliderComponents{};
36+
std::unordered_map<std::string, unsigned int> m_CollisionLayers{};
37+
};
38+
}

FluffyEngine/Event.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ namespace Fluffy
88
OnDamageTaken,
99
OnCharacterDeath,
1010
OnEnemyKilled,
11-
OnCollision,
11+
OnCollisionEnter,
12+
OnCollisionExit,
13+
OnBulletHit,
1214
};
1315

1416
class Event

FluffyEngine/FluffyEngine.vcxproj

+6
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,15 @@
200200
<ItemGroup>
201201
<ClInclude Include="BaseInputDevice.h" />
202202
<ClInclude Include="Character.h" />
203+
<ClInclude Include="CollidersHandler.h" />
203204
<ClInclude Include="Command.h" />
204205
<ClInclude Include="Component.h" />
205206
<ClInclude Include="Controller.h" />
206207
<ClInclude Include="Event.h" />
207208
<ClInclude Include="Font.h" />
208209
<ClInclude Include="GameObject.h" />
210+
<ClInclude Include="RectColliderComponent.h" />
211+
<ClInclude Include="Rectf.h" />
209212
<ClInclude Include="IEventParam.h" />
210213
<ClInclude Include="InputManager.h" />
211214
<ClInclude Include="IEventListener.h" />
@@ -221,6 +224,7 @@
221224
<ClInclude Include="ServiceLocator.h" />
222225
<ClInclude Include="Singleton.h" />
223226
<ClInclude Include="Sprite.h" />
227+
<ClInclude Include="SpriteColliderComponent.h" />
224228
<ClInclude Include="Texture2D.h" />
225229
<ClInclude Include="FluffyTime.h" />
226230
<ClInclude Include="Transform.h" />
@@ -237,13 +241,15 @@
237241
<ClCompile Include="InputManager.cpp" />
238242
<ClCompile Include="Keyboard.cpp" />
239243
<ClCompile Include="FluffyEngine.cpp" />
244+
<ClCompile Include="RectColliderComponent.cpp" />
240245
<ClCompile Include="Renderer.cpp" />
241246
<ClCompile Include="ResourceManager.cpp" />
242247
<ClCompile Include="Scene.cpp" />
243248
<ClCompile Include="SceneManager.cpp" />
244249
<ClCompile Include="SDLSoundSystem.cpp" />
245250
<ClCompile Include="ServiceLocator.cpp" />
246251
<ClCompile Include="Sprite.cpp" />
252+
<ClCompile Include="SpriteColliderComponent.cpp" />
247253
<ClCompile Include="Text.cpp" />
248254
<ClCompile Include="Texture2D.cpp" />
249255
<ClCompile Include="FluffyTime.cpp" />

FluffyEngine/FluffyEngine.vcxproj.filters

+18
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,18 @@
9696
<ClInclude Include="SDLSoundSystem.h">
9797
<Filter>Header Files</Filter>
9898
</ClInclude>
99+
<ClInclude Include="CollidersHandler.h">
100+
<Filter>Header Files</Filter>
101+
</ClInclude>
102+
<ClInclude Include="SpriteColliderComponent.h">
103+
<Filter>Header Files</Filter>
104+
</ClInclude>
105+
<ClInclude Include="Rectf.h">
106+
<Filter>Header Files</Filter>
107+
</ClInclude>
108+
<ClInclude Include="RectColliderComponent.h">
109+
<Filter>Header Files</Filter>
110+
</ClInclude>
99111
</ItemGroup>
100112
<ItemGroup>
101113
<ClCompile Include="ResourceManager.cpp">
@@ -161,5 +173,11 @@
161173
<ClCompile Include="SDLSoundSystem.cpp">
162174
<Filter>Source Files</Filter>
163175
</ClCompile>
176+
<ClCompile Include="SpriteColliderComponent.cpp">
177+
<Filter>Source Files</Filter>
178+
</ClCompile>
179+
<ClCompile Include="RectColliderComponent.cpp">
180+
<Filter>Source Files</Filter>
181+
</ClCompile>
164182
</ItemGroup>
165183
</Project>

FluffyEngine/IEventParam.h

+11-14
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,25 @@
11
#pragma once
2-
// Empty interface
32
namespace Fluffy
43
{
54
struct IEventParam
65
{
6+
// Empty interface
77
};
88

9-
struct OnCharacterDeathParam : public IEventParam
9+
struct CollisionParam : public Fluffy::IEventParam
1010
{
11-
OnCharacterDeathParam(int playerIndex)
12-
: killer{ playerIndex }
11+
public:
12+
CollisionParam(class RectColliderComponent* pReceiverCollider, class RectColliderComponent* pOtherCollider)
13+
: m_pReceiverCollider{ pReceiverCollider }
14+
, m_pOtherCollider{ pOtherCollider }
1315
{
1416
}
1517

16-
int killer;
17-
};
18-
19-
struct OnCollisionParam : public IEventParam
20-
{
21-
OnCollisionParam(class SpriteColliderComponent* collider)
22-
: pCollider{ collider }
23-
{
24-
}
18+
inline class RectColliderComponent* GetReceiverCollider() const { return m_pReceiverCollider; }
19+
inline class RectColliderComponent* GetOtherCollider() const { return m_pOtherCollider; }
2520

26-
class SpriteColliderComponent* pCollider;
21+
private:
22+
class RectColliderComponent* m_pReceiverCollider;
23+
class RectColliderComponent* m_pOtherCollider;
2724
};
2825
}

FluffyEngine/Rectf.h

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#pragma once
2+
#include <glm\glm.hpp>
3+
4+
namespace Fluffy
5+
{
6+
struct Rectf
7+
{
8+
public:
9+
Rectf()
10+
: Rectf{ 0.0f, 0.0f, 0.0f, 0.0f }
11+
{
12+
}
13+
14+
Rectf(float left, float bottom, float width, float height)
15+
: left{ left }
16+
, bottom{ bottom }
17+
, width{ width }
18+
, height{ height }
19+
{
20+
}
21+
22+
Rectf(const glm::vec2& bottomLeft, const glm::vec2& size)
23+
: left{ bottomLeft.x }
24+
, bottom{ bottomLeft.y }
25+
, width{ size.x }
26+
, height{ size.y }
27+
{
28+
}
29+
30+
float left;
31+
float bottom;
32+
float width;
33+
float height;
34+
35+
float Top() const
36+
{
37+
return bottom + height;
38+
}
39+
40+
float Right() const
41+
{
42+
return left + width;
43+
}
44+
45+
glm::vec2 Center() const
46+
{
47+
return { left + (width / 2.0f), bottom + (height / 2.0f) };
48+
}
49+
};
50+
}
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
#include "Component.h"
3+
#include "Event.h"
4+
#include "RectColliderComponent.h"
5+
#include <glm\glm.hpp>
6+
7+
namespace Fluffy
8+
{
9+
class GameObject;
10+
11+
class SpriteColliderComponent : public RectColliderComponent
12+
{
13+
public:
14+
SpriteColliderComponent(GameObject* pOwner, const class Sprite* pSprite, const std::string& collisionLayerName);
15+
16+
SpriteColliderComponent(const SpriteColliderComponent& other) = default;
17+
SpriteColliderComponent& operator=(const SpriteColliderComponent& other) = default;
18+
SpriteColliderComponent(SpriteColliderComponent&& other) = default;
19+
SpriteColliderComponent& operator=(SpriteColliderComponent&& other) = default;
20+
21+
Rectf GetRect() const override;
22+
23+
private:
24+
const class Sprite* m_pSprite;
25+
};
26+
}

Galaga/Bullet.cpp

+13-5
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@
22
#include "GameObject.h"
33
#include "Sprite.h"
44
#include "SpriteColliderComponent.h"
5+
#include "CollisionLayers.h"
6+
#include "EventParams.h"
7+
#include "Character.h"
58

6-
Bullet::Bullet(Fluffy::GameObject* pOwner, int ownerIndex, const glm::vec2& position, const glm::vec2& speed)
9+
Bullet::Bullet(Fluffy::GameObject* pOwner, int ownerIndex, const glm::vec2& speed)
710
: Component(pOwner)
811
, m_OwnerIndex{ ownerIndex }
912
, m_Speed{ speed }
1013
{
11-
Fluffy::Sprite* pSprite{ m_pOwner->AddComponent<Fluffy::Sprite>(ownerIndex == 0 ? "enemyBullet.png" : "galaga_player_bullet.png") };
12-
m_pOwner->AddComponent<SpriteColliderComponent>(pSprite->GetTextureSize());
14+
Fluffy::Sprite* pSprite{ m_pOwner->AddComponent<Fluffy::Sprite>(ownerIndex == INVALID_PLAYER_INDEX ? "enemyBullet.png" : "galaga_player_bullet.png") };
15+
m_pOwner->AddComponent<Fluffy::SpriteColliderComponent>(pSprite, CollisionLayers::BULLET);
1316
m_pOwner->SetActive(true);
14-
m_pOwner->SetWorldPosition(position);
1517
}
1618

1719
void Bullet::Update(const float deltaTime)
@@ -21,8 +23,14 @@ void Bullet::Update(const float deltaTime)
2123

2224
void Bullet::Initialize(int ownerIndex, const glm::vec2& position)
2325
{
24-
m_pOwner->GetComponentOfType<Fluffy::Sprite>()->SetTexture(ownerIndex == 0 ? "enemyBullet.png" : "galaga_player_bullet.png");
26+
m_pOwner->GetComponent<Fluffy::Sprite>()->SetTexture(ownerIndex == INVALID_PLAYER_INDEX ? "enemyBullet.png" : "galaga_player_bullet.png");
2527

2628
m_pOwner->SetActive(true);
2729
m_pOwner->SetWorldPosition(position);
2830
}
31+
32+
void Bullet::OnTargetHit()
33+
{
34+
const BulletHitParam param{ this };
35+
m_OnTargetHit.Invoke(&param);
36+
}

Galaga/Bullet.h

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22
#include "Component.h"
3+
#include "Event.h"
34
#include <glm/glm.hpp>
45

56
namespace Fluffy
@@ -10,15 +11,20 @@ namespace Fluffy
1011
class Bullet final : public Fluffy::Component
1112
{
1213
public:
13-
Bullet(Fluffy::GameObject* pOwner, int ownerIndex, const glm::vec2& position, const glm::vec2& speed = { 0.0f, -100.0f });
14+
Bullet(Fluffy::GameObject* pOwner, int ownerIndex, const glm::vec2& speed = { 0.0f, -100.0f });
1415
~Bullet() = default;
1516

1617
void Update(const float deltaTime) override;
17-
std::string GetTypeName() override { return typeid(*this).name(); }
1818
void Initialize(int ownerIndex, const glm::vec2& position);
1919

20+
inline Fluffy::Event& GetOnTargetHitEvent() { return m_OnTargetHit; }
21+
void OnTargetHit();
22+
23+
inline int GetOwnerIndex() const { return m_OwnerIndex; }
24+
2025
private:
2126
int m_OwnerIndex;
2227
glm::vec2 m_Speed;
23-
};
2428

29+
Fluffy::Event m_OnTargetHit{ Fluffy::EventType::OnBulletHit };
30+
};

0 commit comments

Comments
 (0)