Zugriff auf Daten aus verschiedenen Types heraus

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Schrolli

Betreff: Zugriff auf Daten aus verschiedenen Types heraus

BeitragDi, Jan 26, 2016 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Nabend zusammen,

stehe vor einem kleinen Logikproblem.

Follgender Schematischer Aufbau:
BlitzMax: [AUSKLAPPEN]
SuperStrict


Type TTileEngine

'Constructor
Method Create:TTileEngine(windowX:Int, windowY:Int)
End Method

Method newLayer(layerName:String)
End Method

Method Layer:TTileLayer(layerName:String)
End Method

Method moveCamera(speed:Float)
End Method

End Type


'------------------------------
'Type for the TTileLayer

Type TTileLayer

'Constructor
Method Create:TTileLayer(layerName:String)
End Method

Method loadTiles()
End Method

Method draw()
End Method

Method Tile:TTile(tileId:Int)
End Method

End Type


'------------------------------
'Type for the TTile

Type TTile

'Constructor
Method Create:TTile(id:Int, tileName:String, pointer:TImage)
End Method

End Type



Ich erzeuge aus dem Programm eine Instanz der TTileEngine.
Über diese erzeuge ich mit newLayer() einen Instanz der TTileLayer. Alle Instanzen der TTileLayer liegen in einer TList in der TTileEngine.
Jedes Layer kann nun die Grafiken laden, als Instanzen der TTile, welche alle in der jeweiligen TTileLayer in einer TList liegen

Nun kann ich über die TTileEngine.layer("LayerNAME").draw() das Layer auf den Bildschirm zeichnen.

In der TTilesEngine befindet sich die Methode moveCamera() um den Bildausschnitt zu verschieben. Die Methode draw() benötigt aber die Werte der Position der Camera um nur den aktiven Bildausschnitt zu zeichnen.

Wird etwa so benutzt:
BlitzMax: [AUSKLAPPEN]

Local tE:TTileEngine = New TTileEngine.Create(....)
tE.newLayer("Test Layer1")
tE.Layer("Test Layer1").loadTiles(...)

...

tE.Layer("Test Layer1").draw()
tE.moveCamera(0.8)


Wie komme ich denn nun in der TTileLayer Instanz an die Daten der TTilesEngine?

Hoffe das ganze ist verständlich.
Gruß Basti

Edit:
Hab gerade einen kleinen Workaroud gefunden, ob das allerdings "schön" ist? Wie macht man sowas richtig?
Habe jetzt in der TTilesEngine die X und Y Position der Camera als global deklariert und greife aus der TTileLayer über statische Functionen ala getCamX() auf diese zu, um die zu lesen...

Xeres

Moderator

BeitragDi, Jan 26, 2016 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde entweder ein globales Kamera Objekt verwenden oder die Kamera als Singelton anlegen: Man kann nur ein Objekt erzeugen und erhält dann immer die gleiche Instanz zurück.
Ansonsten schau dir das Component Pattern an.

Schöner sortierter Code ist wünschenswert, aber wäge ab, ob du lieber mit dem Spiel fertig werden willst.
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)
 

Schrolli

BeitragDi, Jan 26, 2016 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau ich mir an, danke...
Wie genau deklariert man denn einen Singleton?

Was meinst du mit schöner sortiert? Also inwiefern?
Wie sollte sowas denn aussehen das man von gutem Stil sprechen kann?
Bin was sowas angeht sehr gerne lern-gewillt Smile

Grüße

Xeres

Moderator

BeitragMi, Jan 27, 2016 0:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe gerade kein lauffähiges BM hier, aber ein Singelton könnte etwa so aussehen:

BlitzMax: [AUSKLAPPEN]
Type TSingle
Global instance:TSingle = Null

Function Create:TSingle()
If TSingle.instance = Null Then
TSingle.instance = New TSingle
EndIf
Return TSingle.instance
EndFunction

EndType


Man kann die Funktion auch get nennen oder wie immer es dir in dein Namensschema passt.

Schöner Code ist einheitlich, aussagekräftig und gut gekapselt.
Ein empfehlenswertes Werk zum Thema ist "Clean Code" von Robert C. Martin. Ist etwas Java lastig, aber die Prinzipien sind überall die gleichen. Wenn man guten Code hat, hat man weniger WTFs pro Minute.

Wie gesagt: Wenn man etwas fertig bekommen will, bricht man manchmal den Stil und macht was hässliches (direkt auf variablen anderer Objekte zugreifen, mehr als eine Sache in einer Funktion erledigen weil es so schneller geht).
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)

Thunder

Betreff: Re: Zugriff auf Daten aus verschiedenen Types heraus

BeitragMi, Jan 27, 2016 1:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Schrolli, Xeres hat dir zwar schon sehr viel geholfen, aber ich möchte eine simple antwort geben.

Das was du suchst, ist eine globale Variable.

Schrolli hat Folgendes geschrieben:
Edit:
Hab gerade einen kleinen Workaroud gefunden, ob das allerdings "schön" ist? Wie macht man sowas richtig?
Habe jetzt in der TTilesEngine die X und Y Position der Camera als global deklariert und greife aus der TTileLayer über statische Functionen ala getCamX() auf diese zu, um die zu lesen...


Wenn du für dein ganzes Programm eine Instanz von TTilesEngine hast, dann wäre es vermutlich sinnvoller, X und Y der Kamera als Fields zu deklarieren und diese Instanz von TTilesEngine in eine globale Variable zu speichern. Dann kannst du über die globale Instanz (wenn nötig über getCam*()-Methoden) auf die Koordinaten zugreifen.

So wie du es jetzt hast, fände ich es nur sinnvoll wenn es potenziell mehrere TTilesEngine Instanzen (deswegen machst du überhaupt Instanzen von der Klasse) und immer nur eine Kamera (deswegen sind ihre Koordinaten Global) gibt.

Ich hoffe du verstehst, worauf ich hinaus will.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group