Von TLink auf Objekt schliessen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Trust

Betreff: Von TLink auf Objekt schliessen

BeitragMo, Nov 26, 2012 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

wie bekomme ich von einem TLink wieder an das eigentliche Objekt meiner selbst erstellten Klasse?

Die Spielfigur sucht sich durch eine Routine den ihm am nähsten befindlichen Gegner, wurde einer gefunden, wird ein Schuss erstellt, welchem der Link vom Zielobjekt übergeben wird. Anhand diesem soll dieser Schuss zum Zielobjekt finden indem es Methoden vom Zielobjekt aufruft: Zielobjekt.GetX() und Zielobjekt.GetY(). Wurde das Ziel getroffen, soll der Schuss eine Methode zum applizieren des Schadens, vom Zielobjekt aufrufen: Zielobjekt.SubHp(self._damage) .

Ich wollte dies auf diese weise lösen, um nicht jeden Schuss auf kollision mit jedem Gegner überprüfen zu müssen.

Warum den TLink an den Schuss übergeben und nicht das eigentliche Zielobjekt?
Weil der Schuss Objekte von verschiedenen Klassen als Zielobjekt haben kann und ich vorher nicht weiss von welcher Klasse das Zielobjekt ist.
Der Schuss kann zB. von TPlayer erzeugt worden sein und TEnemy als Zielobjekt haben und umgekehrt.

Mit meinLink.Value() geht es nicht, da kommt die Fehlermeldung: "Cannot convert from Object to TEnemy".
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.

BladeRunner

Moderator

BeitragMo, Nov 26, 2012 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst du den betreffenden Code posten?

Ansonsten:
TEnemy(meinLink.Value()) schon versucht?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

kog

BeitragMo, Nov 26, 2012 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst du einen kleinen Code ausschnitt posten?

Als Tipp kann ich dir noch geben wegen dem Casten, erstelle eine Basis Klasse ala TObject und leite alle anderen Objekte davon ab (TPlayer, TEnemy) somit kannst du Standard Methoden nutzen und musst nicht vorher jede Klasse einzeln Casten.
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Trust

BeitragMo, Nov 26, 2012 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Alle Klassen ausser der Schuss (TShot) sind von einer Basisklasse TEntity abgeleitet.


Aktuell sieht der Code so aus ( welcher nicht funktioniert ):

TShot Methode zum finden des Ziels:
Beim ersten Aufruf von "targetEnemy.GetX()" kommt eine Fehlermeldung, weswegen ich den weiteren code nicht angepasst habe - deshalb steht in den darauffolgenden aufrufen noch "Self._targetLink.Value().GetY()"

BlitzMax: [AUSKLAPPEN]
' Wenn target ein Enemy
If IsEnemy(Self._targetLink.Value())
Local targetEnemy:TEnemy = Self._targetLink.Value()

' Richtung Ziel bewegen
MF_MoveTowardsPoint(Self._x, Self._y, targetEnemy.GetX(), Self._targetLink.Value().GetY(), Self._speed)
' Löschen wenn Zielposition erreicht
If MF_GetDistance(Self._x, Self._y, Self._targetX, Self._targetY) < TShot.MissedDistance
Destroy()
End If
' Wenn Zielobjekt getroffen wurde, schaden austeilen und danach den Schuss löschen
If MF_CheckDistance(Self._x, Self._y, Self._targetX, Self._targetY) < TShot.StrikeDistance
Self._targetLink.Value().SubHp(Self._damage)
Free()
End If

' Wenn target ein Tower
ElseIf IsTower(Self._targetLink.Value())

' Richtung Ziel bewegen
MF_MoveTowardsPoint(Self._x, Self._y, target.GetX(), Self._targetLink.Value().GetY(), Self._speed)
' Löschen wenn Zielposition erreicht
If MF_CheckDistance(Self._x, Self._y, Self._targetX, Self._targetY) < TShot.MissedDistance
Destroy()
End If
' Wenn Zielobjekt getroffen wurde, schaden austeilen und danach den Schuss löschen
If MF_CheckDistance(Self._x, Self._y, Self._targetX, Self._targetY) < TShot.StrikeDistance
Self._targetLink.Value().SubHp(Self._damage)
Free()
End If

End If


' Löschen wenn ausserhalb der Map
If (Self._x < -GW Or Self._x > GW) Or (Self._y < -GH Or Self._y > GH)
Free()
End If



Die Methoden die überprüfen sollen von welcher Klasse das Zielobjekt ist:
BlitzMax: [AUSKLAPPEN]
Method IsEnemy:Byte(obj:Object)
If TEnemy(obj) Return True
Return False
End Method

Method IsTower:Byte(obj:Object)
If TTower(obj) Return True
Return False
End Method


Und hier die Funktion zum erstellen eines Schusses:

BlitzMax: [AUSKLAPPEN]
Function Create(damage:Int, targetLink:TLink)
Local shot:TShot = New TShot
shot._damage = damage
shot._targetLink = targetLink
End Function



Habe schon einiges durchprobiert, obiges ist nur die aktuellste Variante.
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  • Zuletzt bearbeitet von Trust am Mo, Nov 26, 2012 23:36, insgesamt 2-mal bearbeitet

