[GELÖST] Als Methodenparameter eine Funktion?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] Als Methodenparameter eine Funktion?

BeitragSa, Okt 12, 2013 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich habe ein Problem: Ich habe eine Klasse TTile, diese sieht wie folgt aus BlitzMax: [AUSKLAPPEN]
Type TTile
Field TileID:Int
Field Action:Byte '0 = Normales Tile, 1 = Kollisionstile, 2 = Actiontile
Field ActionEvent:Int ' "Event"

Function Create:TTile(TileID:Int, Action:Byte, ActionEvent:Int)
Local ReturnMe:TTile = New TTile
ReturnMe.TileID = TileID
ReturnMe.Action = Action
ReturnMe.ActionEvent = ActionEvent
Return ReturnMe
End Function

Method Exec()
If(Self.Action = 2)
Select Self.ActionEvent
Case 0
'...
End Select
EndIf
End Method
End Type


So, nun das Problem: Ich müsste ja jetzt für jedes möglich ActionEvent ein Case in der Exec()-Methode anlegen. Sauberer wäre es natürlich, wenn ich in ActionEvent statt eines ints eine andere Funktion "speichere", die dann mit Exec() aufgerufen wird. Ist sowas möglich?

Noch etwas anderes: Wie man vielleicht merkt, ist dieser Type für eine Tilemap. Ich habe das dann so geplant, dass ich ein 2-Dimensionales Array dieses Types anlege und damit meine Tilemap habe. Die Tilemap soll durchaus etwas größer werden, habe ich da eine Begrenzung außer die RAM-Größe? Und ist so ein System effizent (Kann ich, wenn ich auf dem Bildschirm 25 x 25 Tiles, die so gespeichert sind, gemalt werden trotzdem noch 60 FPS erreichen?)
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Sa, Okt 12, 2013 3:28, insgesamt einmal bearbeitet

Tennisball

BeitragSa, Okt 12, 2013 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

1) Ja, das ist möglich. Funktionspointer ist das Stichwort. Du kannst sie so benutzen:
BlitzMax: [AUSKLAPPEN]
Local pointer:Int()
pointer = func
func()

Function func()
Print "Hello World"
End Function

Falls du Parameter hinzufügen möchtest, musst du das beim Pointer auch definieren, so etwa:
BlitzMax: [AUSKLAPPEN]
Local pointer:Int(x:Int)
pointer = func
func(3)

Function func(x:Int)
Print "Hello World " + x
End Function

Beachte, dass der Funktionspointer immer nur auf Funktionen zeigen kann, die vom selben Typ sind und die selben Parameter annehmen.


2) Das sollte im Normalfall locker funktionieren. Falls du wirklich eine riesige Map hast, kannst du die auch nach und nach laden und nicht alles auf einmal.

Gruß,
Tennisball
 

CO2

ehemals "SirMO"

BeitragSa, Okt 12, 2013 2:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, vielen Dank Wink

Also habe ich das nun wie folgt umgeschrieben BlitzMax: [AUSKLAPPEN]
Type TTile
Field TileID:Int
Field Action:Byte ' 0 = Normales Tile, 1 = Kollision, 2 = Actiontile
Field ActionFunction:Int(x:Int)

Function Create:TTile(TileID:Int, Action:Byte, ActionFunction:Int(x:Int))
Local ReturnMe:TTile = New TTile
If(ReturnMe <> Null)
ReturnMe.TileID = TileID
ReturnMe.Action = Action
ReturnMe.ActionFunction = ActionFunction
EndIf
Return ReturnMe
End Function

Method Exec()
If(Self.Action = 2)
Self.ActionFunction(0)
EndIf
End Method
End Type

Function HalloWelt(x:Int)
Print("Hallo Welt! '" + x + "'")
End Function

Local Test:TTile = TTile.Create(25, 2, HalloWelt)

Test.Exec()

End


Wie kann ich dann in der Parameterliste des Konstruktors den Parameter übergeben? Ein HalloWelt(5) scheint nicht zu funktionieren...

Und wie komme ich aus der Methode Exec() an den im Kontruktor angegebenen Funktionsparameter? Oder muss ich da extra noch ein Field im Type anlegen, das ich dann im Konstruktor beschreibe und dann in der Exec()-Methode als Funktionsparameter dient?

Zu 2.) Gut, ich habe mal hochgerechnet, das die geplante Tilemap ungefähr 25Mb groß ist (5000 x 5000 Tiles)... Also brauche ich mir wahrscheinlich keine sorgen wegen des RAMs machen. Very Happy Es ging mir mehr darum ob BlitzMax da interne Beschränkungen hat, wie viele Objekte gleichzeitig bestehen können.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Jolinah

BeitragSa, Okt 12, 2013 2:49
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Parameterliste kannst du nur die Funktion selbst übergeben, also "HalloWelt". Dann müsstest du noch einen Int-Parameter anfügen und diesen ebenfalls übergeben. Diesen könntest du dann in einem Field speichern und bei Exec() der Funktion als Parameter mitgeben:

BlitzMax: [AUSKLAPPEN]
Function Create:TTile(TileID:Int, Action:Byte, ActionFunction:Int(x:Int), wert:Int)
...
Self.wert = wert
...
End Function

Method Exec()
...
Self.ActionFunction(wert)
...
End Method


Und wenn du in Exec nach dem Funktionsaufruf irgendwie wieder auf den Parameter zugreifen willst, dann muss der Parameter ein Objekt/Type sein, oder ein Referenz-Parameter (x:Int Var). Oder einfach eine Funktion nehmen, die einen Rückgabewert liefert.

BlitzMax: [AUSKLAPPEN]

Type MyType
Field FeldName:String
End MyType

...

Field ActionFunction:Int(x:Int Var, y:MyType)

...

Method Exec()
...
Local x:Int = 0
Local y:MyType = New MyType
Local ret:Int = Self.ActionFunction(x, y)
Print "Rückgabewert: " + ret
Print "Parameterwert: " + x
Print "Objekt-Field von y das allenfalls verändert wurde: " + y.FeldName
...
End Method

Function HalloWelt:Int(x:Int Var, y:MyType)
x = 10
y.FeldName = "Test"
Return 33
End Function
 

CO2

ehemals "SirMO"

BeitragSa, Okt 12, 2013 3:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, besten Dank!

Damit hat sich das Thema geklärt. Wink
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group