Nur für View

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Nur für View

    Hi Leute,

    ich habe diesen Code, um eine Map zu erstellen:

    GML-Quellcode

    1. y_koord = 0;
    2. for(i=0;i<=room_width;i+=16){
    3. var zufall;
    4. var x_koord;
    5. var y_koord;
    6. zufall = (random (4)-random(3))*16;
    7. x_koord = i; //x koordinate des Blocks
    8. if not(i=0){ //wenn das NICHT der erste Block ist
    9. y_koord =(floor(zufall/16)*16)+y_koord; //setze ihn auf zufallsposition + die Position des letzten gesetzten Blocks
    10. }else{
    11. y_koord = (floor(zufall/16)*16)+floor(200/16)*16; //ansonsten setze ihn auf eine unabhängige zufallsposition.// das 200 ist der abstand der Blöcke von dem oberen ende dr map.
    12. }
    13. instance_create(x_koord,y_koord,obj_ground_gras); //erstelle nun ein Objekt auf den Berrechneten Zufallskoordinaten.
    14. var y_fuellen;
    15. y_fuellen = floor(room_height/16)*16; //diese Variable ist der momentane "pointer" in der Y ebene der immer nach oben geschoben wird (in - bereich)
    16. while (place_empty(x_koord,y_fuellen)) and (y_fuellen>0){ //von unten nach oben solange durchgehen bis ein Objekt gefunden oder die Spitze der Map erreicht wurde.
    17. instance_create(x_koord,y_fuellen,obj_stone); //dies ist die Füllung der Map (also alles was unter dem objekt gras Block ist.)
    18. y_fuellen+=-16;
    19. }}
    Alles anzeigen

    (Danke an LEWA für den Code ;) )


    und ich möchte nun, dass dies immer im View geschieht. Dass heißt: Am Anfang wird im View die Map erstellt. Wenn sich der View aber nach Rechts bewegt, soll die Map weitergeführt werden(um nicht eine Unendlich große Map erstellen zu müssen ;) ). Das gleiche, wenn man nach links oder unten geht. Ich bedanke mich schonmal.
    Grüße Stupe
  • Es sollte eigentlich funktionieren, wenn du

    GML-Quellcode

    1. for(i=0;i<=room_width;i+=16)

    durch

    GML-Quellcode

    1. for(i=view_xview_previous+view_hview;i<=view_hview+view_xview;i+=16)

    ersetzt, denn entspricht i dem früheren rechten Rand der sicht und das maximum dem aktuellen rand der Sicht und es wird nur der neu dazugekommene Bereich bearbeitet.
    Da es die Variable view_xview_previous nicht gibt, musst du sie im Create Event deklarieren und im End Step mithilfe von view_xview aktualisieren.

    Diese Lösung funktioniert allerdings nur wenn man sich nach rechts bewegt, sonst werden Blöcke doppelt erstellt. Man müsste noch abfragen ob view_xview_previous+view_hview größer als im Step davor und dann alles ausführen. In dieser Lösung ist der Raum also nach links begrenzt, was aber nicht weiter problematisch ist, da der Raum nach rechts hin offen ist, links oben allerdings alle Hinter- und Vordergründe aufhören.


    PS: Der Performance wegen wäre es sinnvoll nor am Oberen ende der Map objekte zu erstellen und sonst nur Tiles, ist aber vor allem beim graben kompliziert durchzuführen
  • du könntset doch versuchen, die map trotzdem schonmal zu createn, aber einfach alles ausserhalb des views zu deaktivieren. somit ist zwar deine map auf der maximalen grösse, hat aber ebenfalls gute performance.
    das schaffst du mit:

    GML-Quellcode

    1. instance_activate_all();
    2. instance_deactivate_region(view_xview[0]-16,view_yview[0]-16,
    3. view_wview[0]+32,view_hview[0]+32,false,true);
    ////////////////////////////////////////////////////////////////////////////////////////////////
  • Ich hab alle instancen schon außerhalb des Views deaktiviert. Das Problem ist einfach, das man keine unendlich große Map auf einmal erstellen kann, weil das Spiel dann unendlichlange laden müsste. Deshalb will ich dass die Map erstellt wird wenn man sich bewegt.
    Grüße Stupe
  • Ich bin mir selbst nicht sicher ob das zu 100% sauber funktioniert.
    Aber zum Verständnis:
    Nehmen wir mal an, die View ist 500 px breit und befindet sich 1000px vom Raumanfang entfernt, war im Schritt davor noch auf Platz 900.
    view_xview ist also 1000
    view_xview_previous ist 900 [wenn du im EndStep view_xview_previous=view_xview schreibst, ist im nächsten Schritt nach der aktualisierung der Viewposition der Wert veraltet, d.h. die vorherige Position]
    view_hview ist die Breite, d.h. 500

    view_hview+view_xview_previous ist demnach 1400 -> der frühere rechte Viewrand
    view_hview+view_xview_previous ist dagegen 1500 -> der aktuelle rechte Viewrand

    also werden die Blöcke vom vorherigen Rand bis zum aktuellen aufgefüllt
    wenn man allerdings nach links bewegt, passiert nichts (da hab ich mich im ersten Post getäuscht),
    da dann von anfang an i größer als der Maximalwert ist.
    Vorteil: es werden keine Blöcke übereinander gelegt
    Nachteil: wenn du dich nach links aus dem Bild bewegst, werden keine neuen Blöcke erstellt und du fällst runter.

    Beinahe hätt ichs vergessen: wenn man nach links und dann wieder nach rechts läuft, gibts doch doppelblöcke, also muss man mit

    GML-Quellcode

    1. if view_hview+view_xview > Maximum
    2. {
    3. Maximum = view_hview+view_xview
    4. //Dein Code inklusive meiner Ergänzung
    5. }

    So werden nur Steine erzeugt, wenn man weiter nach rechts gelaufen ist, als je zuvor.

    Ich hoffe,dass du es verstanden hast und ich keine Denkfehler gemacht habe.
  • Ich bin mir selbst nicht sicher ob das zu 100% sauber funktioniert.
    Aber zum Verständnis:
    Nehmen wir mal an, die View ist 500 px breit und befindet sich 1000px vom Raumanfang entfernt, war im Schritt davor noch auf Platz 900.


    Mein Raum ist genauso groß wie mein View(288x288px). Aber ich simuliere einen unendlichen Raum mit diesem Teil meines Codes

    GML-Quellcode

    1. view_xview = obj_player.x - view_wview / 2
    2. view_yview = obj_player.y - view_hview / 2


    Deshalb hab ich die Frage ja gestellt, sonst würde ich die Map sofort ganz erstellen^^
    Grüße Stupe
  • Du simulierst, keinen unendlich großen Raum, du nutzt einfach den leeren Raum. Kannst durchaus im Vorfeld außerhalb deines Raumes Instanzen erschaffen und diese dank deinem Code auch erreichen, da der view dem Spieler auch außerhalb des eigentlichen Rooms folgt. Aber da gibt es speicherbedingt natürlich grenzen.
    Bei einer Simulation würdest du nicht den Spieler bewegen, sondern den Raum um den Spieler herum und immer nur die benachbarten "Felder" in den Speicher laden und entfernte "Felder" wieder löschen.
  • Du wirst aber irgendwann ein Ende erreichen, weil der PC mit zu hohen Zahlenwerten nicht mehr vernünftig arbeiten können wird.
    und da du ja den Spieler und nicht die Spielwelt bewegst, erreichen die Koordinaten irgendwann diese hohen werte.
    Je größer die Zahlen werden, desto größer die Lücken an nicht darstellbaren Zahlen.
    Probiers aus und versuche eine Variable mit dem Wert 10000000000 um 1 zu erhöhen.
    Und wenn du sie um 50000 erhöhst, könnte es sein, dass sie nur um 35785 erhöht wird, weil das die nächste Binär Darstellbare Zahl ist.

    Lange Rede kurzer Sinn: Wenn du es wirklich unendlich haben willst musst du die Spielwelt um den Spieler herum verwalten.
  • Benutzer online 2

    2 Besucher