[GELÖST] Organisation bzgl Levelswitch etc.
Übersicht

![]() |
NeoxitBetreff: [GELÖST] Organisation bzgl Levelswitch etc. |
![]() Antworten mit Zitat ![]() |
---|---|---|
Heydiho! Habe mich endlich mal von BlitzBasic losgerissen und mir die Testversion von BMax geholt. Ich bin mehr als zufrieden und denke mal das wird nicht lange dauern bis ich da hineininvestiere. ![]() Nun aber mal zu meiner Frage die mir bei meinen derzeitigen dingen weniger Probleme bereitet, aber es vllt doch einen besseren, sinnvolleren weg gibt als das was ich mache. Meine frage ist wie managed ihr Level / Screenswitch zwischen Hauptmenü, Leveln oder ähnlichem? Mein Weg war bisher immer folgender (Zumindest in BB): BlitzMax: [AUSKLAPPEN]
Zu dem habe ich nochmal eine weiter Frage. In BMax gibt es ja zum glück das ach so tolle OOP ![]() Macht es dabei sinn wirklich fast alles was häufiger als 1 mal vorkommt (bspw. das was die Maus angeht würde ich nun nicht in einem Type speichern) in Types zu organisieren? Übersichtlicher ist es dann ja alle male. Nur habe ich so meine Probleme bei einigen einfachen Verständnisfragen. Ich habe z.b. in dem Spiel logischerweise mehrer Buttons. Die habe ich in BB immer als 1 Funktion gehandhabt, wobei diese dann CreateButton(x,y,img_norm,img_hover,img_click,modi) hieß. Diese hat mir dann entsprechend den button an der entsprechenden Stelle erstellt und mit Modi dann entweder bei 1 ein Beenden oder 2 ein neues Spiel, 3 speichern etc. pp. gemacht. Wie kann ich diese nun allerdings SINNVOLL in Types nutzen / Sollte man das überhaupt? Meine derzeitigen gehversuche diesbzgl. (Habe gestern abend mit Bmax begonnen ![]() BlitzMax: [AUSKLAPPEN]
Natürlich befindet sich darin noch eine Maus-Koord-Variable wie man dem Type oben entnehmen kann. Kann man dies alles vereinfachen / sollte man das oder ist das schon ein guter weg den ich nehme? Sind ein paar mehr fragen, und ich bin über jede noch so helfende Antwort tierisch Dankbar! Mfg Neoxit ![]() |
||
- Zuletzt bearbeitet von Neoxit am So, Jul 08, 2012 20:09, insgesamt einmal bearbeitet
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
OOP kann toll sein. Je größer ein Projekt ist, desto mehr zahl es sich aus, einzelne Teile als ein Objekt zu betrachten. Ab einer bestimmten Größe sind Objekte allein deshalb da, um den NameSpace sauber zu halten:
BlitzMax: [AUSKLAPPEN] Type TUI_IMG Level würde ich möglichst immer als Objekt umsetzen. Wenn du jedes Level von der Platte lädst, reicht ein Globales Objekt, dessen Inhalt du veränderst. Karten, auf denen man sich hin und her bewegt kann man einmal laden und schnell hin und her wechseln... Je nach dem, was du erreichen willst. Ein Bedingungs- oder Select-Case Block würde ich bei kleinen Spielen für den BCC akzeptieren, aber alles darüber findet man zu unsauber. Man kann Gamestates in Objekte oder Funktionen verpacken - macht keinen zu großen Unterschied. Man muss nur acht geben, dass man keinen Zustand erreichen kann, der irgendwie undefiniert ist. Buttons handle ich als einzelne Funktionen ab... Wenn man deren Zustand nicht speichern muss, zeigen sie ja nur 2 Bilder an und geben beim Klick True zurück. Wenn du aber Objekte erstellst, dann besser nicht in der Schleife. Globale Variablen in Funktionen behalten ihren Wert: BlitzMax: [AUSKLAPPEN] Function Foo() Simple Antwort: Probiere aus, was du als Objekte und was als simplere Strukturen verarbeiten 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erstmal danke für die kleine Nebeninformation das ich die Bilder auch innerhalb des Types laden kann und nicht unbedingt erstmal global laden muss. Damit hätte ich schonmal ein doppeltes Laden weniger. ![]() Und auch vielen dank Xeres für deine recht ausführliche Antwort. Jedoch gehen wir mal davon aus ich organisiere mein Projekt wie folgt (src technisch) 1 - Mainfile (Hier befindet sich auch die Hauptschleife so wie das setup der Grafik und weiter Systembezogenen Dinge) 2 - Typefile (Hier würde ich alle (oder die meisten Types unterbringen) 3- Hauptmenüfile (Hier möchte ich das Komplette Menü gestalten. Mit zugriff auf Types die dann wiederrum in der Typefile liegen etc.) 4 - Level 1 ( Hier möchte ich das 1. Level gestalten) 5 - Level 2 ( Hier das 2te.) etc. Und da ist nämlich meine konkrete Frage. Wie kann man die Files nachher so legen, das sie in der Mainfile / Hauptschleife zusammenlaufen? Oder habe ich da durch meine jahrelange BB logik nun einfache denkfehler drinne wie es grundsätzlich dank OOP vieel besser geht? Ich habe meine Programme ja bisher so ca. unterteilt: Systemsettings (Grafikmodus, apptitle) Types Globals Grafiken Sound Starteinstellungen Hauptschleife Funktionen So sah im groben immer meine BB file aus. Ich habe also eher selten mit weiteren Dateien gearbeitet, und wenn doch, dann habe ich lediglich eine für Types, eine Für Globals eine für Funktion etc erstellt und dann einfach vor der hauptschleife mit Include eingebunden. Ich habe das doofe gefühl mir fehlt hier wirklich nur ein quäntchen verständnis ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Types/Objekte sind groß in BlitzMax. Funktionen & Methoden sind gebündelt in einer Struktur und entsprechend sollte man große Types in einer Datei halten.
Mainfile.bmx, TGame.bmx, TGameStates.bmx usw. wäre nicht unüblich. Im Mainfile includierst du alle Codes, Initialisiert alles nötige und startest die Hauptschleife, die Entweder nur dein TGameManager.Update() aufruft oder per Select-Case die richtige Funktion aufruft (so jedenfalls mein System). Das Hauptmenü sollte eine Funktion (Objekt) sein und jeder Spielzustand. Die Struktur hängt von der Größe des Projekts ab. Man kann auch alles in einer Datei behalten, aber irgendwann wird das eben unübersichtlich. Das hat nicht mal so viel mit OOP zu tun - du kannst alles in Funktionen Gliedern, aber auch die müssen irgendwann ausgelagert werden. Die Wiederverwendbarkeit steigt, wenn du alles sortierst; Include "TColor.bmx" und du benutzt deine Objekte für Farben & Verläufe ohne den Inhalt von Dateien nach dem richtigem Abschnitt zu durchsuchen und stückweise zu kopieren. |
||
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) |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay also sollte ich demnach bspw. das Gesamte Hauptmenü in eine Funktion "schmeißen". Diese Funktion ruft dann widerrum weitere Funktionen wie, Button Funktionen (oder Types) oder ähnliches wie Effekte, Hintergrundfunktionen auf. (Verschachteln?)
Und im endeffekt steht dann in der Hauptschleife der Mainfile einfach "ZeichneDeinHauptmenue()"? (Vorrausgesetzt der Spieler befindet sich gerad in dem Hauptmenü). Wäre das aber nicht das selbe Prinzip, welches ich ganz zu beginn nannte, nur etwas anders dargestellt im sinne von if system_level = 1 then...? Das Types definitiv größer werden können habe ich schon bemerkt. Das habe ich an der Spielertype (welche noch relativ simpel ist) gemerkt. Da die ganzen Methoden etc. ja weitreichend sind. Ich würde mir wirklich ganz gerne einfach mal einen Simplen aufbau einer Mainfile, einer Hauptmenue File etc. anschauen. Auch der Switch vom Menü in meinetwegen ein anderes Menü, oder ein Level. (Um die Frage mal zu klären ich gehe allgemein vom Aufbau von einem Größeren Projekt aus, was dementsprechend auch die möglichkeit hat, präzise an kleineren "bausteinen" weiterzuarbeiten ohne dafür in 5 weiteren quellcodes viel zu ändern. (Was auch bei Teamarbeit wichtig ist denke ich) Daher habe ich ja die ganze zeit das Wort OOP herausgehoben.) Allerdings fehlt mir hier nach wie vor (sogut du mir bisher auch versucht hast zu Helfen Xeres und dafür danke ich dir auch zutiefst ^^) irgendwie dieser "Aha!"-Effekt. Der Zusammenhang, die Einzelteile nachher gut zusammenzufügen das sie sauber miteinander Arbeiten. Klar gibt es da wohl mehrere Wege zum Erfolg welche für den Endbenutzer nachher nicht (zumindest weitgehend) sichtbar oder spürbar wäre. Ich möchte halt ungerne 10.000 Zeilen code in die Hauptschleife hauen ohne Funktionen, Types oder ähnliches. Dann weiß ich nachher nicht mehr wo oben und Unten ist. ![]() Simple Beispiele wären hier sehr gefragt um mir bei dieser dusseligen verständnisfrage zu Helfen ![]() [EDIT] Nochmal darüber nachgedacht also bspw folgendermaßen: Mainfile: BlitzMax: [AUSKLAPPEN]
GameManager: BlitzMax: [AUSKLAPPEN]
Hauptmenue.bmx BlitzMax: [AUSKLAPPEN]
So meintest du? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ausschnitt aus Unit42 (BCC#59):
BlitzMax: [AUSKLAPPEN] Const GS_Menu:Int = 0, GS_Play:Int = 1 Ist nicht so viel anders als If Level, aber es ist etwas strukturierter. Wie Level & Editor auf den selben Code zugreifen, findest du auch in dem Paket (ohne viele Kommentare). Kein Herausragendes Beispiel, wie man arbeiten sollte, aber es funktioniert. Objekt Orientiertes Version könnte so umgesetzt werden: BlitzMax: [AUSKLAPPEN]
Vielleicht hilft dir das etwas weiter. |
||
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) |
- Zuletzt bearbeitet von Xeres am Mo, Jun 25, 2012 18:49, insgesamt einmal bearbeitet
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Xeres du hast post.
@ All: Der zweite code sieht sehr gut aufeinander aufbauend / professionell aus jedoch steige ich durch einige dinge nicht durch. Haben vllt noch mehr Leute Erfahrungen auszutauschen? Oder eine kleine Erklärung bzgl des zweiten? |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was verstehst du denn nicht- stell doch einfach genauere Fragen ![]() |
||
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 |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist mir manchmal n bissl Peinlich weil ich ungerne die Antwort bzgl Grundwissen höre, denn das habe ich soweit eig, DENKE ich ![]() Kurz gesagt: Der Abstract Type, die Switch() funktion und die Run() Funktion wll mir nicht klar einleuchten. Mir fehlt irgendwie der gewisse bezug zu dem ganzen (klar wenn man sowas noch nie gemacht hat im OOP sinne und dann gleich mal sieht wie sowas "gut" funktioniert) ![]() Und Peinlich ist es mir auch noch zu fragen weil ich mir dann teilweise tatsächlich ein bisschen Doof vorkomme ^^ ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe ein paar Kommentare ergänzt. Die Parameter von Methoden/Funktionen beginnen nur mit Unterstrichen, weil das mein Stil ist - in manchen Quellcodes werden Felder mit einfachen oder doppelten Unterstrichen als "Privat - um Himmels willen pack das Teil nur mit der richtigen Methode an!" gekennzeichnet.
Die eckigen Klammern in AllStates:TGameState[] kennzeichnen es als Array. Eine TMap oder TList könnte man ebenso gut benutzen - der Unterschied wäre minimal. Frag ruhig so lange weiter, bis dir klar ist, was passiert. |
||
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) |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ahhh danke Xeres! ![]() Jetzt leuchtet mir vieles davon ein. Ich werde mal selber einen solchen GameState Manager schreiben. Die Abstract Methode definiert in diesem Falle nur vor (wie eine Schablone?) was die extends davon "können"? Somit Quasi eine "einfacherer Erweiterung / ineinadergreifung" der einzelnen Types ermöglicht, wobei im Endeffekt der TGameStateManager nur auf dieses Abstract zugreift (Hoffe ich habe meinen Satz gerad nich allzu kompliziert ausgedrückt ^^) Ich denke nun konnte ich dem ganzen gleich viel besser folgen! Wie gesagt ich werde mich da mal ransetzen und euch mal meine Version davon Präsentieren. ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Abstract bedeutet nur, das man ein solches Objekt nicht erstellen kann. Du kannst nicht die Abstrakte Vorstellung "Fahrzeug" tatsächlich bauen. Aber du kannst ein Auto oder Motorrad bauen, die die Eigenschaften eines Fahrzeugs haben.
Die Abstrakten Methoden bedeuten, dass das richtige Objekt diese wirklich implementieren muss. Der Manager kann alle Objekte wie ein GameState behandeln, da alle diese Methoden besitzen müssen. Ob Auto oder Motorrad: Wenn es ein Fahrzeug ist, hat es Reifen, auf die man zugreifen kann. Diese Vererbungsgeschichten sind nicht ganz einfach, ich glaube nicht, dass ich da vollends alles Verstanden haben, was möglich ist. |
||
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) |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
So ich habe hier mal dein Beispiel noch einmal aufgebaut mit leichten änderungen und nochmal versucht selber zu kommentieren. Wollte es so wie es jetzt ist eigentlich einmal testen jedoch gibt mir mein compiler den Fehler aus: "Unable to convert "Int" to "TGameState Array".
Muss ich den Array selber vorher nochmal als Int definieren oder ähnliches oder was ist hier einfach falsch? Hier der src: BlitzMax: [AUSKLAPPEN]
|
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Field <> Global
Mein TGameManager benutzt Globale Variablen. Wenn du mit Fields arbeiten willst, musst du eine Instanz mit New erstellen und kannst aus den Funktionen Methoden machen. Da ich nur einen Manager sinnig fand, habe ich es mit Globalen gemacht. Bzw. der Manager Type sammelt nur Globale und Funktionen unter seinem Namen zusammen - ein richtiges Objekt wird nie erzeugt. |
||
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) |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stumpf von mir, ja du hast recht logisch ist das logisch, weil warum sollte es mehr als 1 GameManager geben. ![]() |
||
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Soooooooooo, Quellcode ist Kopierbar und direkt ausführbar.
Würde mich freuen wenn du es dir einmal anschaust Xeres! ![]() Ich danke dir sooooooooo sehr an dieser Stelle, bin gerade (nein, nicht gelogen) vom stuhl aufgesprungen mit nem Handklatscher und nen "Yeah!" ^^ Also hier der Code: (Wenn noch Mängel oder dinge die Anders gemacht werden sollten, wissen lassen! (Kann man in der Execute Method das jeweilige Level ruhig darin aufbauen?) BlitzMax: [AUSKLAPPEN]
Mir ist aufgefallen das der Thread mittlerweile übrigens auch ziemlich vielen anderen die sich dafür Interessieren sein könnte wie sowas abläuft ![]() [ E D I T ] Sorry Doppelpost -.-* ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erstens:
Code: [AUSKLAPPEN] TGameManager.SwitchGameState(2) 'Wechsle auf GameStateID 2 = Level 01 Der Kommentar ist nötig, weil 2 als Zahl eindeutig aber aussage los ist. Wie weiter oben bei der Select-Case Konstruktion mit Funktionen solltest du Konstanten verwenden, um die Lesbarkeit zu erhöhen.
Ob normale Konstanten oder z.B. im TGameState verpackt, kannst du nach deinem Geschmack variieren. BlitzMax: [AUSKLAPPEN] Type TGameState Abstract Zweitens: Willst du Level wirklich als einzelne GameStates umsetzen? Normalerweise würde ich nur ein Play Status verwenden und in dem Level laden und darstellen. So macht das nur Sinn, wenn a) die Level krass unterschiedlich sind, oder keine uniforme Struktur haben und b) komplett statisch aus dem Code erzeugt werden. Für den BCC z.B. wäre es vollkommen okay es so zu machen, aber sobald du Level aus Dateien lädst, macht der Ansatz keinen Sinn mehr. |
||
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) |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das mit den Konstanten ist mir auch schon in den Sinn gekommen. Geändert werden diese ja sowieso nicht sondern sind von anfang an festgelegt und sollten demnach auch so bleiben (Es sei denn ich lade ID's etc aus Dateien).
Bzgl der Aufteilung das ich nun als Beispiel Level 01. und Level 02. genommen habe, war einfach weil ich einfach nur ein paar Orientierungspunkte brauchte. Der Gamestate ist nachher ein einziger, welcher sich dementsprechend ändert (Das level eben) . Das war alles rein aus demonstrativen Gründen so benannt. Nehmen wir mal anderes Bsp: 1 Titlescreen, 1 Mapscreen (oder wie in deinem Bsp: PlayState), 1 Kommandoscreen (bspw. in einem anderen Genre oder so). |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group