Skip to content

Commit 8975ced

Browse files
committed
fixed event trigger
1 parent b9103f4 commit 8975ced

File tree

7 files changed

+64
-68
lines changed

7 files changed

+64
-68
lines changed

include/Engine.h

+1-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#include <tmx/TileLayer.h>
77

88
#include <QList>
9-
#include <QHash>
109
#include <QSet>
1110

1211
class Game;
@@ -22,13 +21,11 @@ protected slots:
2221
void mapChanged();
2322
protected:
2423
Game* _game;
25-
QHash<AnimatedObject*, QSet<EventTrigger*>> _currentTriggers;
2624

2725
void moveObjects(double delta);
2826
void moveObject(AnimatedObject* object, double delta);
2927

30-
void checkTriggers(AnimatedObject* object);
31-
QSet<EventTrigger*> triggersFor(AnimatedObject* object);
28+
void checkTriggers(AnimatedObject* object, QSet<EventTrigger*>& currentTriggers);
3229

3330
tmx::TileLayer* walkableLayer();
3431
bool canBeAt(AnimatedObject* object, const QPointF& pos);

include/EventTrigger.h

+1-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#include <QSize>
88
#include <QRectF>
99
#include <QHash>
10-
#include <QSet>
1110

1211
#include <tmx/Object.h>
1312

@@ -28,10 +27,9 @@ class EventTrigger : public QObject
2827
const QSize& size() const;
2928
void setSize(const QSize& size);
3029

31-
void ignore(AnimatedObject* object);
30+
bool intersects(const QRectF& rect);
3231

3332
void enter(AnimatedObject* object);
34-
void move(AnimatedObject* object);
3533
void exit(AnimatedObject* object);
3634
signals:
3735
void triggered(MapEvent* event);
@@ -41,7 +39,6 @@ class EventTrigger : public QObject
4139
QString _name;
4240
QString _type;
4341
QHash<QString, QString> _properties;
44-
QSet<AnimatedObject*> _ignored;
4542

4643
void trigger(AnimatedObject* object);
4744
void trigger(MapEvent* event);

include/Game.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <QKeyEvent>
44
#include <QSet>
55
#include <QHash>
6+
#include <QQueue>
67

78
#include <GameRenderer.h>
89
#include <Engine.h>
@@ -34,7 +35,7 @@ class Game : public QObject
3435
signals:
3536
void mapChanged();
3637
protected slots:
37-
void processMapEvent(MapEvent* event);
38+
void queueMapEvent(MapEvent* event);
3839
protected:
3940
Map* _currentMap;
4041
Player _player;
@@ -43,6 +44,10 @@ protected slots:
4344
QHash<QString, Map*> _maps;
4445
Engine* _engine;
4546
GameRenderer* _renderer;
47+
QQueue<MapEvent*> _mapEvents;
48+
49+
void processMapEvents();
50+
void handleMapEvent(MapEvent* event);
4651

4752
Map* obtainMap(const QString& name);
4853
};

src/Engine.cpp

+27-33
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ Engine::Engine(Game* game)
1515

1616
void Engine::mapChanged()
1717
{
18-
for (EventTrigger* trigger: _currentTriggers[_game->player()]) trigger->exit(_game->player());
19-
_currentTriggers.clear();
20-
for (EventTrigger* trigger: _game->currentMap()->triggersIn(_game->player()->rect())) trigger->ignore(_game->player());
2118
}
2219

2320
void Engine::update(double delta)
@@ -48,14 +45,14 @@ void Engine::moveObject(AnimatedObject* object, double delta)
4845

4946
QList<QPointF> points = wayPoints(object, distance);
5047

