-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathHitRegion.cpp
122 lines (110 loc) · 3.18 KB
/
HitRegion.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
Penjin is Copyright (c)2005, 2006, 2007, 2008, 2009, 2010 Kevin Winfield-Pantoja
This file is part of Penjin.
Penjin is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Penjin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with Penjin. If not, see <http://www.gnu.org/licenses/>.
*/
//-----------------------------------------------------
// Include Files
//-----------------------------------------------------
#include "HitRegion.h"
//-----------------------------------------------------
// Constructor & Destructor
//-----------------------------------------------------
HitRegion::HitRegion()
{
m_Region.x = 0;
m_Region.y = 0;
m_Region.w = 0;
m_Region.h = 0;
box.setColour(RED);
box.setThickness(1);
}
HitRegion::~HitRegion()
{
}
//-----------------------------------------------------
// Methodes
//-----------------------------------------------------
void HitRegion::init(CRint x, CRint y, CRint width, CRint height)
{
m_Region.x = x;
m_Region.y = y;
m_Region.w = width;
m_Region.h = height;
box.setPosition(x,y);
box.setDimensions(width,height);
}
void HitRegion::move(CRint x, CRint y)
{
m_Region.x += x;
m_Region.y += y;
box.setPosition(x,y);
}
void HitRegion::moveTo(CRint x, CRint y)
{
m_Region.x = x;
m_Region.y = y;
box.setPosition(x,y);
}
#ifdef PENJIN_SDL
void HitRegion::render(SDL_Surface* screen)
{
box.render(screen);
}
#endif
void HitRegion::render()
{
box.render();
}
bool HitRegion::hitTest(const HitRegion* const region) const
{
if(((region->getX() - m_Region.x) < m_Region.w && (m_Region.x - region->getX()) < region->getWidth()) &&
((region->getY() - m_Region.y) < m_Region.h && (m_Region.y - region->getY()) < region->getHeight())) return true;
return false;
}
bool HitRegion::hitTest(CollisionMap* const map, CRint x, CRint y)const
{
for(int xpos = m_Region.x - x; xpos <= m_Region.x - x + m_Region.w; ++xpos)
{
for(int ypos = m_Region.y - y; ypos <= m_Region.y - y + m_Region.h; ++ypos)
{
if(map->getCollisionType(xpos, ypos) == BLACK) return true;
}
}
return false;
}
Colour HitRegion::colourTest(CollisionMap* const map) const
{
return map->getCollisionType(m_Region.x + (m_Region.w / 2), m_Region.y + (m_Region.h / 2));
}
Colour HitRegion::colourTest(CollisionMap* const map, CRint x, CRint y)const
{
int xpos = min(m_Region.w - 1, x);
int ypos = min(m_Region.h - 1, y);
return map->getCollisionType(m_Region.x + xpos, m_Region.y + ypos);
}
int HitRegion::getX() const
{
return m_Region.x;
}
int HitRegion::getY() const
{
return m_Region.y;
}
int HitRegion::getWidth() const
{
return m_Region.w;
}
int HitRegion::getHeight() const
{
return m_Region.h;
}