Kollision Frage

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

  • Kollision Frage

    hy


    also ich habe ein spiel wie pacman erstellt nur das man schießen kann mit dieser collision code

    Step event
    obj spieler

    GML-Quellcode

    1. ///Kollission
    2. if (!place_free(x+hspeed,y))
    3. {
    4. if (hspeed < 0)
    5. {
    6. move_contact_solid(180,-1)
    7. }
    8. if (hspeed > 0)
    9. {
    10. move_contact_solid(0,-1)
    11. }
    12. hspeed = 0;
    13. }
    14. if (!place_free(x,y+vspeed))
    15. {
    16. if (vspeed < 0)
    17. {
    18. move_contact_solid(90,-1)
    19. }
    20. if (vspeed > 0)
    21. {
    22. move_contact_solid(270,-1)
    23. }
    24. vspeed = 0;
    25. }
    26. if (!place_free(x+hspeed,y+vspeed))
    27. {
    28. hspeed = 0;
    29. }
    Alles anzeigen




    und er funktioniert auch einwandfrei.....aber wenn ich dann noch im step event dazu schreibe das er sich mit der maus mitdrehen soll also der spieler dann fängt er an an den wänden hängen zu bleiben....ich benutze natürlich diesen code für das mit der maus drehen

    step event
    obj spieler

    GML-Quellcode

    1. ​direction = point_direction(x,y,mouse_x,mouse_y);
    2. image_angle = direction;




    warum tut er das??? und wie kann ich das lösen???
  • Ich denke es liegt an der direction, da du nur 0, 90, 180 und 270 Grad hast.
    Das sind nur vier Richtungen aber so eine Maus kann 360 Richtungen haben.
    Also denke ich das du die direction in den code mit einbinden musst.
    Das sind jetzt alles nur Vermutungen da ich schon lange nicht mehr mit sowas gearbeitet habe. :D
    Für jene, die ständig das Scheitern fürchten, sind Erfolge auf ewig unerreichbar.
  • was mir grad noch aufgefallen ist das die steuerung dann nicht mehr normal funnktioniert. also ich hab normal

    GML-Quellcode

    1. hmove = -keyboard_check(vk_left)+keyboard_check(vk_right);
    2. vmove = -keyboard_check(vk_up)+keyboard_check(vk_down);
    3. hspeed = hmove*8;
    4. vspeed = vmove*8;


    für die steuerung....aber wenn ich dann den code hier hinzufüge

    GML-Quellcode

    1. direction = point_direction(x,y,mouse_x,mouse_y);
    2. image_angle = direction;



    dann ist es so das im prinzip egal welche taste ich drücke er immer zur maus fährt....was ich eigentlich nicht wollte...weil ich wollte nur das das sprite sich mit der maus dreht aber nicht das die bewegung auch davon einbezogen ist.
  • Eddysoulo hat es schon geschrieben. Es liegt an der Maske deines Sprites.

    Diese wird höchstwahrscheinlich rechteckig sein, solange du sie nicht manuell geändert hast. Dadurch das du das Sprite drehst, dreht sich die Kollissionsmaske auch mit, und zack bleibt dein Pacman im Weg hängen.
    Hier an einem kleinen kunstwerk im Anhang erklärt.

    Die Spielerfigur grün bleibt zwar zwischen den Wänden, die Kollissionsmaske wird aber mitgedreht und hängt in den Wänden (Bild2).

    Wie du es lösen kannst?
    Im Spriteeditor eine Runde Maske einstellen und den Spriteorigin auf die Mitte des Sprites setzen. Dann solle deine Spielerfigur durch das Level kommen.
    Bilder
    • gm2.png

      9,26 kB, 325×193, 278 mal angesehen
  • danke für deine antwort


    aber ich hab die kollisionmaske schon selbst geändert gehabt sodass sie nicht rechteckig ist sondern rund.....trotzdem besteht das problem
    ich denke wirklich das es das ist das ich nicht alle directions abdecke in der kollissions abfrage...aber wie kann ich das machen??mit nen switch???
  • ich würde eher sagen mit if weil bei einem if-statement du sagen kannst größer oder kleiner... erspart dir viel schreib zeit rein theoretisch kannst du das auch mit switch machen aber dann würde das ja in etwa so aussehen

    switch(direction){
    case 0:
    case 1:
    case 3:
    case 4:
    usw...
    }
    und mit if einfach if (direction >=0 && < 90){
    rechts;
    }
    if (direction >= 90 && <180){
    hoch;
    }

    usw...
    Wir stehen zusammen und wir fallen zusammen
  • ein switch ist schon das richtige aber mit einer dividierten direction

    GML-Quellcode

    1. switch(direction div 90)
    2. {
    3. //case 0 - 3 für jede der 4 richtungen
    4. }

    div 90 zerlegt dir die direction in einen wert von 0 bis 3. 0 entspricht 0 bis 89 grad, 1 entspricht 90 bis 179 grad usw.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • aha....wieso dividieren??man könnte ja gleich einfach direction = 360 und dann switch(direction) und dann mehrere cases oder???


    eins noch...also ich hab ein problem beim menü ich würde gerne die buttons und die schrift schräg nach oben haben...wie mach ich das...oder muss ich dafür schon in
    photoshop alles schief machen???
  • div ist nicht Division.
    div funktioniert mit dem Code:

    GML-Quellcode

    1. x div y
    2. //=
    3. floor(x/y)


    es gibt dir an, wie oft man durch eine Zahl teilen kann
    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
  • Um das aufzuklären, div gibt dir die Zahl vor dem Komma nach einer Division an. Du kannst auch statt 360 cases nur case 0, 90, 180 und 270 schreiben. Die anderen 356 müssen nicht aufgelistet werden. Aber wenn du dann als direction 85 grad hast, hast du keine möglichkeit herauszufinden auf welchen case das jetzt zu trifft. deswegen div 90 und dann trifft 85 grad auf case 0 zu.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Hey dann hab ich mit meinen ersten post doch gar nicht so falsch gelegen. :D
    Obwohl ich später daran gezweifelt habe und mir als einzige logisch Erklärung nur die Kollisionsmaske vorstellen konnte.
    Aber wenn es daran nicht liegt können es nur noch die Richtungen sein oder irgendwo in deinen Code haben sich Fehler eingeschlichen. ;)
    Für jene, die ständig das Scheitern fürchten, sind Erfolge auf ewig unerreichbar.