Beispiel: View mit Überlauf

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

    • Beispiel: View mit Überlauf

      Mich hat vor kurzem mal wieder das Bastelfieber gepackt, und als Ergebnis kam dieses kleine Skript heraus (falls jemand einen passenderen Titel findet, wäre ich dankbar).

      Manch einer möchte vielleicht mal einen Raum erstellen, in dem man mit einem View herumnavigieren kann, aber immer im Raum bleibt. Mit anderen Worten, wenn man z.B. zur rechten Seite hinaus läuft, soll man zur linken wieder rein kommen, und das möglichst ohne Sprung. Die Idee wir fügen, ohne, dass der Spieler es merkt, 3 weitere Views hinzu, die in die "überstehenden" Teile des Views die anderen Enden des Raumes zeichnen.

      Zur Veranschaulichung:
      In folgendem Bild sieht man, wie die 4 Views im Raum platziert sind, wobei das rote Rechteck die View ist, mit der man durch den Raum navigiert, und die anderen 3 die Hilfsviews sind.


      Und so werden die Views dann auf den Bildschirm gezeichnet:


      Im folgenden habe ich absichtlich auf diverse Optimierungen verzichtet, damit der Code noch halbwegs lesbar aussieht, und ich hoffe, die Kommentare sind ausreichend.
      Als Testumgebung reicht ein Raum mit aktivierter View0, in dem sich ein Controller-Objekt befindet, das auf Druck einer Pfeiltaste View0 in die entsprechende Richtung bewegt, und im Step Event folgendes Skript ausführt:

      GML-Quellcode

      1. /* Dieses Skript realisiert einen Überlauf beim Scrollen
      2. * unter Verwendung von 4 Views. An folgenden Positionen wird gezeichnet:
      3. * x x x
      4. * x 0 1
      5. * x 2 3
      6. * Damit dieser Code verständlicher ist, wurde bewusst auf Optimierung
      7. * verzichtet. VWIDTH, PWIDTH, VHEIGHT und PHEIGHT sind für dieses Skript vorher als Konstanten
      8. * zu deklarieren und beschreiben die Breite und Höhe des Views im Raum und des
      9. * Bereiches auf dem Bildschirm.
      10. */
      11. var i,hor;
      12. // View 1-8 deaktivieren, falls sie nicht benötigt werden
      13. for(i:=1;i<=3;i+=1){
      14. view_visible[i]:=0;
      15. }
      16. // View0 zurechtrücken, falls es aus dem Raum hinaus gerutscht ist
      17. view_xview[0]:=(view_xview[0]+room_width) mod room_width;
      18. view_yview[0]:=(view_yview[0]+room_height) mod room_height;
      19. // View0 wieder auf die richtige Größe ziehen
      20. view_wview[0]:=VWIDTH;
      21. view_hview[0]:=VHEIGHT;
      22. view_wport[0]:=PWIDTH;
      23. view_hport[0]:=PHEIGHT;
      24. // Abfrage, ob View0 zum Teil aus dem Raum ragt
      25. hor:=0;
      26. if(view_xview[0]+VWIDTH>=room_width){ // View0 ragt rechts raus
      27. hor:=1; // Markierung für die vertikale Abfrage
      28. // View0 anpassen
      29. view_wview[0]:=room_width-view_xview[0]-1;
      30. view_wport[0]:=view_wview[0]*PWIDTH/VWIDTH;
      31. // View1 aktivieren und anpassen
      32. view_visible[1]:=1;
      33. view_xview[1]:=0;
      34. view_yview[1]:=view_yview[0];
      35. view_hview[1]:=VHEIGHT;
      36. view_wview[1]:=VWIDTH-view_wview[0];
      37. view_xport[1]:=view_wport[0];
      38. view_yport[1]:=0;
      39. view_wport[1]:=PWIDTH-view_wport[0];
      40. view_hport[1]:=PHEIGHT;
      41. }
      42. if(view_yview[0]+VHEIGHT>=room_height){ // View0 ragt unten raus
      43. // View0 anpassen
      44. view_hview[0]:=room_height-view_yview[0]-1;
      45. view_hport[0]:=view_hview[0]*PHEIGHT/VHEIGHT;
      46. // View2 aktivieren und anpassen
      47. view_visible[2]:=1;
      48. view_xview[2]:=view_xview[0];
      49. view_yview[2]:=0;
      50. view_hview[2]:=VHEIGHT-view_hview[0];
      51. view_wview[2]:=VWIDTH;
      52. view_xport[2]:=0;
      53. view_yport[2]:=view_hport[0];
      54. view_wport[2]:=PWIDTH;
      55. view_hport[2]:=PHEIGHT-view_hport[0];
      56. if(hor){ // View 2 ragt rechts und unten raus
      57. // View1 korrigieren
      58. view_hview[1]:=view_hview[0];
      59. view_hport[1]:=view_hport[0];
      60. // View2 korrigieren
      61. view_wview[2]:=view_wview[0];
      62. view_wport[2]:=view_wport[0];
      63. // View3 aktivieren und anpassen
      64. view_visible[3]:=1;
      65. view_xview[3]:=0;
      66. view_yview[3]:=0;
      67. view_wview[3]:=view_wview[1];
      68. view_hview[3]:=view_hview[2];
      69. view_xport[3]:=view_xport[1];
      70. view_yport[3]:=view_yport[2];
      71. view_wport[3]:=view_wport[1];
      72. view_hport[3]:=view_hport[2];
      73. }
      74. }
      Alles anzeigen


      VHEIGHT und VWIDTH geben an, welche Ausmaße die 4 Views im Raum haben sollen, wenn man sie nebeneinander legen würde, PHEIGHT und PWIDTH geben an, wie groß die 4 Views dann auf den Bildschirm gezeichnet werden. Falls man dies zur Laufzeit ändern möchte, kann man dazu auch Variablen verwenden.

      Aber in den meisten Fällen wird dieses Skript sowieso noch stark angepasst werden müssen, um in ein Spiel eingebaut zu werden.