Objekte unterschiedlicher Klassen als Funktionsparameter

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

lordlomex

Betreff: Objekte unterschiedlicher Klassen als Funktionsparameter

BeitragDo, Aug 20, 2009 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich habe folgendes Problem:

Der Compiler haut mir af die Finger wenn ich folgende funktion verwende:
(Compile Error: Identifer 'x' not found)

Code: [AUSKLAPPEN]
Function dist:Float (a:Object, b:Object)
   Return distance (a.x, a.y, b.x, b.y)
End Function


Die Funktion soll eine Entfernung verschiedener Spielobjekte zurückgeben, indem es die Koordinaten extrahiert und die Entfernung mit einer anderen Funktion berechnet.

Ich dachte er hat nur ein Problem damit, dass er nicht weiß, dass alle diese Objekte die Felder x und y haben. Also habe ich ihm eine Fake-Klasse geschrieben, um ihn ruhig zu stellen.

Code: [AUSKLAPPEN]
Type Fake
   Field x:Float
   Field y:Float
End Type

Function dist:Float (a:Fake, b:Fake)
   Return distance (a.x, a.y, b.x, b.y)
End Function


Jetzt meckert der Compiler aber, weil er versucht, meine Objekte zu diesem Fake-Typen zu konvertieren, aber nicht weis, wie (Compile Error: Unable to convert from 'Type' to 'Fake').

Weiß jemand, mit welchem Typen ich die Parameter definieren muss, damit er nicht meckert?
Oder wie ich ihm das Konvertieren beibringen kann?

Gruß
Lomex

BtbN

BeitragDo, Aug 20, 2009 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach eine Abstrakte basis-klasse für alle deine Spiel-Irgendwas-Klassen, die alle gemeinsamen felder und Member-funktionen beinhaltet.
 

lordlomex

Betreff: Danke

BeitragDo, Aug 20, 2009 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Das klingt logisch. Scheint auch zu gehen...

Danke!

Kernle 32DLL

BeitragDo, Aug 20, 2009 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst ein Object auch konvertieren wie du es mit int und Float auch z.b. kannst.

z.b. hast du die Klassen TAuto und TPflanze..

dann prüfst du nacheinander ob TAuto(object) oder TPflanze(object) Not Null ist. Dann weist du das es ein solches Objekt ist. Dann kannst du damit auch normal arbeiten. Ich hoffe das war irgendwie verständlich :/

Denk einfach daran das du mit TypeName(Objekt) genauso wie mit Int( ) oder Float( ) oder String ( ) konvertieren kannst.

So long,
Kernle
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog]
Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89
Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009

FireballFlame

BeitragDo, Aug 27, 2009 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest auch Reflection dazu verwenden Smile

BlitzMax: [AUSKLAPPEN]
Function dist:Float (a:Object, b:Object)
Return distance (GetFloatField(a,"x"),GetFloatField(a,"y"),GetFloatField(b,"x"),GetFloatField(b,"y"))
End Function



Function GetFloatField:Float(Obj:Object,Fieldname:String)
Return TTypeId.ForObject(Obj).FindField(Fieldname).GetFloat(Obj)
End Function



Die Lösung von btbn, alles zusammenfassbare in ein eigenes Type zu stecken, und davon wiederum dann die anderen abzuleiten, ist allerdings vorzuziehen ... dafür kann BMax ja OOP ^^
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group