Beste mede-tweakers,
Ik ben nu een tijdje bezig met C++ te ontdekken en wilde iets met event gestuurde applicaties doen. Ik heb nu een klein 'spelletje' gemaakt waar de volgende klassen hebt:
Hierboven zie je de hierachie van mijn klassen. Man erft van Ai en Ai van EventHandler. Je snapt het wel.Als ik een Event wil rondsturen dan gaat dat via EventControl->SendEvent(event). EventControl kijkt dan welke pointers van een EventHandler geregistreerd zijn (de luisteraars) en stuurt dan naar al die instanties het event door. Binnen de klassen kan ik dat event dan weer afvangen.
Het probleem nu is dat ik wil dat Man en Vrouw met elkaar botsen. Op dit moment zijn het 2x TPanel met een TImage erin die een bepaalde richting hebben zoals X+ of Y-. Ze bewegen over het grid van de klasse Bord. Ik heb het nu zover dat om een bepaalde interval een event E_PING wordt gestuurd naar elke Man en Vrouw. Deze E_PING stuurt daarna een E_POS door naar de andere Mannen en Vrouwen met als argumenten van het event de huidige positie op het grid van de instantie die het event stuurt. Door de positie nu af te vangen in andere instanties en te controleren of ze gaan botsen aan de hand van hun X en Y positie kun je ze , wanneer een collision dreigt , een andere richting geven.
Wat er nu gebeurd is dat inderdaad 1 van de 2 instanties ziet dat hij gaat botsen en zijn richting wijzigt. De andere instantie krijgt pas later dat bericht en weet dus niets van een collision op zijn pad en blijft rustig doorlopen.
De vraag komt dus een beetje neer op: Hoe krijgt ik het voor elkaar dat ze bij de controle op collision bij 1 van de 2 instanties beide de richting al wijzigen. Eigenlijk moet ik dus de pointer naar de klasse Man of Vrouw meegeven met het event E_POS zodat ik niet alleen van de ontvanger E_POS de richting kan wijzigen maar ook van de verstuurder?
Hieronder is EventHandlerFunc de functie die de events afvangt wanneer ze rondgestuurd worden. Ik weet dat sommige dingen misschien wat netter kunnen maar het gaat me even om de interactie tussen die 2 klassen. PosX en posY zijn de locaties op het grid. Event &e en zijn variablen is een struct die gestuurd wordt en zo parameters aan het event kan hangen.
Alvast bedankt,
Michel
Ik ben nu een tijdje bezig met C++ te ontdekken en wilde iets met event gestuurde applicaties doen. Ik heb nu een klein 'spelletje' gemaakt waar de volgende klassen hebt:
code:
1
2
3
4
5
6
7
| class EventControl
class EventHandler
class Bord
class Ai
class Man
class Vrouw |
Hierboven zie je de hierachie van mijn klassen. Man erft van Ai en Ai van EventHandler. Je snapt het wel.Als ik een Event wil rondsturen dan gaat dat via EventControl->SendEvent(event). EventControl kijkt dan welke pointers van een EventHandler geregistreerd zijn (de luisteraars) en stuurt dan naar al die instanties het event door. Binnen de klassen kan ik dat event dan weer afvangen.
Het probleem nu is dat ik wil dat Man en Vrouw met elkaar botsen. Op dit moment zijn het 2x TPanel met een TImage erin die een bepaalde richting hebben zoals X+ of Y-. Ze bewegen over het grid van de klasse Bord. Ik heb het nu zover dat om een bepaalde interval een event E_PING wordt gestuurd naar elke Man en Vrouw. Deze E_PING stuurt daarna een E_POS door naar de andere Mannen en Vrouwen met als argumenten van het event de huidige positie op het grid van de instantie die het event stuurt. Door de positie nu af te vangen in andere instanties en te controleren of ze gaan botsen aan de hand van hun X en Y positie kun je ze , wanneer een collision dreigt , een andere richting geven.
Wat er nu gebeurd is dat inderdaad 1 van de 2 instanties ziet dat hij gaat botsen en zijn richting wijzigt. De andere instantie krijgt pas later dat bericht en weet dus niets van een collision op zijn pad en blijft rustig doorlopen.
De vraag komt dus een beetje neer op: Hoe krijgt ik het voor elkaar dat ze bij de controle op collision bij 1 van de 2 instanties beide de richting al wijzigen. Eigenlijk moet ik dus de pointer naar de klasse Man of Vrouw meegeven met het event E_POS zodat ik niet alleen van de ontvanger E_POS de richting kan wijzigen maar ook van de verstuurder?
Hieronder is EventHandlerFunc de functie die de events afvangt wanneer ze rondgestuurd worden. Ik weet dat sommige dingen misschien wat netter kunnen maar het gaat me even om de interactie tussen die 2 klassen. PosX en posY zijn de locaties op het grid. Event &e en zijn variablen is een struct die gestuurd wordt en zo parameters aan het event kan hangen.
C:
1
2
3
4
5
| struct Event { int Type; int number,number2; int direction; }; |
C:
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
| void EventHandlerFunc(const Event &e) { int direction = 0; this->posY = this->panel->Left / gridSize; this->posX = this->panel->Top / gridSize; switch (e.Type) { case E_PING: if (this->dirX == '+' && this->dirY == '0') { direction = 1; } if (this->dirX == '-' && this->dirY == '0') { direction = 2; } if (this->dirY == '+' && this->dirX == '0') { direction = 3; } if (this->dirY == '-' && this->dirX == '0') { direction = 4; } ec->SendEvent(E_POS,this->posX,this->posY,direction); break; case E_POS: switch (e.direction) { case 1: if ((this->posX + 1) == e.number) { this->dirX = '-'; this->dirY = '0'; } break; case 2: if ((this->posX - 1) == e.number) { this->dirX = '+'; this->dirY = '0'; } break; case 3: if ((this->posY + 1) == e.number2) { this->dirY = '-'; this->dirX = '0'; } break; case 4: if ((this->posY - 1) == e.number2) { this->dirY = '+'; this->dirX = '0'; } break; } break; } |
Alvast bedankt,
Michel