Maps laden in einer Schleife

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

dont_know_to_use

Betreff: Maps laden in einer Schleife

BeitragSo, Mai 15, 2011 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Ich habe ein Problem, und zwar folgendes:
Ich habe 1 Map, die mit der Funktion "LoadMap($file)" geladen wird. Natürlich muss dies vor der Hauptschleife getan werden, weil in der LoadMap-Funktion Meshes geladen werden. Nun möchte ich allerdings, während die Schleife läuft, eine andere Map laden. Aber das geht natürlich nicht, weil dann ja während der Schleife Meshes geladen werden. Hat jemand eine Idee, wie ich das lösen kann?

Xeres

Moderator

BeitragSo, Mai 15, 2011 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Übliche Methode sollte sein, die Aktion nur ein mal aus zu führen.
Variablen + If...Then.
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)
 

dont_know_to_use

BeitragSo, Mai 15, 2011 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Du meinst, ich erstelle und lade vorher alle Meshes etc. und überprüfe mit meiner LoadMap-Funktion jedes mal, ob dieses Mesh in der Map vorkommt? Dann hätte ich ja schon bevor die Maps geladen werden die ganzen Meshes an einem Ort.

count-doku

BeitragSo, Mai 15, 2011 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja in etwa so:

PseudoCode: [AUSKLAPPEN]
;-- Dim Feld für alle Maps
Dim Maps(9)
For i=0 to 9
        Maps(i)=LoadMap("filename"+i+".endung")
        HideMap Maps(i) ;HideMesh
Next
Global Level=0
ShowMap Maps(Level) ;ShowMesh

;-- Hauptschleife
;While...
        If NextLevel()
                HideMap Maps(Level)
                ShowMap Maps(Level+1)
                Level=Level+1
         End If
;Wend...


lg,
count-doku

Xeres

Moderator

BeitragSo, Mai 15, 2011 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich meinte, dass du die LoadMap Funktion nur genau einmal ausführst. Dann, wenn du das nächste Level brauchst. Das lässt sich mit Variablen ganz einfach steuern.
Klar kannst du auch Objekte im Speicher halten, die du sowieso noch brauchst, aber alle Level im voraus zu laden ist u.U. langsamer und speicherintensiver als gut sein kann - würde ich nicht so einfach empfehlen.
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)
 

dont_know_to_use

BeitragSo, Mai 15, 2011 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Nein, ich meinte, dass du die LoadMap Funktion nur genau einmal ausführst. Dann, wenn du das nächste Level brauchst. Das lässt sich mit Variablen ganz einfach steuern.

Aber wie?

Xeres

Moderator

BeitragSo, Mai 15, 2011 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Na in etwa so:
Pseudo-Code: [AUSKLAPPEN]
WENN Gegner = 0 DANN
LeveNr + 1
LadeLevel(LevelNr)

Kann (eher muss) in der Hauptschleife stehen, aber halt so, dass es erst aufgerufen wird, wenn es nötig wird. Du musst ja irgendwie erkennen können, wann ein neues Level nötig wird.
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)
 

dont_know_to_use

BeitragSo, Mai 15, 2011 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, aber das hat doch folgende Probleme:
Wenn die Variable Gegner auf 0 steht, dann wird das Level geladen. Aber es wird ja immer und immer wieder geladen, weil die Variable Gegner ja auf 0 stehen bleibt und man diese nicht einfach ändern kann(sonst ist man ja nicht auf dieser Map).

Xeres

Moderator

BeitragSo, Mai 15, 2011 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Du brauchst irgendeine Variable (oder auch mehrere!) die eindeutig festlegen, dass du eine neue Karte brauchst. Welche kommen bei dir in Frage? Benutzte diese!
Es kommt darauf an, dass es eine negative Rückkopplung gibt, sodass z.B. immer neue Gegner auf einer neuen Karte sind und entsprechend Gegner <> 0 wird.
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)
 

dont_know_to_use

BeitragSo, Mai 15, 2011 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber wenn Gegner <> 0 ist, dann ist auch nicht mehr die neue Map geladen. Surprised

Xeres

Moderator

BeitragSo, Mai 15, 2011 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe keine Ahnung wie bei dir die Variablen heißen - es war ein Beispiel (darum Pseudo-Code) bei dem beim laden der Karte neue Gegner erstellt werden und also die Bedingung nur genau einmal wahr ist.
Jetzt bist du mit deinem eigenen Gehirn gefragt!
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)
 

dont_know_to_use

BeitragSo, Mai 15, 2011 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Variablennamen sind ja erstmal egal. Nehmen wir einfach an, wir haben die Variable Level, welche über If abgefragt wird. Wenn sie 1 ist, wird Map 1 geladen, Wenn sie 2 ist, Map 2 und so weiter:
Code: [AUSKLAPPEN]
If level=1
    LoadMap(1)
Elseif level=2
    LoadMap(2)
EndIf

...

Function Loadmap(map)
    test=LoadMesh("blablub.bla")
    ...
End Function

So habe ich deine Lösung verstanden ...
Wenn Level nun den Wert 1 hat, wird die Map doch immer wieder geladen.

Xeres

Moderator

BeitragSo, Mai 15, 2011 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If level=1
    LoadMap(1)
Elseif level=2
    LoadMap(2)
EndIf


Ist das gleiche wie...
Code: [AUSKLAPPEN]
LoadMap(level)

Wink
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)
 

dont_know_to_use

BeitragSo, Mai 15, 2011 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Mag sein, ist aber keine Lösung für mein Problem. Confused

Xeres

Moderator

BeitragSo, Mai 15, 2011 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann werd mal konkret: Was ist das Ziel der Karte? Was ist die Gewinner-Kondition? Was muss eintreten, damit eine neue Karte geladen wird?
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)
 

dont_know_to_use

BeitragSo, Mai 15, 2011 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Man erreicht eine XYZ-Koordinate.

Xeres

Moderator

BeitragSo, Mai 15, 2011 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Na dann:
WENN Player_XYZ = Level_Exit_XYZ DANN Loadlevel()
Innerhalb von Loadlevel wird die neue Level_Exit_XYZ eingestellt und der Spieler auf den SpawnPunkt gesetzt... Der Spieler ist nach dem Laden nicht mehr an dem Ort, den das Spiel veranlassen würde, eine neue Karte zu laden.
Wenn du sowas wie Türen/Durchgänge verwendest, die man zurückgehen kann, dann überprüfe das (a) nur beim betreten oder (b) versetzte den Spieler außerhalb des Tür-Bereichs.
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)
 

dont_know_to_use

BeitragSo, Mai 15, 2011 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, das könnte funktionieren. Allerdings benötige ich dann noch eine Funktion, mit der ich die Objekte aus der ersten Map lösche, bevor die zweite betreten wird. Ansonsten sind ja die Objekte aus der ersten Welt auch in der zweiten Map drin. Gibt es eine Möglichkeit, dies zu erreichen?

Xeres

Moderator

BeitragSo, Mai 15, 2011 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie musst du ja die Level verwalten, z.B. mittel Types. Die solltest du Entladen (FreeEntity o.ä.) oder eben wiederverwerten, wenn das sinnvoll 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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

dont_know_to_use

BeitragSo, Mai 15, 2011 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahja, FreeEntity war das, was ich gesucht habe. Danke. Wink

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group