Objekte konvertieren? Funktioniert nicht.
Übersicht

![]() |
M0rgensternBetreff: Objekte konvertieren? Funktioniert nicht. |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey Leute.
Ich möchte grade das Waypointsystem, das ich endlich vollständig implementieren konnte, noch ein wenig verfeinern. Undzwar so, dass der Spieler auch als Ziel genommen werden kann. Dazu habe ich die Variable "twGoal" der Gegnerklasse in den "Object" Typ umgeändert. Ich überprüfe auch vorher durch Konvertierung, ob die Variable jetzt auf den SPieler oder auf einen Waypoint zeigt. Aber das funktioniert nicht. Ich bekomme folgende Meldung: Zitat: Compile Error: Identifier 'tlConnected' not found
Build Error: failed to compile F:/BlitzMax Porgramming/WIP/AlienShooter2D/Includes/EnemyClass.bmx für folgende Zeile: BlitzMax: For Local WaypCon:TWaypoint = EachIn twGoal.tlConnected Also, ich mach das folgendermaßen: BlitzMax: If (pythagoras(PPlayer.fx - pscrollx, PPlayer.fy - pscrolly, fx - pscrollx, fy - pscrolly) <= 800) Then Ihr könnt sehen, dass oben genannte Zeile dort auftaucht. Aber ihr könnt auch sehen, dass vorher überprüft wird, ob es denn ein Wegpunkt ist. Was mache ich falsch? Wäre echt toll wenn mir jemand helfen könnte. Lg, M0rgenstern |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
das problem ist das du versuchst auf eine liste zuzugreifen die es nicht gibt. Sagt dir eigentlich auch der fehler schon das es kein tlConnected auf twGoal gibt | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was der Fehler bedeutet weiß ich, aber:
Ich überprüfe vorher, ob twGoal eine Instanz vom Typ TWaypoint ist. Und die Klasse TWaypoint hat zu 100% das Attribut tlconnected. Ich habe vorher auch drauf zugegriffen. Nur da war twgoal noch vom Typ TWaypoint und jetzt ist es halt vom Typ Object, was meiner Meinung ja erstmal keinen UNterschied machen dürfte, da ich ja konvertiere, bzw überprüfe welcher Typ ihm dann zugeordnet ist. Lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wo wird tlConnected erstellt? | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also tlConnected ist ein Attribut der Waypoint Klasse:
BlitzMax: Type TWaypoint Und die Liste wird beim Laden einer Map gefüllt. Lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erst mal allgemeine Hinweise:
BlitzMax: Local iAmount:Int = 0Du willst wissen, wie viele Objekte in twGoal.tlConnected sind? --> BlitzMax: twGoal.tlConnected.Count() Der Code hinter Return wird nie erreicht, den solltest du vielleicht in REM setzen, damit das klar ist. BlitzMax: Return Wayp Kann tlConnected auch noch andere Typen enthalten? |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
robotx |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sollte funktionieren, auch wenn ich einiges aus dem Originalcode entfernt habe:
Code: SuperStrict
Type TWaypoint Global TLAllWaypoints:TList = CreateList () Global iNumber:Int = 0 Field ix:Int, iy:Int Field ID:Int Field tlConnected:TList Method New() TLAllWaypoints.AddLast(Self) End Method Function Create:TWaypoint () Local Wayp:TWaypoint = New TWaypoint Wayp.tlConnected = New TList Return Wayp End Function End Type Local wayp:TWaypoint = TWaypoint.Create () Local twGoal:Object twGoal = wayp If wayp.tlConnected <> Null Then Local iAmount:Int = 0 For Local WaypCon:TWaypoint = EachIn TWaypoint(twGoal).tlConnected iAmount:+1 Next EndIf Der Fehler lag darin, dass eine Object-Instanz nicht automatisch die Membervariablen kennt. Deshalb muss man zuvor nochmal explizit auf TWaypoint casten. mfg robotx |
||
www.botbomb.robotzgames.de
www.robotzgames.de |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, ich hab das mit dem Casten jetzt im Programm umgeschrieben.
Überall wo es um Tplayer geht habe ich das auch umgecastet etc. Aber an einer Stelle hänge ich immernoch. BlitzMax: TPlayer(twoldGoal2) = TPlayer(twOldGoal) Diese Zeile wird mir mit dem Fehler angezeigt: Zitat: Compile Error: Unable to convert from 'TWaypoint' to '<unknown>'
Build Error: failed to compile E:/BlitzMax Porgramming/WIP/AlienShooter2D/Includes/EnemyClass.bmx Das ganze steckt in folgendem Abschnitt: BlitzMax: If TPlayer(twoldgoal) Then Ich dachte mir, ich müsste beides Casten, damit es auch den gleichen Typ erhält. Lg, M0rgenstern |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was möchtest du denn damit erreichen?
BlitzMax: TPlayer(twoldGoal2) = TPlayer(twOldGoal) Eine Wertzuweisung kann es schon einmal nicht sein, da auf der linken Seite keine Variable steht. Die Fehlermeldung kommt, weil BlitzMax - vor der Kontrolle der Zuweisungen - überprüft, ob ein umcasten überhaupt möglich ist. Da twoldGoal2 ein TWaypoint ist und daher nicht zu einem TPlayer umgecastet werden kann, gibt es diese Fehlermeldung. Der Vollständigkeit halber: Casten ähnelt sehr stark dem Aufrufen einer Funktion, welche eine Referenz entgegennimmt und je nach Typ des referenzierten Objektes diese wieder als Referenz eines anderen Types zurückgibt. Aus diesem Grund ist deine Zuweisung falsch. Wenn du also sowohl Ziele von TPlayer-Objekten als auch von TWaypoint-Objekten haben möchtest, brauchst du idealerweise eine gemeinsame Basisklasse "TGoal" für beide Objektklassen. Diese stellt dann auch die nötigen Methoden bereit, um den Weg zum Ziel zu weisen. (à la "GetPosition(X:Int Var,Y:Int Var)") Vererbung kann hier einiges vereinfachen. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
robotx |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die ganzen Casts
Code: TPlayer(twoldGoal2) = TPlayer(twOldGoal) sind eigentlich überflüssig, solange twoldGoal2 bzw. auch twOldGoal vom Typ Object sind.
Eine einfache Zuweisung twoldGoal2 = twOldGoal dürfte reichen. Die Information, dass das Objekt dann vom Typ Player oder Waypoint ist, bleibt trotzdem erhalten. Du musst nur beim "Auslesen" der Variablen wissen, ob es vom Typ Waypoint oder Player sein soll und dementsprechend umwandeln. vgl. Code: TWaypoint(twGoal).tlConnected
|
||
www.botbomb.robotzgames.de
www.robotzgames.de |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group