-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCollider2dComponent.cpp
101 lines (83 loc) · 2.76 KB
/
Collider2dComponent.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
** EPITECH PROJECT, 2020
** Collider2dComponent.cpp
** File description:
** Collider2dComponent.cpp
*/
#include <Polymorph/Core.hpp>
#include <Polymorph/Components.hpp>
#include <Polymorph/Events.hpp>
#include "base/ACollider2d.hpp"
using namespace Polymorph;
void ACollider2dComponent::_broadCastCollisionStay(ACollider2dComponent &collider)
{
for (auto &c: gameObject->getComponents<ICollider2dHandler>())
c->onCollisionStay(collider);
}
void ACollider2dComponent::_broadCastCollisionEnter(ACollider2dComponent &collider)
{
for (auto &c: gameObject->getComponents<ICollider2dHandler>())
c->onCollisionEnter(collider);
}
void ACollider2dComponent::_broadCastCollisionExit(ACollider2dComponent &collider)
{
for (auto &c: gameObject->getComponents<ICollider2dHandler>())
c->onCollisionExit(collider);
}
void ACollider2dComponent::update()
{
setColliderPosition();
_instanceStore.updateInstances();
auto _allColliders = _instanceStore.getInstances();
auto thisIt = std::find_if(_allColliders.begin(), _allColliders.end(),
[this](Collider2d collider) { return *collider == *_this_safe; });
if (thisIt == _allColliders.end())
return;
for (auto c2 = thisIt + 1; c2 != _allColliders.end(); ++c2)
{
for (; c2 != _allColliders.end() && (!(*c2) || !(*c2)->enabled || !(*c2)->gameObject->isActive()); ++c2);
if (c2 == _allColliders.end())
return;
(*c2)->setColliderPosition();
_checkCollisionToBroadCast(***c2);
(*c2)->_checkCollisionToBroadCast(*this);
}
if (Logger::isDebugBuild())
debugDraw();
}
void ACollider2dComponent::_checkCollisionToBroadCast(ACollider2dComponent &collider)
{
bool collided = checkCollision(collider);
if (collided
&& _encountered.contains(collider.gameObject->getId())
&& _encountered[collider.gameObject->getId()])
{
_broadCastCollisionStay(collider);
}
else if (collided
&& (!_encountered.contains(collider.gameObject->getId())
|| !_encountered[collider.gameObject->getId()]) )
{
_encountered[collider.gameObject->getId()] = true;
_broadCastCollisionEnter(collider);
}
else if (!collided &&
_encountered.contains(collider.gameObject->getId())
&& _encountered[collider.gameObject->getId()])
{
_broadCastCollisionExit(collider);
_encountered[collider.gameObject->getId()] = false;
}
}
ACollider2dComponent::ACollider2dComponent(GameObject gameObject, std::string type)
:Component(type, gameObject)
{
}
ACollider2dComponent::~ACollider2dComponent()
{
}
void ACollider2dComponent::onAwake()
{
_this_safe = gameObject->getComponent<ACollider2dComponent>();
_instanceStore.registerInstance(_this_safe);
}