Objekte konvertieren? Funktioniert nicht.

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Objekte konvertieren? Funktioniert nicht.

BeitragSa, Mai 01, 2010 1:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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
NewGoal = PPlayer
Else
If TPlayer(twGoal) Then
Local iSmallest:Int
Local iFirst:Int = 0
Local NewGoal:TWaypoint '= New TWaypoint

For Local Wayp:TWaypoint = EachIn TWaypoint.TLAllWaypoints

Local wx:Int, wy:Int
wx = Wayp.ix * itilesize - pscrollx
wy = Wayp.iy * itilesize - pscrolly

If iFirst = 0 Then
iSmallest = Pythagoras(wx, wy, fx, fy)
iFirst = 1
NewGoal = Wayp
ElseIf iFirst = 1 Then
If (Pythagoras(wx, wy, fx, fy) < iSmallest) Then
iSmallest = Pythagoras(wx, wy, fx, fy)
NewGoal = Wayp
EndIf
EndIf
Next

ElseIf TWaypoint(twGoal) Then

Repeat
Local iAmount:Int = 0

For Local WaypCon:TWaypoint = EachIn twGoal.tlConnected
iAmount:+1
Next

Local INumber:Int = Rand(0, iamount)

tries:+1


Local IsNumber:Int = 0

For Local WaypCon:TWaypoint = EachIn twGoal.tlConnected
IsNumber:+1
If IsNumber = INumber Then
NewGoal = WaypCon
iset = 1
EndIf
Next

If ((NewGoal = twOldGoal) Or (NewGoal = twGoal) Or (NewGoal = twoldGoal2)) Then
iset = 0
End If

Until ((tries > 30) Or (iset = 1))
EndIf
EndIf


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

BeitragSa, Mai 01, 2010 2:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 01, 2010 10:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragSa, Mai 01, 2010 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

M0rgenstern

BeitragSa, Mai 01, 2010 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Also tlConnected ist ein Attribut der Waypoint Klasse:

BlitzMax:
Type TWaypoint
Global TLAllWaypoints:TList = New TList
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(px:Int, py:Int, pID:Int = 0)

Local Wayp:TWaypoint = New TWaypoint
Wayp.ix = px
Wayp.iy = py
If pID = 0 Then
iNumber:+1
Wayp.ID = iNumber
ElseIf pID <> 0 Then
Wayp.ID = pID
EndIf

Wayp.tlConnected = New TList

Return Wayp


For Local Way:TWaypoint = EachIn TLAllWaypoints
If Way.ID > iNumber Then iNumber = Way.ID
Next
End Function


Und die Liste wird beim Laden einer Map gefüllt.

Lg, M0rgenstern

Xeres

Moderator

BeitragSa, Mai 01, 2010 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst mal allgemeine Hinweise:
BlitzMax:
Local iAmount:Int = 0
For Local WaypCon:TWaypoint = EachIn twGoal.tlConnected
iAmount:+1
Next
Du 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

For Local Way:TWaypoint = EachIn TLAllWaypoints
If Way.ID > iNumber Then iNumber = Way.ID
Next


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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

robotx

BeitragSa, Mai 01, 2010 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 01, 2010 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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
TPlayer(twoldGoal2) = TPlayer(twOldGoal)
ElseIf TWaypoint(twoldgoal) Then
TWaypoint(twoldGoal2) = TWaypoint(twOldGoal)
EndIf

If TPlayer(twgoal) Then
TPlayer(twOldGoal) = TPlayer(twGoal)
ElseIf TWaypoint(twgoal)
TWaypoint(twOldGoal) = TWaypoint(twGoal)
EndIf

If TPlayer(newgoal) Then
TPlayer(twGoal) = TPlayer(NewGoal)
ElseIf TWaypoint(newgoal) Then
TWaypoint(twGoal) = TWaypoint(NewGoal)
EndIf


Ich dachte mir, ich müsste beides Casten, damit es auch den gleichen Typ erhält.

Lg, M0rgenstern

mpmxyz

BeitragSa, Mai 01, 2010 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 01, 2010 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group