Kollision aus 4 richtungen, Objekt soll sich verschieben

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

  • Kollision aus 4 richtungen, Objekt soll sich verschieben

    Hallo,
    ich habe folgendes problem, bzw. ein verständnisproblem :)

    ich habe eine Objekt (Schiebestein) wenn dieser vom Player getroffen/berührt wird soll der Stein sich vom Player weg bewegen und aber wenn er dann z.B an einer Wand anstösst stoppen.
    Kollisionsmöglichkeiten sind oben,unten,links und rechts.

    Wenn ich nun eine abfrage von einer seite mache,z.B. Collision von links, geht es im grunde,
    kommt nun eine 2 kollision , z.B. von rechts dazu, wird immer nur die 2. abfrage gestartet.


    Quellcode

    1. var speedbreak
    2. speedbreak = 0.2
    3. // von links
    4. // wenn der platz links vom Stein nicht mehr frei ist, dann...
    5. if not place_empty(x-global.speedx,y)
    6. {
    7. // bewege den stein auf der xAchse 90 Pixel weit nach rechts
    8. // in der globalen geschwindigkeit von 6 Pixel pro frame
    9. move_towards_point(x+80,y,global.speedx)
    10. // die bewegungsgeschwindigkeit um 0.2 Pixel pro frame abbremsen
    11. friction = speedbreak
    12. }
    13. // von rechts
    14. if not place_empty(x+global.speedx,y)
    15. {
    16. move_towards_point(x-80,y,global.speedx)
    17. friction = speedbreak
    18. }
    19. // von oben
    20. if not place_empty(x,y-global.speedx)
    21. {
    22. move_towards_point(x,y+80,global.speedx)
    23. friction = speedbreak
    24. }
    25. // von unten
    26. if not place_empty(x,y+global.speedx)
    27. {
    28. move_towards_point(x,y-80,global.speedx)
    29. friction = speedbreak
    30. }
    Alles anzeigen
  • Wenn ich nun eine abfrage von einer seite mache,z.B. Collision von links, geht es im grunde,kommt nun eine 2 kollision , z.B. von rechts dazu, wird immer nur die 2. abfrage gestartet.


    Also der Fehler tritt auf wenn z.B links und rechts von deinem Objekt eine Collision auftritt?

    Dein Programm funktioniert nicht in diesem Fall, weil dafür kein Fall definiert ist. Nämlich der Fall, das das Objekt eingeschlossen ist. Der Code sieht nur, das er sich bewegen muss, wenn irgendwo eine Collsion stattfindet. Das er Eingeschlossen wurde, kann er mit den vier Fällen garnicht erkennen.

    Um den Fehler zu vermeiden könntest du ja noch eine Abfrage zusätzlich einbauen, z.b wie:

    // von oben
    if not place_empty(x,y-global.speedx) //oben ist ne collision
    {
    if place_empty(x,y+global.speedx) { // er soll sich tatsächlich nur bewegen wenn dann auch unten frei ist.
    move_towards_point(x,y+80,global.speedx)
    friction = speedbreak
    }}

    hoffe hab dein problem richtig verstanden.. xD
  • Bin auf der Arbeit,
    ich mach morgen mal ein lauffähiges beispiel.

    Edit://
    So, entweder liegts an der Nachtschicht oder ich verkalke jetzt total.
    Jetzt bekomm ich nicht einmal hier ne kollision hin :headtouch:
    Hier mal das Projekt: http://www.deuteriumoxid.com/gamemaker/Project5.gmz

    Es ist ansich ganz simpel,
    ich zeichne das sprite0 an den Mousekoordinaten und zeichne drei grüne vierecke.
    Wenn ich nun eins der vierecke mit der mouse von links berühre soll es sich nach rechts verschieben,bzw. von der mouse weg bewegen.
    Natürlich auch wenn es von irgendeiner anderen richtung kommt genauso.




    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Fabbio ()

  • Hallo Midrael,
    8) genau, das ist noch etwas ungewöhnlich für mich, werde mich aber sicher in ein, zwei jahren daran gewöhnt haben ;)

    Ok, oben im link habe ich das Projekt aktuallisiert hochgeladen.
    Hier Video sieht man vieleicht mein Problem besser,
    am besten an dem rechten viereck.

    Nach unten und oben verschieben geht, aber wenn ich es nun von der Seite anstoße, bewegt es sich immer nur nach oben.
    Benutze ich hier vieleicht die falsche Kollisionsabfrage ??
  • Deine Collisionsabfragen überlappen sich. Wenn du z.B deine beiden links/rechts abfragen hinter die oben/unten abfragen schreibst, bewegt sich der block nur nach links.

    Du bewegst dich mit deinem Player in den Würfel. Jetzt geht Game Maker dein Script durch und stell fest, das alle Abfragen zutreffen, weil place_empty nach einer collision zwischen zwei masken in einem punkt guckt. und sobald du den würfel berührst, behrüren sich die masken und jedes place empty trifft zu.

    mit collision_point klappts..:

    Quellcode

    1. var speedbreak
    2. speedbreak = 0.2
    3. // von links
    4. // wenn der platz links vom Stein nicht mehr frei ist, dann...
    5. if collision_point(x-32,y,object0,1,1)
    6. {
    7. // bewege den stein auf der xAchse 90 Pixel weit nach rechts
    8. // in der globalen geschwindigkeit von 6 Pixel pro frame
    9. move_towards_point(x+80,y,global.speedx)
    10. // die bewegungsgeschwindigkeit um 0.2 Pixel pro frame abbremsen
    11. friction = speedbreak
    12. }
    13. // von rechts
    14. if collision_point(x+32,y,object0,1,1)
    15. {
    16. move_towards_point(x-80,y,global.speedx)
    17. friction = speedbreak
    18. }
    19. // von oben
    20. if collision_point(x,y-32,object0,1,1)
    21. {
    22. move_towards_point(x,y+80,global.speedx)
    23. friction = speedbreak
    24. }
    25. // von unten
    26. if collision_point(x,y+32,object0,1,1)
    27. {
    28. move_towards_point(x,y-80,global.speedx)
    29. friction = speedbreak
    30. }
    Alles anzeigen


    #Edit
    collision_point guckt wirklich nur nach einer collision in einem punkt, also das was du brauchst. du musst nurnoch die bedingungen anpassen. also nichtmehr x+global_speedx sondern z.b. x+sprite_width/2 bzw +-32 in deinem fall
  • Ah, verstehe.
    Die Funktionen place_empty...usw. Prüfen nur den Generellen kontakt, hier muss ich also explizit die Kollisionspunkt angeben.
    Denkfehler meinerseits.
    Ich habe das ganze ja schon in GLBasic gemacht und musste/habe dort auch diese Punkte selber angegeben und funktioniert ja Prima.
    Aber wie gesagt, Denkfehler, genauso wie das mit den Objekten und Sprites,
    aber ich werde da schon noch dahinter kommen, stück für stück.

    Nochmals vielen Dank für Deine Mühen.
    Gruss vom Bodensee,
    Fabbio