[C++] Dynamische object instanties maken

Pagina: 1
Acties:

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 22-04 10:23

Sponge

Serious Game Developer

Topicstarter
Ik kan even geen goede titel bedenken, maar ik op dit moment met een 'probleem' waar ik even niet uit kom :).

Ik ben bezig met een 3D spel, en heb nu een lijstje met gebouwen die gebouwt kunnen worden. Ik kan echter geen goede methode bedenken hoe ik netjes een nieuwe instantie kan maken van een object als ik op een knop druk om het gebouw te kunnen plaatsen.
  • Gebouw is klaar
  • Gebruiker klikt op plaatje, en plaatst het gebouw ergens
  • Nu moet er dus een nieuwe instantie komen van het desbetreffense gebouw.
Er wordt gebruik gemaakt van inheritance:
code:
1
2
3
4
5
6
7
Actor (root object)
|
|-- A
|   |
|   ---B
|
|---C

De C++ versie ik gebruik is VC7.1 trouwens.

Uiteraard kan ik wel een methode bedenken om dit te doen. Maar ik zou het graag netjes willen houden, en dat ik niet een mega lijst krijg van een if...then of switch clausule.

Mijn doel is om eenmalig een lijst/map/vector/iets te maken met gebouwen die te bouwen zijn, en vanaf daar af werk. Dat ik daar dus bijvoorbeeld het bijbehorende object op zoek.


Zelf heb ik tot nutoe deze verschillende manieren bedacht:

1)
Via de scripting taal een nieuw instantie van het object maken en doorgeven aan de C++ code.
Ik denk alleen dat het gehele object over de stack komt, en daar zit ik dus niet op te wachten.
Het voordeel is echter dat de interface code aardig los blijft van de C++ code, en dat als ik een compleet nieuw gebouw programmeer, het weinig invloed heeft op de C++ code.

2)
Bij het opstarten een map<naam,object> of map<naam,object*> maken van de namen, en daar een instantie/pointer in gooien. Wanneer ik een nieuw gebouw plaats zoek ik in de map de jusite naam, en maak ik een instantie/kopie van het desbetreffende object.
Het vullen van de map kan automatisch door gebruikt te maken van RTTI, en een (this*) - Denk ik.

3)
Handmatig een grote lijst van if...then of switches en daarbij alle objecten maken

4)
Misschien is het mogelijk om een instance te maken van het root object en dat te upcasten dmv. de string naam naar een A of B object?

Maar er zijn vast betere methodes. En ik kom er even niet uit. Heeft iemand anders nog andere creatieve ideeen? En ik hoop dat ikwat duidelijk ben geweest :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:16
Eén woord: polymorphisme.

Check ook dit topic van gisteren:
[rml][ C++] Method in een class vervangen @ runtime[/rml]

[ Voor 33% gewijzigd door whoami op 20-11-2005 11:22 ]

https://fgheysels.github.io/


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Nog een woord: Factory design pattern :) (of zin oid... dat komt min of meer neer op jouw punt 2)

[ Voor 26% gewijzigd door Zoijar op 20-11-2005 11:29 ]


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 22-04 10:23

Sponge

Serious Game Developer

Topicstarter
Hm, ik weet niet zeker of dat op gaat. Door mijn onoplettenheid heb ik het alleen over gebouwen in m'n TS, terwijl er dus ook nog units zijn.

En een unit heeft heeft heel andere functies dan een gebouw (die hoeft niet te rennen en te schieten :P). Uiteraard kan ik een zooi functies 'pure' maken, maar dat is dan ook niet "je van het".

Dus ik kan volgens mij niet gewoon instanties maken van het root object, omdat ik dan de onderliggende functies niet heb die specifiek zijn voor een unit/gebouw.

Tenzij ik je helemaal verkeerd begrijp uiteraard :) ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:16
Sponge schreef op zondag 20 november 2005 @ 11:36:
[...]


Hm, ik weet niet zeker of dat op gaat. Door mijn onoplettenheid heb ik het alleen over gebouwen in m'n TS, terwijl er dus ook nog units zijn.

En een unit heeft heeft heel andere functies dan een gebouw (die hoeft niet te rennen en te schieten :P). Uiteraard kan ik een zooi functies 'pure' maken, maar dat is dan ook niet "je van het".
Een gebouw hoeft toch niet van dezelfde class te inheriten als een unit ?
In C++ heb je toch multiple inheritance, dus, je zou een abstracte class kunnen maken die zorgt voor het 'bouwen', en een base class (abstract) unit.
Een gebouw kan je dan bv enkel laten overerven van die 'Buildable' class, een unit kan je laten overerven van 'Buildable' en 'Unit'. (De verplaats en schiet functionaliteit zit 'm dan in Unit).

https://fgheysels.github.io/


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 22-04 10:23

Sponge

Serious Game Developer

Topicstarter
Ik werk volgens het systeem zoals men het bij UT ook gedaan heeft, vanwege de vele praktische kanten :).

Er is een root object, met basis info (positie, rotatie, renderable, you name it), en vanaf daar werk je naar beneden. Voordat je bij een unit bent heb je dus Actor->NPC->unit, en ditto voor een gebouw (Actor->Building->gebouw).

En je bent me nu even kwijt met multiple inheritance (tenzij je class X: public A, public B bedoelt). Want dat lost het probleem (denk ik) niet op: Ik heb nog steeds een probleem bij het bouwen van een gebouw, gebaseerd op een event in de GUI, waar ik alleen een string als userdata kan krijgen.

Het is dan ook een lastig probleem waar ik al een tijdje het over heb zitten denken. :)

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 22-04 10:23

Sponge

Serious Game Developer

Topicstarter
Nadat ik vandaag met wat anders bezig ben geweest, heb ik zojuist op gamedev zitten te googlen (Had ik eerder moeten doen, eigenlijk.. het lijkt me een vaak voorkomend probleem met game development), ben ik zojuist op de woorden "class factories" en "pluggable factories" gekomen. En dat is waar ik nu verder mee ga experimenteren :).

Grappige is dat het volgens mij inderdaad een map<> gebruikt, en dat ik toch al aardig op weg was ;).

Zal hier een update gooien als het naar behoren werkt :).

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

ja, zoals ik dus al zei: factory design pattern. Je moet wel de replies lezen/gebruiken heh, anders heeft het geen nut :)

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 22-04 10:23

Sponge

Serious Game Developer

Topicstarter
Zoijar schreef op maandag 21 november 2005 @ 02:40:
ja, zoals ik dus al zei: factory design pattern. Je moet wel de replies lezen/gebruiken heh, anders heeft het geen nut :)
Mja, maar dat resulteert in wat minder abstracte resultaten op google ;). Maar iig thanks :). Ik had er misschien iets meer naar moeten kijken
Pagina: 1