Blaulichter verschieben sich bei Fahrzeugdrehung

  • GM 8

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

  • Blaulichter verschieben sich bei Fahrzeugdrehung

    Hallo zusammen

    Bei meinem Fahrzeug verschieben sich die Blaulichter, wenn ich mein Fahrzeug drehe. Wieso ist das so?

    Dies ist das Blaulicht-Script
    Spoiler anzeigen

    GML-Quellcode

    1. image_speed = 0.5;
    2. draw_sprite(spr_blaulicht,-1,obj_player_auto.x,obj_player_auto.y-10);
    3. draw_sprite(spr_blaulicht,-1,obj_player_auto.x,obj_player_auto.y+10);


    Ich bitte um Hilfe.

    Hier das Video dazu: youtu.be/5cLHELpmp6M

    //EDIT
    Ich glaub', ich muss mit lenghtdir arbeiten. Doch das raff ich nicht. Noch nie gebraucht. Oo

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Michaelp800 ()

  • Da kann ich dir glaub ich helfen.

    Du musst mit lengthdir arbeiten

    GML-Quellcode

    1. x1 = x + lengthdir_x(10,obj_player_auto.direction + 50);
    2. x2 = x + lengthdir_x(10,obj_player_auto.direction - 50);
    3. y1 = y + lengthdir_y(10,obj_player_auto.direction + 50);
    4. y2 = y + lengthdir_y(10,obj_player_auto.direction - 50);
    5. draw_sprite(spr_blaulicht,-1,x1,y1);
    6. draw_sprite(spr_blaulicht,-1,x2,y2);


    Die Werte mit +50 und -50 Kannst du nach belieben änden... die 10 ist der Radius den Musst du auch auf dein Vehikel anpassen.

    Ich hoffe ich konnte helfen Phil
  • Vermutlich weil die blaulichter nicht relativ zum Fahrzeug, vorallem zur Drehung des Fahrzeugs, sondern absolut dazu gedrawt werden?

    Versuchs mal so:

    GML-Quellcode

    1. image_speed = 0.5;
    2. draw_sprite(spr_blaulicht,-1,obj_player_auto.x-lengthdir_x(10,image_angle),obj_player_auto.y-lengthdir_y(10,image_angle));
    3. draw_sprite(spr_blaulicht,-1,obj_player_auto.x+lengthdir_x(10,image_angle),obj_player_auto.y+lengthdir_y(10,image_angle));


    Oder so ähnlich


    edit: zu spät
    Sorm ist Schuld

    Edit: Doch ist er
  • Man kann es sicherlich mit lengthdir machen, aber die beste Kontrolle hat man durch Transformationen:

    GML-Quellcode

    1. //Zeichne den Wagen
    2. image_angle = direction;
    3. draw_self();
    4. //Licht 1
    5. //Die Lichterrotation
    6. d3d_transform_add_rotation_z(90);
    7. //Die Position relativ zum Wagen
    8. d3d_transform_add_translation(12, 8, 0);
    9. //Die Rotation des Wagens
    10. d3d_transform_add_rotation_z(direction);
    11. //Die Position relativ zur Spielwelt
    12. d3d_transform_add_translation(x, y, 0);
    13. //Zeichne das Sprite an der Ursprungsposition 0, 0.
    14. draw_sprite(spr_blaulicht, (current_time/1000)*30, 0, 0);
    15. //Beende die Transformation
    16. d3d_transform_set_identity();
    17. //Licht 2
    18. //Die Lichterrotation
    19. d3d_transform_add_rotation_z(-90);
    20. //Die Position relativ zum Wagen
    21. d3d_transform_add_translation(12, -8, 0);
    22. //Die Rotation des Wagens
    23. d3d_transform_add_rotation_z(direction);
    24. //Die Position relativ zur Spielwelt
    25. d3d_transform_add_translation(x, y, 0);
    26. //Zeichne das Sprite an der Position 0, 0.
    27. draw_sprite(spr_blaulicht, (current_time/1000)*30+4, 0, 0);
    28. //Beende die Transformation
    29. d3d_transform_set_identity();
    Alles anzeigen

    So kann man bequem die Lichter auf dem Wagen ausrichten ohne sich mit den Winkeln rumquälen zu lassen. Ich habe noch ein Beispiel hochgeladen, weil ich so nett bin.
    Dateien
    • Beispiel.zip

      (1,01 MB, 242 mal heruntergeladen, zuletzt: )
  • Ja ich habe einen kleine Fehler in meinem Skript

    GML-Quellcode

    1. x1 = obj_player_auto.x + lengthdir_x(10,obj_player_auto.direction + 50);
    2. x2 = obj_player_auto.x + lengthdir_x(10,obj_player_auto.direction - 50);
    3. y1 = obj_player_auto.y + lengthdir_y(10,obj_player_auto.direction + 50);
    4. y2 = obj_player_auto.y + lengthdir_y(10,obj_player_auto.direction - 50);
    5. draw_sprite(spr_blaulicht,-1,x1,y1);
    6. draw_sprite(spr_blaulicht,-1,x2,y2);


    Hab vergessen das X die ganze Zeit an das des Autos anzupassen ;)

    Jetzt dürfte es Funktionieren.

    Mit freundlichen grüßen Phil
  • lengthdir_x(len,dir) Gibt die horizontale x-Komponente von dem Vektor bestimmt durch die gegebene Länge und Richtung wieder.
    lengthdir_y(len,dir) Gibt die vertikale y-Komponente von dem Vektor bestimmt durch die gegebene Länge und Richtung wieder.

    In eigenen Worten:
    lengthdir_x gibt dir die x Koordinate vom Punkt zurück, wenn du das objekt um "len" in Richtung "dir" verschieben würdest.

    Alternativ kannst du auch mit sin() und cos() arbeiten, was diese Funktion intern wohl auch macht.
  • Ich habe dir eine wunderbare und einfache Methode geschrieben. Wo liegt das Problem? Hier eine angepasste und verkürzte Version. Schau aber bitte mein kommentiertes Skript nocheinmal genau an.

    GML-Quellcode

    1. image_speed = 0.5;
    2. d3d_transform_add_translation(12, 8, 0);
    3. d3d_transform_add_rotation_z(obj_player_auto.direction);
    4. d3d_transform_add_translation(obj_player_auto.x, obj_player_auto.y, 0);
    5. draw_sprite(spr_blaulicht, -1, 0, 0);
    6. d3d_transform_set_identity();
    7. d3d_transform_add_translation(12, -8, 0);
    8. d3d_transform_add_rotation_z(obj_player_auto.direction);
    9. d3d_transform_add_translation(obj_player_auto.x, obj_player_auto.y, 0);
    10. draw_sprite(spr_blaulicht, -1, 0, 0);
    11. d3d_transform_set_identity();
    Alles anzeigen