am ende des Raumes den den Anfang sehen

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

  • am ende des Raumes den den Anfang sehen

    Hallo!

    zu meinem Spiel:
    Ich habe einen Planeten. Ich kann also unendlich lange nach rechts gehen, ich komme irgendwann wieder an meinem Ausgangspunkt an, weil der Planet rund ist.
    programmtechnisch ist der Planet bei mir allerdings nicht rund, aber ich möchte den selben Effekt erzeugen.

    Ich möchte halt in eine beliebige Richtung auf der x-Achse laufen und wenn ich am Ende des Raumes ankomme,
    statt den Rand des Raumes, wieder die andere Seite des Raumes sehen und quasi weiterlaufen können.


    Nun fehlt mir die Idee wie ich das in GML umsetzen kann.

    Habe nochmal meine Idee mit Paint veranschaulicht :D

    Über jede Hilfe oder Tipps/Ideen in jeder Form würde ich mich sehr freuen. :)

    mfg Midrael

    #EditDa ich es hinbekommen habe, hier nochmal die Lösung:

    Quellcode

    1. view_xview[0]=o_player.x-blickweite_x/2//spieler zentrieren
    2. // blickweite_x ist hier nichts anderes als view_wview
    3. if x > room_width-view_xview[0]+blickweite_x/2 //wenn man am rechten raum ende ist
    4. {
    5. view_visible[1]=1 //view von dem rechten raum ende wird aktiviert
    6. view_visible[0]=1 //das ist der standard view und die kamera verfolgung
    7. view_visible[2]=0 //der view der linken seite wird nicht benötigt
    8. view_xview[1]=0 //hier sagen wir welchen bereich des raumes der view_port[1] wiedergeben soll
    9. view_xport[1]=room_width-view_xview[0] //gibt an wo der view_port[1] gezeichnet wird
    10. view_yport[1]=0
    11. view_wport[1]=view_xview[0]+blickweite_x-room_width //gibt an wieviel inhalt der view_port[1] hat
    12. view_wview[1]=blickweite_x*((view_xview[0]+blickweite_x-room_width)/blickweite_x); //bestimmt quasi die auflösung vom view_port[1]
    13. }
    14. if x < blickweite_x/2 //wenn man am rechten raum ende ist
    15. { //hier ist quasi alles wie oben, nur halt analog für die linke seite :)
    16. view_visible[0]=1
    17. view_visible[1]=0
    18. view_visible[2]=1
    19. view_xport[2]=0 //linke seite
    20. view_yport[2]=0
    21. view_wport[2]=view_xview*-1
    22. view_wview[2]=blickweite_x*(((view_xview*-1)/blickweite_x))
    23. view_xview[2]=room_width+view_xview[0]
    24. }
    25. if x>room_width{x=0} //wenn wir gerade aus dem raum rechts rauslaufen, werden wir an die linke seite des raumes teleportiert.
    26. if x<0{x=room_width} // der selbe spaß nur umgekehrt
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Midrael ()

  • Ich habs mal versucht und bin dran gescheitert. Das war zwar lange her, aber ich hätte jetzt auch kein Projekt wo ich das ausprobieren könnte. Der Lösungsansatz von mir wäre, einen View zu setzen, der immer das von der anderen Seite anzeigt. Wenn du dann an einem Gewissen punkt bist, also da wo du den View gezeichnet hast, "teleportierst" du dich dann zur echten Position.
    (Hat eh keiner was verstanden xD)
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Wenn ich dich richtig verstanden habe willst du die Rundung des Planeten am Horizont nicht zeigen. Es gibt 3 Möglichkeiten um das umzusetzen.

    1) Du lässt den Character an Ort und Stelle und alles andere bewegt sich und teleportiert sich immer vom Ende zum Anfang. Wie ein Fließband.

    GML-Quellcode

    1. //endstep
    2. if x < 0
    3. {
    4. x = room_width;
    5. }
    6. if x > room_width
    7. {
    8. x =0;
    9. }


    2) Du fügst am Ende und am Anfang des Raumes noch ein bisschen Terrain ein das genauso aussieht wie ende und anfang. In Zahlen ausgedrückt:
    8|9|1|2|3|4|5|6|7|8|9|1|2
    Das muss dann mindestens soviel überstehen wie die Hälfte deiner Viewbreite und alles bewegliche Teleportiert sich vom Anfang zum Ende aber mit einem gewissen Offset. Also der Spieler teleportiert sich beim Übergang von 1 zu 9 auf den Punkt 9 zu 1 oben auf der Auflistung. Also nie von ganz anfang bis Ende. Problem dabei können andere Spieler, Gegner etc sein die sich an den Raum Enden befinden weil die eigtl gleichzwitig ganz am Anfang und am Ende sein und gezeichnet werden müssen damit der Effekt unauffällig ist.

    3) Du benutzt 3 Views; die vor dem Anfang und nach dem Ende des Raums das Ende bez den Anfang hindrawen. <-- würd eich so machen, ist am einfachsten.

    out now: KNOSSOS auf itch.io
    ancient-pixel.com <<< ich freue mich über einen Besuch! ^^
  • Also danke erstmal für die Antworten! Ich bin auf dem richtigen Weg.

    Genau, die Rundungen würden wegfallen. Quasi wie Mario/Terraria etc, nur das an den Rändern nicht Schluss ist, sondern dass man weitergehen kann und am anderen Ende landet.
    Von deinen 3 Methoden versuche ich gerade die 3. umzusetzen, da sie für mich das beste Ergebnis liefern würde.
    Allerdings habe ich ein paar Probleme mit den Views.

    Aber ersteinmal was ich schon habe:
    Habe erstmal den Code nur für die rechte Seite meines Raumes geschrieben.

    Create

    Quellcode

    1. surf=surface_create(view_wview/2,view_hview)


    Draw

    Quellcode

    1. ​sprt=sprite_create_from_surface(application_surface, 0, 0, view_wview/2, view_hview/2, true, false, 0, 0);
    2. surface_set_target(surf)
    3. draw_clear_alpha(0,0)
    4. draw_sprite(sprt,0,0,0)
    5. surface_reset_target()
    6. draw_surface(surf,room_width,0)
    7. sprite_delete(sprt);


    Das Funktioniert alles gut. Aber der Punkt ist das ich ja nicht die application_surface möchte, sondern jeweils die Enden des Raumes. Also ein bereich der nicht im momentanen View liegt. Und genau da ist gerade mein Problem.
    Auf der application_surface wird ja der momentane view gespeichert. Ich müsste aber irgendwie einen bestimmten (also die Enden) des Raumes als Bild auf meine Surface schreiben können.

    Habt ihr da vielleicht noch eine Idee oder geht es viel einfacher?
  • Also Surfaces bräuchte man hier ja nicht. Wie Akku_Ryou und ich gesagt haben, würde es mit 3 views gehen.
    Stelle es dir so vor. Du hast ein ganz normalen, der dir einfach folgt, also deine "Kamera". Und dann setzt du evtl. außerhalb den View der dann aber die andere Seite filmt...
    Ich hab jetzt einfach mal ein Bild dazu gemacht

    edit:
    Als ich das versucht habe, war glaub ich das Problem da, dass der Port on screen nicht außerhalb des Bildschirm liegen durfte. Kann aber auch an der alten Version gelegen haben.
    Ansonsten müsstest du das anzeigen natürlich immer anpassen
    Bilder
    • Screenshot.png

      8,23 kB, 767×399, 264 mal angesehen
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Es funktioniert!
    Danke für die Ideen!

    Falls irgendwer irgendwann mal das selbe Problem haben sollte, hier ist der Code:

    Quellcode

    1. view_xview[0]=o_player.x-blickweite_x/2//spieler zentrieren
    2. // blickweite_x ist hier nichts anderes als view_wview
    3. if x > room_width-view_xview[0]+blickweite_x/2 //wenn man am rechten raum ende ist
    4. {
    5. view_visible[1]=1 //view von dem rechten raum ende wird aktiviert
    6. view_visible[0]=1 //das ist der standard view und die kamera verfolgung
    7. view_visible[2]=0 //der view der linken seite wird nicht benötigt
    8. view_xview[1]=0 //hier sagen wir welchen bereich des raumes der view_port[1] wiedergeben soll
    9. view_xport[1]=room_width-view_xview[0] //gibt an wo der view_port[1] gezeichnet wird
    10. view_yport[1]=0
    11. view_wport[1]=view_xview[0]+blickweite_x-room_width //gibt an wieviel inhalt der view_port[1] hat
    12. view_wview[1]=blickweite_x*((view_xview[0]+blickweite_x-room_width)/blickweite_x); //bestimmt quasi die auflösung vom view_port[1]
    13. }
    14. if x < blickweite_x/2 //wenn man am rechten raum ende ist
    15. { //hier ist quasi alles wie oben, nur halt analog für die linke seite :)
    16. view_visible[0]=1
    17. view_visible[1]=0
    18. view_visible[2]=1
    19. view_xport[2]=0 //linke seite
    20. view_yport[2]=0
    21. view_wport[2]=view_xview*-1
    22. view_wview[2]=blickweite_x*(((view_xview*-1)/blickweite_x))
    23. view_xview[2]=room_width+view_xview[0]
    24. }
    25. if x>room_width{x=0} //wenn wir gerade aus dem raum rechts rauslaufen, werden wir an die linke seite des raumes teleportiert.
    26. if x<0{x=room_width} // der selbe spaß nur umgekehrt
    Alles anzeigen