Pointer ohne den genauen Objekttyp zu kennen?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

walski

Ehemaliger Admin

Betreff: Pointer ohne den genauen Objekttyp zu kennen?

BeitragSo, Apr 03, 2005 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile

Danke

walski
buh!
 

Black

BeitragSo, Apr 03, 2005 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 03, 2005 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 03, 2005 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

Serge

BeitragDi, Apr 05, 2005 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group