kog

BeitragMo, Nov 26, 2012 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn doch schon alle Objekte (TTower und TEnemy von TEntity abgeleitet werden), warum geht das dann nicht so:
Code: [AUSKLAPPEN]

TEntity(Self._targetLink.Value()).SubHp(Self._damage)


Da:
Code: [AUSKLAPPEN]
Local targetEnemy:TEnemy = Self._targetLink.Value()
müsstest du ja eh:
Code: [AUSKLAPPEN]
Local targetEnemy:TEnemy = TEnemy(Self._targetLink.Value())
machen?
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Trust

BeitragMo, Nov 26, 2012 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
SubHp(Self._damage) 

ist eine Methode von TEnemy und TTower usw. diese ist TEntity nicht bekannt.

Die Klasse TEntity ist wirklich komplett auf ein minimum reduziert:

BlitzMax: [AUSKLAPPEN]




' --------------------------------------------------
' Basisklasse für Entitys von der alle Entity-artigen Types abgeleitet werden können
' --------------------------------------------------
Type MF_TEntity

' Private

Field _x:Float ' x-Position
Field _y:Float ' y-Position


Field _link:TLink ' Listeneintrag


Method New()
Self._link = List.AddLast(Self)
End Method


' Public

Global List:TList = New TList

' Dieses Objekt aus der Liste entfernen und löschen
Method Free()
If Self._link
Self._link.Remove()
Self._link = Null
EndIf
EndMethod


' Setter und Getter
Method SetX(x:Float)
Self._x = x
End Method
Method SetY(y:Float)
Self._y = y
End Method

Method GetX:Float()
Return Self._x
End Method
Method GetY:Float()
Return Self._y
End Method
Method GetLink:TLink()
Return Self._link
End Method

Method Draw() Abstract
Method Update() Abstract

Function RenderAll()
For Local entity:MF_TEntity = EachIn MF_TEntity.List
entity.Update()
entity.Draw()
Next
End Function

EndType
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  • Zuletzt bearbeitet von Trust am Mo, Nov 26, 2012 21:57, insgesamt einmal bearbeitet

kog

BeitragMo, Nov 26, 2012 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
hast du die Zeile: Local targetEnemy:TEnemy = TEnemy(Self._targetLink.Value()) angepasst?

Und wenn ja was ist denn aktuell das Problem?

mfg
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Trust

BeitragMo, Nov 26, 2012 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, dass ich diese Lösung sehr umständlich finde bzw. wenn ich jetzt zB. 10 verschiedene Klassen habe die "abgeschossen" werden können, müsste ich jedesmal folgenden Code schreiben:
BlitzMax: [AUSKLAPPEN]
If IsEnemy(Self._targetLink.Value()) Then
....

ElseIf IsTower(Self._targetLink.Value()) Then
....
ElseIf IsIrgendeineKlasse Then
....
usw usw...


Da wird der Code dann mit der Zeit zu unübersichtlich.
Gibt es da keine elegantere Lösung?
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.

Holzchopf

Meisterpacker

BeitragMo, Nov 26, 2012 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, gibt es: Die subHp-Methode schon in der Basisklasse definieren.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

kog

BeitragMo, Nov 26, 2012 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wenn du bei TEntity noch eine Methode hinzufügstm, Hit(dmg)

und dann so machst
BlitzMax: [AUSKLAPPEN]
' Wenn target ein Enemy
Local target:TEntity=TEntity(Self._targetLink.Value())
If target=Null Continue Or Return

MF_MoveTowardsPoint(Self._x, Self._y, target.GetX(), target.GetY(), Self._speed)

If MF_GetDistance(Self._x, Self._y, target.GetX(), target.GetY()) < TShot.MissedDistance
Destroy()
End If

If MF_CheckDistance(Self._x, Self._y, target.GetX(), target.GetX()) < TShot.StrikeDistance
Target.hit(Self._damage)
Free()
End If

' Löschen wenn ausserhalb der Map
If (Self._x < -GW Or Self._x > GW) Or (Self._y < -GH Or Self._y > GH)
Free()
End If
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Trust

BeitragMo, Nov 26, 2012 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte die Basisklasse MF_TEntity eigentlich unberührt lassen, da sie eine Klasse aus meiner persöhnlichen StandardLib ist, darum die Namenskonvention "MF".

Aber dann muss ich wohl doch eine weitere Basisklasse von dieser Klasse ableiten, speziel für dieses Projekt.
Dachte es gibt vielleicht eine andere, bessere Lösung direkt mit TLink usw. ohne gleich mit neuen Klassen um sich zu schmeißen, nur um diese um so kleine Sachen zu erweitern.

Vielen Dank für eure Hilfe Smile
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.

kog

BeitragMo, Nov 26, 2012 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo dann empfehle ich dir auch, in jedem Projekt eine TEntity klasse von MF_TEntity abzuleiten, dann ist alles sauber;)
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Trust

BeitragDi, Nov 27, 2012 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, werde ich jetzt auch immer so machen. Danke Wink
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group