Ik ben een simpel "bordspel" aan het maken waarbij de speler "machines" en "shapes" op een spelbord plaatst en dan op "play" drukt om het resultaat van de opstelling te zien. Voor een voorbeeld van wat ik bedoel: zie "The Sequence" op iOS.
Iedere game loop moeten de machines op het bord hun werk doen, dat heb ik geïmplementeerd door een simpele loop over alle "GameObjects" en het aanroepen van een update() functie:
Nu is het probleem dat deze update() functions direct de game state muteren. De "conveyor" machine doet bijvoorbeeld het volgende:
Als er nu twee van deze naast elkaar staan dan verplaatsen ze alle "entities" twee vakjes in één game loop in plaats van één (de tweede update() function ziet het bord na de mutatie van de eerste function en doet direct zijn ding op de gewijzigde board state).
De vraag is nu: Hoe pak ik dit aan?
Iedere game loop moeten de machines op het bord hun werk doen, dat heb ik geïmplementeerd door een simpele loop over alle "GameObjects" en het aanroepen van een update() functie:
C++:
1
2
3
| for(auto& go: gameObjects) { go->update(); } |
Nu is het probleem dat deze update() functions direct de game state muteren. De "conveyor" machine doet bijvoorbeeld het volgende:
C++:
1
2
3
4
5
6
7
8
9
| void Conveyor::update() { switch(direction) { case Left: moveEntitiesTo((*ownerPuzzle)(ownerTile->x-1, ownerTile->y)); break; case Right: moveEntitiesTo((*ownerPuzzle)(ownerTile->x+1, ownerTile->y)); break; |
Als er nu twee van deze naast elkaar staan dan verplaatsen ze alle "entities" twee vakjes in één game loop in plaats van één (de tweede update() function ziet het bord na de mutatie van de eerste function en doet direct zijn ding op de gewijzigde board state).
De vraag is nu: Hoe pak ik dit aan?
- De hele board state kopiëren. Hierdoor krijg ik nieuwe pointers naar alle tiles en moeten alle views geupdate worden met die nieuwe pointers (er is een view object voor elke Tile). Lijkt me minder handig.
- Two-phase update: update() functies een function laten returnen die de daadwerkelijke update doet. Nadat al die functies verzameld zijn, allemaal uitvoeren. Lastig om precies ditzelfde probleem te vermijden in de update functies.
- In plaats van de "machines", de "entities" updaten. Daarvoor moeten entities dan naar het vakje kijken waar ze op staan en de machines op zichzelf laten opereren. Dat gaat lastig worden wanneer een machine op meerdere objecten moet werken of wanneer ik objecten wil samenvoegen of splitsen.
- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!