Verzögerte Reaktion bei image_angle

  • GM 8

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

  • Verzögerte Reaktion bei image_angle

    Ich habe Gegner, welche sich immer in Richtung des Spielers drehen. Das funktioniert sehr gut, wenn der Spieler aber zu nah an den Gegner kommt und sich bewegt, sieht es aus, als würde er komisch tanzen.

    Der Gegner dreht sich so zum Spieler:

    GML-Quellcode

    1. if health > 1{
    2. image_angle=point_direction(obj_ship06_rot_links.x,obj_ship06_rot_links.y,obj_sorades.x,obj_sorades.y)
    3. }


    Jetzt habe ich versucht, die Anpassung zu verzögern, indem ich es über einen Alarm gestartet habe. Das Ergebnis ist lediglich, dass die Drehung des Gegners ruckelt. Was ich hier bräuchte wäre eine Beschleunigung und Verlangsamung, wenn sich der Gegner zum Spieler dreht.
  • wenn dein gegner nicht in deine richtung schaut soll er sich um 1grad pro step in deine richtung drehen. wenn du den wert auf zb 5 stellst dreht er sich um 5 grasd pro step...wäre sozusagen schneller. du hast ja nur gescriptet dass der gegner in deine richtung schaut, egal wo du grade bist. wenn du das auf die andere weise machst "dreht" er sich n deine richtung.


    mfg
  • Das Prinzip habe ich, hoffe ich, halbwegs verstanden.

    Damit sich überhaupt etwas bewegt, habe ich es mal so umgesetzt:

    GML-Quellcode

    1. if health > 1{
    2. if image_angle != point_direction(obj_ship06_rot_links.x,obj_ship06_rot_links.y,obj_sorades.x,obj_sorades.y) {
    3. image_angle = point_direction(obj_ship06_rot_links.x,obj_ship06_rot_links.y,obj_sorades.x-obj_ship06_rot_links.x+1,obj_sorades.y+obj_ship06_rot_links.y+1)
    4. }
    5. }


    Es reagiert tatsächlich langsamer, allerdings ab einem gewissen Punkt der Spielers auch genau falsch herum. :wacko:
  • ich hab das gleiche prinzip bei meinem game immo angewendet, ich poste ma mein script. hab das aus verschiedenen foreneinträgen und mit etwas (oder auch mehr xD) hilfe zusammengeschustert

    im create event

    GML-Quellcode

    1. direction=0
    2. directionangle=0


    im step event

    GML-Quellcode

    1. //das is für die mausposition
    2. var ex, ey;
    3. ex = mouse_x
    4. ey = mouse_y;
    5. {
    6. directionangle = round(point_direction(x, y, ex, ey));
    7. }
    8. ;
    9. if directionangle>359 {directionangle=0}
    10. if directionangle<0 {directionangle=359}
    11. dir = directionangle-direction
    12. if(dir>180){dir=-(360-dir)} //wenn winkel >180 soll der andere winkel berechnet werden
    13. if(dir<-180){dir=360+dir} //mit <-180
    14. if(dir<-1){direction-=1} //nach rechts drehen (1 ersetzten durch geschwindigkeit)
    15. if(dir>1){direction+=1} //nach links drehen (siehe oben)
    16. }
    17. else {direction = directionangle}
    18. }
    Alles anzeigen


    hoffe das hilft bei deinem problem

    mfg
  • Ich bin mir langsam nicht mehr sicher, ob du verstehst was ich will. Ich will lediglich mit image_angle die Grafik langsamer drehen. Nicht ruckelnd und nicht zu schnell. Wenn ich deinen Code richtig verstehe, passt du zwar den Winkel an (oder?) aber optisch tut sich da nichts. ?(
  • Bin ich ja, aber da tut sich nichts, außerdem ist bei dir mindestens eine Klammer falsch und bei dem, für meine Augen, Durcheinander, hatte ich dann keine Ahnung welche. (will ja nicht motzen, aber bei mir sieht das strukturierter aus :P )
  • motz du mal...xD

    bin grafiker kein programmierer...wir brauchen das chaos xD vllt solltest du das script für dich etwas ordnen, dann sollte es funzen...bei mir klappt das ganze ganz gut. daher nehme ich an dass da kein fehler drinne is...dass das unsauber is ...davon muss ich bei mir einfach schon von vornherein ausgehen xD

    mfg

    edit...ja ich und mein chaos...

    GML-Quellcode

    1. {
    2. if direction != directionangle
    3. {
    4. if(dir>180){dir=-(360-dir)} //wenn winkel >180 soll der andere winkel berechnet werden
    5. if(dir<-180){dir=360+dir} //mit <-180
    6. if(dir<-1){direction-=5} //nach rechts drehen (1 ersetzten durch geschwindigkeit)
    7. if(dir>1){direction+=5} //nach links drehen (siehe oben)
    8. }
    9. else {direction = directionangle}
    10. }
    Alles anzeigen


    denke dort war die klammer falsch =P
  • wenn ich es richtig verstanden habe, willst du, dass sich der gegner zur richtung des spielers dreht
    und sich nicht augenblicklich darauf richtet oder?

    GML-Quellcode

    1. var dif,sp,prec,px,py;
    2. sp=2; // Drehgeschwindigkeit
    3. prec=4; // Präzision (je höher, desto ungenauer. Zu niedrig -> Er ruckelt mehr herum)
    4. px=mouse_x; // X-Position die "anvisiert" wird
    5. py=mouse_y; // selbe, nur mit Y-Position
    6. dif=point_direction(x,y,px,py)-direction; // Hier wird die Differenz zwischen den Richtungen berechnet
    7. if (abs(dif)>180) { dif=-dif; } // Wenn sie größer als 180 ist, wird die andere Richtung berechnet
    8. if (abs(dif)>prec) { direction+=sign(dif)*sp; } // Wenn die differenz groß genug ist, dreht er sich in die berechnete richtung
    9. image_angle=direction;
    Alles anzeigen


    Eigentlich eine Kurzfassung von blubberkopp's version xD
  • Was heisst denn dass es nicht funktioniert? Bewegt sich einfach nichts?

    Dann hast du irgendwo noch was anderes das den image_angle oder die direction verändert..
    Bewegst du deine Objekte denn über vspeed und hspeed?

    EDIT: du hast wahrscheinlich das ganze in deinem scrollshooter, nehme ich an. Dort bewegst du alles ja mittels vspeed damit die Gegner im View bleiben. Genau dort liegt hier das Problem.. da der GM immer die direction aus v-und hspeed berechnet.

    Versuch mal diese abgewandelte Form von dem Code der complett unabhängig von GM's "direction" ist:

    GML-Quellcode

    1. var dif,sp,prec,px,py;
    2. sp=2; // Drehgeschwindigkeit
    3. prec=4; // Präzision (je höher, desto ungenauer. Zu niedrig -> Er ruckelt mehr herum)
    4. px=mouse_x; // X-Position die "anvisiert" wird
    5. py=mouse_y; // selbe, nur mit Y-Position
    6. dif=point_direction(x,y,px,py)-image_angle; // Hier wird die Differenz zwischen den Richtungen berechnet
    7. if (abs(dif)>180) { dif=-dif; } // Wenn sie größer als 180 ist, wird die andere Richtung berechnet
    8. if (abs(dif)>prec) { image_angle+=sign(dif)*sp; } // Wenn die differenz groß genug ist, dreht er sich in die berechnete richtung

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Benutzer online 1

    1 Besucher