Gegner zum spieler drehen

  • GM 8
  • Gegner zum spieler drehen

    Hi

    ich mach grad nen top-down shooter, und bin schon sehr weit. im moment mache ich, dass der gegner sich zum spieler dreht, und dann schießt, wenn der spieler in der flugbahn der kugel ist.

    Des funktioniert auch alles, nur finde ich es blöd, dass der gegner sich falsch dreht, also z.B.:

    Gegner Winkel 10
    in richtung Spieler winkel 340

    natürlich ist der kürzere weg wenn er sich im uhrzeigersinn dreht, dann muss er nur 30 grad zurücklegen, stattdessen legt er aber die 330 grad zurück, da es fürn computer den sprung von 0 zu 360 grad ned gibt.

    wie kann ich jetzt machen, dass er sich richtig herum dreht?
  • Berechne einfach zuerst den kürzeren weg.

    GML-Quellcode

    1. // 180 = maximaler weg
    2. _diff = gegner_winkel-player_winkel
    3. if _diff>180
    4. {
    5. dreh_rechts()
    6. }
    7. else
    8. {
    9. dreh_links()
    10. }
    Alles anzeigen


    Vllt. ist da ein Fehler drin, aber och würds mal so versuchen.
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • GML-Quellcode

    1. //Step-Event deines Gegners
    2. var dir1, dir2, d;
    3. d = 3;
    4. dir1 = point_direction(x,y,mouse_x,mouse_y);
    5. dir2 = image_angle-dir1;
    6. if (dir2 > 180)
    7. dir2 -= 360;
    8. else if (dir2 < -180)
    9. dir2 += 360;
    10. if (dir2 > d)
    11. dir2 = d;
    12. else if (dir2 < -d)
    13. dir2 = -d;
    14. image_angle = (image_angle-dir2+360) mod 360;
    Alles anzeigen

    "Make love, not Warcraft"

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von HuRr!cAnE ()


  • Gegner Winkel 10
    in richtung Spieler winkel 340

    natürlich ist der kürzere weg wenn er sich im uhrzeigersinn dreht, dann muss er nur 30 grad zurücklegen, stattdessen legt er aber die 330 grad zurück, da es fürn computer den sprung von 0 zu 360 grad ned gibt.

    wie kann ich jetzt machen, dass er sich richtig herum dreht?


    Das selbe problem hatte ich vor jahren auch. Im grund ist es der Kürzeste drhe winkel auch von 10 zu 350. Wo bei man nicht über die vollen 340 sondern 20 grad gehen soll.
    Wichtig wird so etwas wenn man einen Panzer machen will und er Turm sich möglichst schnell zum feind dreht.
    Daher habe ich mal vor jahren ein script gemacht, was das ausgleicht


    myx und myx sind die Ziel Koordinaten.
    max_dir ist der Faktor. um so höher um so schneller kann er drehen wird aber ungenauer. Daher sollter er bei 1 oder weniger liegen. Je nach gebrauch


    GML-Quellcode

    1. myx=argument0
    2. myy=argument1
    3. max_dir=argument2
    4. if direction=ceil(point_direction(x,y,myx,myy)) then
    5. {
    6. //wenn auf ziel ausgerichtet zum beispiel schießen (if anweisung
    7. {
    8. //aktion der if anweisung hier drüber
    9. }
    10. }
    11. else
    12. {
    13. if direction<=180 and ceil(point_direction(x,y,myx,myy))<=180 then
    14. {
    15. if ceil(point_direction(x,y,myx,myy))<direction then
    16. direction=direction-(max_dir)
    17. if ceil(point_direction(x,y,myx,myy))>direction then
    18. direction=direction+(max_dir)
    19. }
    20. if direction>=180 and ceil(point_direction(x,y,myx,myy))>=180
    21. {
    22. if ceil(point_direction(x,y,myx,myy))>direction then
    23. direction=direction+(max_dir)
    24. if ceil(point_direction(x,y,myx,myy))<direction then
    25. direction=direction-(max_dir)
    26. }
    27. if direction<=180 and ceil(point_direction(x,y,myx,myy))>=180 then
    28. {
    29. if ceil(point_direction(x,y,myx,myy))<direction+180 then
    30. direction=direction+(max_dir)
    31. if ceil(point_direction(x,y,myx,myy))>direction+180 then
    32. direction=direction-(max_dir)
    33. }
    34. if direction>=180 and ceil(point_direction(x,y,myx,myy))<=180
    35. {
    36. if ceil(point_direction(x,y,myx,myy))>direction-180 then
    37. direction=direction-(max_dir)
    38. if ceil(point_direction(x,y,myx,myy))<direction-180 then
    39. direction=direction+(max_dir)
    40. }
    41. }
    Alles anzeigen


    Zur erklärung. Es gibt nun mal 2 möglichkeiten wo der gegner sein kann ( mal 2 möglichkeiten wo die aktuelle ausrichtung ist.)
    Wenn man zb nach 10 schaut und der Gegner bei 191 ist. ist das ziel als >spiler.direction+180.
    Jede der 4 Varianten greift in ein ander ein, sobald eine nicht mehr zutrifft.



    Es geht als nicht darum ob das ziel über den Winkel 180 ist oder darunte, sondern ob das ziel über 180 zustzlich der Spieler ausrichtung.
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • soweit ich das verstehe kann man das auch so machen:
    draw_sprite_ext(sprite0,0,x,y,1,1,point_direction(x,y,gegner_x,gegner_y),c_white,1)
    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
  • Ich glaub, du bist ein wenig spät dran mit deiner Antwort, husi - der Thread ist seit fast einem Jahr inaktiv.
    Außerdem hast du zwar Recht mit deiner Codezeile, das Problem war aber ein anderes. Wenn du im Draw-Event mit point_direction arbeitest, ist der Gegner immer zum Spieler gerichtet; moritz wollte aber, dass der Gegner sich allmählich zum Spieler dreht und dabei die Drehrichtung wählt, für die dieses Ausrichten am schnellsten geht.
    Soll heißen, wenn der Gegner grade nach oben guckt und der Spieler steht rechts hinter ihm, dann soll er sich im Uhrzeigersinn drehen. Steht der Spieler aber links hinter ihm, soll er sich gegen den Uhrzeigersinn drehen. Halt immer so, wie er am schnellsten in Richtung Spieler guckt.
  • natürlich
    hab es aber nicht anders verstanden
    aber das mit dem drehen hätten eigentlich alle wissen müssen wenn es anders gemeint wäre
    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