Winkel relativ zu einem anderen Winkel clampen

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

  • Winkel relativ zu einem anderen Winkel clampen

    Hallo,
    ich hab ein Problem und steh aufm Schlauch, vielleicht hatte ich einfach zu wenig Schlaf oder so, is auch egal, jedenfalls brauch ich eure Hilfe.

    Ich habe ein Objekt das mit image_angle rotiert wird, jenachdem in welche Richtung es sich bewegt.
    Da drauf zeichne ich z.b. eine Kanone. Und diese Kanone soll ich immer in Richtung x,y,mouse_x,mouse_y drehen.
    Soweit so einfach.
    Aaaber jetzt will ich den Winkel der Kanone clampen, also begrenzen.
    Undzwar soll sich die Kanone immer nur im Bereich von image_angle-40 bis image_angle+40 drehen können. Ist der Winkel von x,y zu mouse_x,mouse_y z.b. 90 und image_angle ist 180 dann würd die Kanone mit dem Winkel 180-40 also 140 gezeichnet werden.
    Soweit so gut.
    Ich schreib also einfach

    GML-Quellcode

    1. vTurretAngle = clamp(point_direction(x,y,mouse_x,mouse_y),image_angle-40,image_angle+40)


    Aber haha, natürlich funktioniert das nur teilweise. Denn sobal ich mich in dem Bereich befinde wo einer der beiden Winkel unter 40 oder über 320 fällt geht alles kaputt und buggt rum.
    Denn z.b. ist image_angle = 0 und point_direction = 340. Dann würd ja so geclampt werden: clamp(340,-40,40), und plötzlich wär mein Winkel 40 obwohl er eigentlich -20 sein sollte.....toller Mist.

    Also wie umgehe ich das? Was muss ich machen dass der Code in alle Richtungen funktioniert? Hat damit wer Erfahrung? Danke schonmal
    Sorm ist Schuld

    Edit: Doch ist er
  • Könntest du mit angle_difference() mal probieren:

    GML-Quellcode

    1. var range = 40; // range für rechts und links jeweils
    2. var dirToTarget = point_direction(x,y,mouse_x,mouse_y);
    3. var diff = angle_difference(image_angle, dirToTarget);
    4. diff = clamp(diff, -range, range);
    5. vTurretAngle = image_angle + diff;
    :saint:
  • GML-Quellcode

    1. var range = 80; // 40 nach rechts + 40 nach links
    2. var dirToTarget = point_direction(x,y,mouse_x,mouse_y);
    3. var diff = angle_difference(image_angle, dirToTarget);
    4. diff = clamp(diff, range * -0.5, range * 0.5);
    5. vTurretAngle = image_angle + diff;


    Wenn ich angle_difference(dirToTarget, image_angle) statt angle_difference(image_angle, dirToTarget) nehme dann funktionierts :D
    Klasse, danke
    Sorm ist Schuld

    Edit: Doch ist er
  • Ich würde das auf die schnelle so lösen:

    GML-Quellcode

    1. vTurretAngle = point_direction(x,y,mouse_x,mouse_y);//normale direction
    2. var angleDiff = angle_difference(vTurretAngle,image_angle);//differenz zwischen den beiden Winkel
    3. if(abs(angleDiff) > 40){//wenn die differenz groößer als 40 ist
    4. vTurretAngle = vTurretAngle+40*sign(angleDiff);//clamp (40 multipliziert mit dem Vorzeichen von der Differenz)
    5. }


    Nicht getestet, sollte aber funktionieren.

    /Edit: zu spät gepostet. XD