Pointer ohne den genauen Objekttyp zu kennen?
Übersicht

walskiEhemaliger AdminBetreff: Pointer ohne den genauen Objekttyp zu kennen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey,
ich habe mich in den letzten Wochen bisher leider nur sehr wenig mit BMax beschäftigen können, ich hoffe ihr verzeiht die vielleicht etwas dumme Frage. Angenommen ich habe ein abstraktes Objekt für alle "Obstacles" in nem Spaceshooter. Dieses wird sowohl von einem reinen Hindernis wie einem Kometen, aber auch von einem Power-Up geerbt. Dies hat nun eine abstrakte Klasse "onCollision" die mit einem Pointer auf das kollidierende Objekt aufgerufen. Bei dem Kometen würde dann eben etwas vom Health des Objektes, auf das gezeigt wird abgezogen, bei einem Power-Up würde beispielsweise die Waffe des Spielers erhöht. Kann ich es jetzt irgendwie sinnvoll, per Exception oder so lösen, dass ich sowas mach wie: Code: [AUSKLAPPEN] if PointerWiederZuNemObjektGemacht\waffenstärke exists do blabla Wenn also einfach ein Komet mit dem Power-Up kollidiert soll halt nichts passieren, und wenn ein Spieler das Power-Up einsammelt soll etwas passieren. Mir kommt es dabei jetzt vor allem darauf an, ob man irgendwie prüfen kann welche Felder ein zurückgenudeltes Objekt hat, von dem man nur den Pointer kannte, oder muss man genau dessen Typ kennen? Nochmal: Es geht nicht um eine Problemlösung des Beispiels, dass ich das auch anders lösen kann ist mir klar. ![]() Danke walski |
||
buh! |
Black |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Soweit ich weiss (wenn ich mich noch recht erinnere) funktioniert das Zurück-"casten" eines Base-Referenz (ist ja kein Zeiger) zum ursrpünglichen Type nur dann, wenn das Objekt auch eine Instanz dieses Types ist, sonst wird Null zurückgeliefert.
Also kannst du so ganz einfach den Typ deines Objekts herausfinden. [Oder du machst, dass was man auch in C++ macht(, wenn man kein RTTI benutzen will), du leitest alle deine Spielobjekte von einem Type ab, der ein entityType Field hat und überprüfst den Objekttyp manuell.] |
||
Nemesis |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich bin mir jetzt nicht ganz sicher ob ich deine frage verstanden habe,
Ich würede sagen jedes Objekt ( Koment , Power Up ) über schreibt die onColision's routine vom base object und tut somitbei einem aufruf genau das was da drinn steht. |
||
![]() |
DivineDominion |
![]() Antworten mit Zitat ![]() |
---|---|---|
ISt nicht ganz trivial... Müsstest dir eine anständige Struktur bauen. LEicht wärs z.B. wenn du alle Fliegedingsis von TFliegedingsi ableitest und der player nur der player ist.
Alle Items und überhaupt fliegen dann so umher. Musst Kollision da dann auch abstrahieren und für das einzelne Objekt definieren. Oder du denkst dir da was anderes aus und rufst das nicht blind auf sondern schaust vorher eben nach dem Type, zu dem die Instanz gehört: Code: [AUSKLAPPEN] if TPowerup( irgendeinObstacle ) then jep_isses() Strukturmäßig würd ich das vielleicht so lösen: Code: [AUSKLAPPEN] Type TObstacle Abstract
Field _x:int, _y:int field _hImage:TImage method isColliding( x:int, y:int, w:int, h:int ) return overlap( x, y, w, h, _x, _y, _hImage.width, _hImage.height ) end method Method onCollision( ) abstract method draw( ) Drawimage _hImage, _x, _y end method end type Type TPowerup Extends TObstacle method onCollisionWith( hObj:Object ) local hPlayer:TPlayer = TPlayer( hObj ) if not hPlayer then return hPlayer.giveWeapon( WEAPON_MASSENVERNICHTUGNSWAFFE ) End method end type Function overlap:Int( x1:Int, y1:Int, w1:Int, h1:Int, x3:Int, y3:Int, w2:Int, h2:Int ) Local x2:Int = x1 + w1, y2:Int = y1 + h1 Local x4:Int = x3 + w2, y4:Int = y3 + h2 'If ( x1 < x4 ) And ( x3 < x2 ) And ( y1 < y4 ) And ( y3 < y2 ) Then Return True 'Return False Return ( x1 < x4 ) And ( x3 < x2 ) And ( y1 < y4 ) And ( y3 < y2 ) EndFunction hoffe das ist nicht zu wirr ![]() |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
Serge |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja du kannst einfach abfragen ob ein Objekt ein bestimmtes Type ist.
Code: [AUSKLAPPEN] if powerUP(daskollidierteobjekt) then do this endif |
||
http://www.dark-matter-soft.de |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group