Raster wie im RPG Maker

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

  • ich seh gerade, dass die Antwort von Rodrog in GML ist. Kein Hexenwerk, ich habs dir mal ein wenig kommentiert.
    Dieser Code landet am besten in einer Schleife deines Game-Loops. Also z.B. dem Step Event des Spielers.

    GML-Quellcode

    1. if(x mod 16 == 0 && y mod 16 == 0) { // mit Modulo wird der Rest ausgerechnet: 1 mod 16 = 15; 2 mod 16 = 14 ... 16 mod 16 = 0; Die Position also mit 16 einen Rest von 0 ergibt: 16, 32, 48 usw.
    2. movement_x = 0; //Die Geschwindigkeit wird für die X und Y Achse auf 0 gesetzt
    3. movement_y = 0;
    4. if(keyboard_check(ord("D"))) { //Nur bei einem Tastendruck, wird diese an der entsprechenden Achse erhöhht. Also D, für Rechts:
    5. movement_x = 1; //X Achse + 1
    6. } else if (keyboard_check(ord("A"))) {
    7. movement_x = -1; //usw
    8. } else if(keyboard_check(ord("W"))) {
    9. movement_y = -1;
    10. } else if (keyboard_check(ord("S"))) {
    11. movement_y = 1;
    12. }
    13. x += movement_speed*movement_x; //Am Ende wird dein Spieler in die entsprechende Richtung beschleunigt.
    14. y += movement_speed*movement_y;
    15. } else {
    16. x += movement_speed*movement_x; //Der Spieler bewegt sich so lange weiter, bis er wieder im Raster fetshängt (X/Y Rest 16 = 0) und die movement_x/y wieder auf 0 gesetzt wird.
    17. y += movement_speed*movement_y;
    18. }
    Alles anzeigen


    Der Spieler bewegt sich also nur in eine Richtung, wenn die Position beider Achsen bei 16 Rest 0 ist. also 16, 32, 48, [...] und du eine Taste drückst. Dann aber so lange, bis er wieder im Raster festsitzt.

    Division mit Rest ist hier genauer erläutert.

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

  • Naja, überleg mal. Der Code wird einem Objekt zugewiesen. Z.B. Dein Spielerobjekt und manipuliert die X/Y Position and den Achsen. Das ist genau wie in einem Koordinatensystem.
    0,0 ist in diesem Fall oben links, 0,1 ist ein Pixel gleich darunter, etc.
    Mit x+= im Step Event (also einem Loop, der vl 60 mal pro Sekunde durchläuft) sagst du, das Objekt, das diesen Code beinhalted soll so lange nach X um movementspeed * movement_x (1 * 1 z.B.) bewegen, bis das Objekt wieder bei einer Position von bei Division durch 16 einen Rest von 0 hat. Natürlich gilt der gesammte Code nur in diesem einen Objekt, sofern du ihn nicht in ein anderes Objekt einfügst, oder ein Script erstellst, das von anderen Objekten auch genutzt wird.

    Wäre doch sinnfrei, wenn sich alle möglichen Objekte plötzlich gleich verhalten, weil du auf der Tastatur eine Taste drückst.

    GML-Quellcode

    1. x += movement_speed*movement_x; //Am Ende wird dein Spieler in die entsprechende Richtung beschleunigt.
    2. y += movement_speed*movement_y;
  • Ja das meinte ich ja,
    meine Frage war ja, ob ich das irgendwie abkürzen kann, sodass ich nicht mehr jedes Mal den kompletten Code in das Objekt schreiben muss.
    Soweit wie ich es verstanden habe müsste ich also deinen obigen Code in das Playerobjekt einfügen und noch ein Script für die NPCs erstellen auf dass sie zugreifen können. Hab ich damit Recht?
  • Für diesen Zweck gibt es Scripte. Wenn du den obigen Code in ein Script packst und dein Spieler das Script im Step Event ausführt, liegt der "Scope" des Scripts in diesem Objekt. Man kann zwar lokale Variablen definieren, die den Gegenseiten (Script und Objekt) unbekannt sind, aber Ja: wenn das Script in Step Events von 2 Objekten aufgerufen wird, werden beide das selbe machen. Jedes Objekt für sich.
  • Also soll der Code für die NPCs am Ende so aussehen?

    GML-Quellcode

    1. if(x mod 16 == 0 && y mod 16 == 0) { // mit Modulo wird der Rest ausgerechnet: 1 mod 16 = 15; 2 mod 16 = 14 ... 16 mod 16 = 0; Die Position also mit 16 einen Rest von 0 ergibt: 16, 32, 48 usw.
    2. movement_x = 0; //Die Geschwindigkeit wird für die X und Y Achse auf 0 gesetzt
    3. movement_y = 0;
    4. if !place_snapped(32, 32)
    5. {
    6. move_snap(32, 32);
    7. }
    8. x += movement_speed*movement_x; //Am Ende wird dein Spieler in die entsprechende Richtung beschleunigt.
    9. y += movement_speed*movement_y;
    10. } else {
    11. x += movement_speed*movement_x; //Der Spieler bewegt sich so lange weiter, bis er wieder im Raster fetshängt (X/Y Rest 16 = 0) und die movement_x/y wieder auf 0 gesetzt wird.
    12. y += movement_speed*movement_y;
    13. }
    Alles anzeigen

  • Stand eigentlich in keinem Bezug zu dem anderen Code. Wollte damit nur sagen das es evtl noch andere Lösungen gibt. So wie du das da jetzt eingebaut hast macht es denke ich aber eher weniger sinn. Mit einem alarm in Verbindung mit einem keyboard_check könntest du den spieler/npc ja zb max 3 felder pro sekunde gehen lassen.

    GML-Quellcode

    1. //für jede Richtung
    2. If (keyboard_check(dein_key)) {
    3. If (alarm [0] = -1 ) {
    4. alarm [0] = room_speed/3;
    5. x += 16;
    6. }
    7. }
    8. if !place_snapped(16, 16)
    9. {
    10. move_snap(16,16);
    11. }
    Alles anzeigen

    Das place_snap ist in dem fall ja fann nur eine Absicherung um objekte auf diesem raster zu halten falls mal ein Fehler unterläuft.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Ich hab mit dem anderen aber nix am Hut,kann ich nichts zu sagen^^. Aber meins sollte auch vollkommen ausreichen. Für einen NPC kannst du das keyboard_check ja durch ne variable move_right ,move_left usw ersetzen.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Zwingt dich ja niemand ihn zu benutzen. aber modulo etc verstehst du? Ich dachte halt eher das Gegenteil. Wenn du noch keine Alarms benutzt hast würde ich dir ans Herz legen darüber nachzulesen, die sind sehr hilfreich. Die Antwort bleibt aber eigentlich die selbe, auch bei dem anderen code kannst du die keyboard Abfragen einfach durch variablen ersetzten ums in einem npc zu benutzen.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Anmerkung: Du kannst ein Skript erstellen, wo du horizontale und vertikale Richtung angibst. So musst du nur noch eine Zeile ausführen, statt jedes Mal diese paar mehr Zeilen überall stehen zu haben.
    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