48+
QSet<EventTrigger*> currentTriggers = _game->currentMap()->triggersIn(object->marginedRect());
49+
5150
for (const QPointF point: points)
5251
{
5352
if (canBeAt(object, point) || !canBeAt(object, object->position()))
5453
{
5554
object->setPosition(point);
56-
checkTriggers(object);
57-
58-
if (object->position()!=point) break;
55+
checkTriggers(object, currentTriggers);
5956
}
6057
else
6158
{
@@ -65,43 +62,33 @@ void Engine::moveObject(AnimatedObject* object, double delta)
6562
}
6663
}
6764

68-
void Engine::checkTriggers(AnimatedObject* object)
65+
void Engine::checkTriggers(AnimatedObject* object, QSet<EventTrigger*>& currentTriggers)
6966
{
70-
if (!object->isPlayer()) return;
71-
72-
QSet<EventTrigger*> oldTriggers = _currentTriggers[object];
73-
QSet<EventTrigger*> newTriggers = _game->currentMap()->triggersIn(object->rect());
67+
QSet<EventTrigger*> newTriggers = _game->currentMap()->triggersIn(object->marginedRect());
7468

75-
for (EventTrigger* trigger: newTriggers-oldTriggers)
69+
if (object->isPlayer())
7670
{
77-
trigger->enter(object);
78-
}
79-
for (EventTrigger* trigger: newTriggers)
80-
{
81-
trigger->move(object);
71+
newTriggers.clear();
72+
for (EventTrigger* trigger: _game->currentMap()->triggersIn(object->marginedRect()))
73+
{
74+
if (trigger->intersects(object->marginedRect()))
75+
{
76+
newTriggers<<trigger;
77+
}
78+
}
8279
}
83-
for (EventTrigger* trigger: oldTriggers-newTriggers)
80+
81+
82+
for (EventTrigger* trigger: currentTriggers-newTriggers)
8483
{
8584
trigger->exit(object);
8685
}
87-
_currentTriggers[object] = _game->currentMap()->triggersIn(object->rect());
88-
}
89-
90-
QSet<EventTrigger*> Engine::triggersFor(AnimatedObject* object)
91-
{
92-
QSet<EventTrigger*> triggers;
93-
QRectF objectRect = object->marginedRect();
94-
double objectArea = objectRect.width()*objectRect.height();
95-
for (EventTrigger* trigger: _game->currentMap()->triggersIn(objectRect))
86+
for (EventTrigger* trigger: newTriggers-currentTriggers)
9687
{
97-
QRectF triggerRect = trigger->rect();
98-
double triggerArea = triggerRect.width()*triggerRect.height();
99-
QRectF intersected = trigger->rect().intersected(objectRect);
100-
double intersectedArea = intersected.width()*intersected.height();
101-
if (intersectedArea/qMin(objectArea, triggerArea)>0.5) triggers << trigger;
88+
trigger->enter(object);
10289
}
10390

104-
return triggers;
91+
currentTriggers = newTriggers;
10592
}
10693

10794
tmx::TileLayer* Engine::walkableLayer()
@@ -174,6 +161,13 @@ QList<QPointF> Engine::wayPoints(AnimatedObject* object, double distance)
174161
}
175162
}
176163

164+
QSize mapSize = _game->currentMap()->internalMap()->pixelSize();
165+
if (horizontal) {
166+
positions << 0 << mapSize.width();
167+
} else {
168+
positions << 0 << mapSize.height();
169+
}
170+
177171
if (ascending)
178172
{
179173
qSort(positions.begin(), positions.end(), qLess<double>());

src/EventTrigger.cpp

+8-22
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,9 @@ void EventTrigger::trigger(MapEvent* event)
5151
emit(triggered(event));
5252
}
5353

