Boxen verschieben?

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

  • Hallo!

    Nichts leichter als das,

    "Frei Schnauze" oder "Grid basierend" ?

    Beispiel 1: Kollisionsevent bei der BOX (mit dem Player)

    GML-Quellcode

    1. ///Box schieben!!!
    2. if(not(place_meeting(x+8*other.hspeed, y+8*other.vspeed, obj_mauer)) and not(place_meeting(x+8*other.hspeed, y+8*other.vspeed, obj_kiste)))
    3. {
    4. x += 8*other.hspeed
    5. y += 8*other.vspeed
    6. }


    Beispiel 2: per Grid

    -> Create_Event_Player

    GML-Quellcode

    1. move_speed = 4; // Geschwindigkeit des Spielers
    2. grid_size = 32; // Größe der Kästchen


    ​-> Laufen (Links /Rechts/ Oben/ Unten)

    GML-Quellcode

    1. // argument0 = x (0 oder 1 oder -1)
    2. // argument1 = y (0 oder 1 oder -1)
    3. var aim_xt, aim_yt;
    4. if (alarm[0] == -1) {
    5. aim_x = x+argument0*grid_size;
    6. aim_y = y+argument1*grid_size;
    7. if (!place_meeting(aim_x,aim_y,obj_mauer)) {
    8. if (place_meeting(aim_x,aim_y,obj_kiste)) {
    9. aim_xt = aim_x+argument0*grid_size;
    10. aim_yt = aim_y+argument1*grid_size;
    11. if (!place_meeting(aim_xt,aim_yt,obj_mauer) and !place_meeting(aim_xt,aim_yt,obj_kiste)) {
    12. with (obj_mauer) {
    13. if (x == other.aim_x and y == other.aim_y) {
    14. aim_x = aim_xt;
    15. aim_y = aim_yt;
    16. alarm[0] = 1;
    17. }
    18. }
    19. alarm[0] = 1;
    20. }
    21. }
    22. else
    23. alarm[0] = 1;
    24. }
    25. }
    Alles anzeigen


    ​->Alarm-Event:

    GML-Quellcode

    1. if (!mp_linear_step(aim_x,aim_y,move_speed,false))
    2. alarm[0] = 1;
    3. else
    4. alarm[0] = -1;
  • Ok, aber es sehr einfach.

    GML-Quellcode
    ///Box schieben!!!
    if(not(place_meeting(x+8*other.hspeed, y+8*other.vspeed, obj_mauer)) and not(place_meeting(x+8*other.hspeed, y+8*other.vspeed, obj_kiste)))
    {
    x += 8*other.hspeed
    y += 8*other.vspeed
    }


    Also dieses Beispiel ist aus der Sicht der Kiste (Box) geschrieben.

    Am Anfang wird geprüft ob ein Objekt (z.B. eine Mauer oder eine weitere Kiste) an der dahinter liegenden Position ist.*1
    Wenn dies nicht der Fall ist wird die if-Bedingung ausgeführt.

    not(place_meeting(x+8*other.hspeed, y+8*other.vspeed, obj_mauer)

    *1 :
    x oder y sind hierbei die Koordinaten deiner Kisten-Instanz.
    Wenn sich der Player jetzt in einer bestimmten Richtung bewegt erhöht oder erniedrigt sich: other.hspeed bzw. other.vspeed .
    So jetzt wird gerechnet:
    Gehen wir von einer x-Position von 100 und einer y-Position von 100 aus.
    Jetzt musst du bei dieser Formel (x+8*other.hspeed bzw. y+8*other.vspeed) nur noch wissen wie groß deine Kiste ist.
    Diese Formel ist hierbei darauf ausgelegt das dein Player und deine Kiste 32x32 Pixel sind.
    (Das musst du natürlich evtl. mathematisch bei dir anpassen.)
    Bsp.: x = x+8*other.hspeed -> x = 100+8*4 (Wie du siehst muss sich hierbei der Spieler mit einer Geschwindigkeit von 4 in jeder Richtung bewegen. (32 = 8*4 damit die Gleichung aufgeht.) Dies funktioniert natürlich auch negativ (also in jede Richtung.)
    Also die nächste x und y Position wären bei einer:
    links Bewegung: x=68 y=100 /rechts Bewegung: x=132 y=100 /Bewegung nach unten: x=100 y=132 /Bewegung nach oben: x=100 y= 68

    Das ganze funktioniert bei einer Kollisionsüberprüfung im Kollisionsevent hervorragend da die Funktion: "place_meeting" immer in die "Zukunft" prüft.

    Ok, gehen wir jetzt mal in die Bedingung.

    x += 8*other.hspeed;
    y += 8*other.vspeed;

    Hier werden jetzt die Koordinaten x und y der Kisten-Instanz verändert.
    Ausgeschrieben würden die Formeln so lauten:

    Beispiel: Bewegung nach oben. (x=100 y=100)
    x = x + 8 * other.hspeed (hier: 0)
    y = y + 8 * other.vspeed (hier: -4)

    Deine nächste x-Koordinate (der Kiste) wäre also: 100+(8*0) = 100 (weil 8*0 ist 0)
    Deine nächste y-Koordinate (der Kiste) wäre also: 100+(8*-4) = 68 (weil 8*-4 ist -32)

    ...
    So nun müsstest du es selber aus Sicht des Players bzw. mit anderen Geschwindigkeiten und Sprite-Größen an dein Projekt anpassen.

    Bei Hilfe melde dich einfach nochmal.