54-
void EventTrigger::ignore(AnimatedObject* object)
55-
{
56-
_ignored << object;
57-
}
58-
5954
void EventTrigger::trigger(AnimatedObject* object)
6055
{
61-
// qDebug() << "trigger"<<_type << _name;
62-
63-
if (_ignored.contains(object)) return;
56+
qDebug() << "trigger"<<_type << _name;
6457

6558
if (_type=="changemap")
6659
{
@@ -71,35 +64,28 @@ void EventTrigger::trigger(AnimatedObject* object)
7164
{
7265
trigger(new TeleportEvent(object, _properties["target"]));
7366
}
74-
75-
_ignored << object;
7667
}
7768

7869
void EventTrigger::enter(AnimatedObject* object)
7970
{
8071
// qDebug() << "enter"<<_type << _name;
72+
trigger(object);
8173
}
8274

83-
void EventTrigger::move(AnimatedObject* object)
75+
bool EventTrigger::intersects(const QRectF& rect)
8476
{
85-
// qDebug() << "move"<<_type << _name;
77+
QRectF triggerRect = this->rect();
8678

87-
QRectF objectRect = object->marginedRect();
88-
double objectArea = objectRect.width()*objectRect.height();
79+
if (triggerRect.contains(rect)) return true;
8980

90-
QRectF triggerRect = rect();
91-
double triggerArea = triggerRect.width()*triggerRect.height();
92-
QRectF intersected = triggerRect.intersected(objectRect);
93-
double intersectedArea = intersected.width()*intersected.height();
81+
QRectF intersected = triggerRect.intersected(rect);
9482

95-
double ratio = intersectedArea/qMin(objectArea, triggerArea);
83+
double p = qMax(intersected.width()/triggerRect.width(), intersected.height()/triggerRect.height());
9684

97-
if (ratio>0.5) trigger(object);
85+
return p>0.5;
9886
}
9987

10088
void EventTrigger::exit(AnimatedObject* object)
10189
{
10290
// qDebug() << "exit" << _type << _name;
103-
104-
_ignored.remove(object);
10591
}

src/Game.cpp

+20-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Game::~Game()
2222
void Game::update(double delta)
2323
{
2424
_engine->update(delta);
25+
processMapEvents();
2526
}
2627

2728
void Game::render(QPainter& painter)
@@ -91,18 +92,33 @@ void Game::handleKeyRelease(QKeyEvent* event)
9192
}
9293
}
9394

94-
void Game::processMapEvent(MapEvent* event)
95+
void Game::queueMapEvent(MapEvent* event)
96+
{
97+
_mapEvents.enqueue(event);
98+
}
99+
100+
void Game::processMapEvents()
101+
{
102+
while (!_mapEvents.isEmpty())
103+
{
104+
MapEvent* event = _mapEvents.dequeue();
105+
handleMapEvent(event);
106+
delete event;
107+
}
108+
}
109+
110+
void Game::handleMapEvent(MapEvent* event)
95111
{
96112
if (MapChangeEvent* e = dynamic_cast<MapChangeEvent*>(event))
97113
{
98114
changeMap(e->mapName(), e->target());
115+
_mapEvents.clear();
99116
}
100117
else if (TeleportEvent* e = dynamic_cast<TeleportEvent*>(event))
101118
{
102119
_currentMap->moveObjectToTarget(e->trigger(), e->target());
120+
_mapEvents.clear();
103121
}
104-
105-
delete event;
106122
}
107123

108124
Map* Game::currentMap()
@@ -138,7 +154,7 @@ Map* Game::obtainMap(const QString& name)
138154
{
139155
Map* map = new Map("data/maps/"+name+".tmx");
140156
map->initialize(_npcFactory);
141-
connect(map, SIGNAL(eventTriggered(MapEvent*)), this, SLOT(processMapEvent(MapEvent*)));
157+
connect(map, SIGNAL(eventTriggered(MapEvent*)), this, SLOT(queueMapEvent(MapEvent*)));
142158
_maps.insert(name, map);
143159
}
144160

src/Map.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ QSet<EventTrigger*> Map::triggersIn(const QRectF& rect) const
8989
for (EventTrigger* trigger: _triggers)
9090
{
9191
if (trigger->rect().intersects(rect))
92+
// if (trigger->intersects(rect))
9293
{
9394
triggers << trigger;
9495
}

0 commit comments

Comments
 (0)