Spine Bone Angle setzen

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

  • Spine Bone Angle setzen

    Hi

    Vesuche mich gerade mit der Intergrierung von Spine Animationen in GMS. Ich nutze GMS v1.4.1763 und Spine v2.1.27.
    Nun möchte ich den Winkel eines Knochens im Spiel in eine bestimmte richtung blicken lassen, dazu habe ich auch ein entsprechenden Code in der Anleitung gefunden.

    Quellcode

    1. var map = ds_map_create();
    2. skeleton_bone_state_get("Zielen", map);
    3. var xx = ds_map_find_value(map, "worldX");
    4. var yy = ds_map_find_value(map, "worldY");
    5. var deltax = obj_crosshair_p1_circle.x - (x + xx);
    6. var deltay = obj_crosshair_p1_circle.y - (y + yy);
    7. var angle = -radtodeg(arctan2(deltay, deltax));
    8. ds_map_replace(map, "angle", angle);
    9. skeleton_bone_state_set("Zielen", map);
    10. ds_map_destroy(map);


    Funktiniert soweit auch ganz gut bis auf einen Bug wenn mein Char auf nach einem Sprung landet zuckt er kurz immer in die Ausgangsposition. Ist jetzt aber noch nicht mein Hauptproblem, sondern eher das ich es so haben möchte das er sich beim zielen auch etwas bückt. Nun wenn ich den Bone vom Rücken auch noch so einen schicken code einfüge funktioniert das mit der Position nicht mehr und zwar zielt der Arm(Zielen) dann nicht mehr in der richtigen Richtung sonder es wird die Bewegung des Rückens mit einbezogen. Kann mir jemand einen Tipp geben wie ich es hinbekomme das die Armposition immer richtung Fadenkreuz schaut, egal ob sich noch andere Knochen bewegen? thx

    Edit:
    Hätte da ergänzend noch eine Zweitfrage. Wie spiegle ich bei verwendung von Spine in GMS das Sprite. Wenn ich da image_xscale verwende verzieht es alles fürchterlich. Jetzt sieht mein Männlein so aus wie so eine Kreatur aus Deadspace...
    Ist gelöst, lag daran das ich das object im room editor skalliert habe. Habe nur noch das Problem das beim nach links schauen der Bone-Angle falschrum ist...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Jomnitech ()

  • Also in der Beschreibung steht auch das der "angle" bezogen auf den parrent bone ist. Erklärt soweit warum er sich so doof verhält. Finde aber keinen verfüntigen Weg dies zu unterbinden. Habe schon diverse Variatonen ausprobiert den Winkel vom Rücken dem Arm zu subrahieren aber habe entweder einen Error oder er macht einfach alles wie bisher...
    Hat den jemand von euch schon mit Spine gearbeitet oder verwendet Ihr nur Sprites?
    Edit:
    Bin auch etwas verwirrt wenn ich in GMS ein Bone auf 0° setze er um -90° versetzt ist, obwohl die 0° Position in GMS und Spine ja rechts ist.. schnall das nicht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Jomnitech ()

  • Also hab jetzt lediglich nur mehr das Problem mit den 90°. Wenn ich doch den Bone auf 0° setze warum zeigt er nach oben statt nach rechts, das müsste sich doch gleich wie in Spine verhalten? Ich kann das zwar korrigieren, macht aber Probleme beim überschreiten der 0°.
  • Mit der map Formel in meiner Signatur, kannst du den Wert 0-359 auf -90 bis 269 mappen. Das sollte die einfachste Möglichkeit sein, die grade zu berichtigen.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Es hat mich jetzt ziemlich verwirrt aber ich denke ich habs jetzt geschnallt. Der Winkel ist immer auf den auf den Parent-Bone bezogen. Jetzt schnall ich das mit den 90° auch.

    Hab nur noch eine Frage, denke zwar nicht das es geht aber kann man den Bone-Angle relativ zum Raum setzen?

    @Aku_Ryou
    Danke für die Formel. Probier ich heute Abend gleich mal aus.
  • Ich kenn mich mit Spine nicht aus, aber in 3D Umgebungen, ist der Root immer relativ zum Raum und die anderen Bones relativ zum root. Wenn der Root rotiert, bewegt das alle bones um root herum und die animationen werden ja nur aus einem file geladen und bestimmen, dass sich zB die Beine bewegen, auch wenn der Charakter am root gepackt und Kopfüber gedreht wird.
    So als ob du eine dir variable schreibst die in eine Richtung+direction schaut. Und wenn sich direction ändern bewegt sich dir mit, hat aber immer den selben Wert.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • In Spine ist es genauso dass man einen Root bone hat. Macht ja animationstechnisch auch Sinn, sonst würde das ja katastrophal aussehen wenn sich das Objekt dreht.
    Meine Frage ist ob es eine Möglichkeit gibt einen Bone z.B. auf 0° (rechts) zu fixieren, unabhängig davon wie sich die parent bones oder der root bone verhält.
  • Hi @Aku_Ryou
    Hab dein Code leider nicht ganz verstanden. Weiss nicht ganz was die "map" macht.
    Hab das jetzt mal so gelöst:
    Spoiler anzeigen

    GML-Quellcode

    1. ///Zielen Bones
    2. // Bones AIM
    3. var roomangle_p1 = point_direction(x, y-120, mouse_x, mouse_y);
    4. // Nach rechts schauen /look right
    5. if x <= mouse_x
    6. {
    7. image_xscale = .25
    8. if roomangle_p1 <= 90
    9. {
    10. var map = ds_map_create();
    11. skeleton_bone_state_get("Ruecken_O", map);
    12. var angle1 = roomangle_p1-((0+roomangle_p1)*.85) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    13. ds_map_replace(map, "angle", angle1);
    14. skeleton_bone_state_set("Ruecken_O", map);
    15. ds_map_destroy(map);
    16. var map = ds_map_create();
    17. skeleton_bone_state_get("Ruecken_M", map);
    18. var angle2 = roomangle_p1-((0+roomangle_p1)*.85) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    19. ds_map_replace(map, "angle", angle2);
    20. skeleton_bone_state_set("Ruecken_M", map);
    21. ds_map_destroy(map);
    22. var map = ds_map_create();
    23. skeleton_bone_state_get("Ruecken_U", map);
    24. var angle3 = roomangle_p1-((0+roomangle_p1)*.85) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    25. ds_map_replace(map, "angle", angle3-90);
    26. skeleton_bone_state_set("Ruecken_U", map);
    27. ds_map_destroy(map);
    28. var map = ds_map_create();
    29. skeleton_bone_state_get("Kopf", map);
    30. var angleK = roomangle_p1-((0+roomangle_p1)*.65) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    31. ds_map_replace(map, "angle", angleK);
    32. skeleton_bone_state_set("Kopf", map);
    33. ds_map_destroy(map);
    34. }
    35. else
    36. {
    37. var map = ds_map_create();
    38. skeleton_bone_state_get("Ruecken_O", map);
    39. var angle1 = roomangle_p1+((359.99-roomangle_p1)*.65) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    40. ds_map_replace(map, "angle", angle1);
    41. skeleton_bone_state_set("Ruecken_O", map);
    42. ds_map_destroy(map);
    43. var map = ds_map_create();
    44. skeleton_bone_state_get("Ruecken_M", map);
    45. var angle2 = roomangle_p1+((359.99-roomangle_p1)*.65) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    46. ds_map_replace(map, "angle", angle2);
    47. skeleton_bone_state_set("Ruecken_M", map);
    48. ds_map_destroy(map);
    49. var map = ds_map_create();
    50. skeleton_bone_state_get("Ruecken_U", map);
    51. var angle3 = roomangle_p1+((359.99-roomangle_p1)*.65) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    52. ds_map_replace(map, "angle", angle3-90);
    53. skeleton_bone_state_set("Ruecken_U", map);
    54. ds_map_destroy(map);
    55. var map = ds_map_create();
    56. skeleton_bone_state_get("Kopf", map);
    57. var angleK = roomangle_p1+((359.99-roomangle_p1)*.65) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    58. ds_map_replace(map, "angle", angleK);
    59. skeleton_bone_state_set("Kopf", map);
    60. ds_map_destroy(map);
    61. }
    62. var map = ds_map_create();
    63. skeleton_bone_state_get("Zielen", map);
    64. var angle = roomangle_p1
    65. ds_map_replace(map, "angle", angle-angle1-angle2-angle3-90);
    66. skeleton_bone_state_set("Zielen", map);
    67. ds_map_destroy(map);
    68. }
    69. // Nach links schauen / look left
    70. else
    71. {
    72. image_xscale = -.25
    73. if roomangle_p1 <= 180
    74. {
    75. var map = ds_map_create();
    76. skeleton_bone_state_get("Ruecken_O", map);
    77. var angle1 = (roomangle_p1*-1+180)*.15; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    78. ds_map_replace(map, "angle", angle1);
    79. skeleton_bone_state_set("Ruecken_O", map);
    80. ds_map_destroy(map);
    81. var map = ds_map_create();
    82. skeleton_bone_state_get("Ruecken_M", map);
    83. var angle2 = (roomangle_p1*-1+180)*.15; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    84. ds_map_replace(map, "angle", angle2);
    85. skeleton_bone_state_set("Ruecken_M", map);
    86. ds_map_destroy(map);
    87. var map = ds_map_create();
    88. skeleton_bone_state_get("Ruecken_U", map);
    89. var angle3 = (roomangle_p1*-1+180)*.15; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    90. ds_map_replace(map, "angle", angle3-90);
    91. skeleton_bone_state_set("Ruecken_U", map);
    92. ds_map_destroy(map);
    93. var map = ds_map_create();
    94. skeleton_bone_state_get("Kopf", map);
    95. var angleK = (roomangle_p1*-1+180)*.35; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    96. ds_map_replace(map, "angle", angleK);
    97. skeleton_bone_state_set("Kopf", map);
    98. ds_map_destroy(map);
    99. }
    100. else
    101. {
    102. var map = ds_map_create();
    103. skeleton_bone_state_get("Ruecken_O", map);
    104. var angle1 = (roomangle_p1*-1+180)*.35; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    105. ds_map_replace(map, "angle", angle1);
    106. skeleton_bone_state_set("Ruecken_O", map);
    107. ds_map_destroy(map);
    108. var map = ds_map_create();
    109. skeleton_bone_state_get("Ruecken_M", map);
    110. var angle2 = (roomangle_p1*-1+180)*.35; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    111. ds_map_replace(map, "angle", angle2);
    112. skeleton_bone_state_set("Ruecken_M", map);
    113. ds_map_destroy(map);
    114. var map = ds_map_create();
    115. skeleton_bone_state_get("Ruecken_U", map);
    116. var angle3 = (roomangle_p1*-1+180)*.35; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    117. ds_map_replace(map, "angle", angle3-90);
    118. skeleton_bone_state_set("Ruecken_U", map);
    119. ds_map_destroy(map);
    120. draw_text(100,450,angle3)
    121. var map = ds_map_create();
    122. skeleton_bone_state_get("Kopf", map);
    123. var angleK = (roomangle_p1*-1+180)*.35; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    124. ds_map_replace(map, "angle", angleK);
    125. skeleton_bone_state_set("Kopf", map);
    126. ds_map_destroy(map);
    127. }
    128. var map = ds_map_create();
    129. skeleton_bone_state_get("Zielen", map);
    130. var angle = roomangle_p1*-1
    131. ds_map_replace(map, "angle", angle+90-angle1-angle2-angle3);
    132. skeleton_bone_state_set("Zielen", map);
    133. ds_map_destroy(map);
    134. }
    Alles anzeigen



    Falls es dich interessiert. Aber bitte nicht zu viel tadeln, ich lerne doch noch ;)

    Mal eine erweiterte Frage. Kann man aus der Bone Map data die aktuellen x,y koordinaten auslesen? Geht konkret darum das die Bullets immer bei der Mündung spawnen sollen. Wäre natürlich praktisch wenn ich da einfach nen Bone setzen könnte um die Koordinaten zu erhalten.
  • Ich kenne mich eigentlich mit diesem Thema nicht aus, aber du könntest dir alle Daten aus der map anzeigen lassen. Wahrscheinlich sind die Koordinaten aber einfach mit den Namen "x" und "y" abgespeichert.
    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
  • Irgendwie so müsste das doch gehen?

    GML-Quellcode

    1. var map = ds_map_create();
    2. skeleton_bone_state_get("Muendung", map);
    3. var xbullet = ds_map_find_value(map, "worldX");
    4. var ybullet = ds_map_find_value(map, "worldY");
    5. instance_create(xbullet,ybullet,obj_bullet_p1)
    6. ds_map_destroy(map);

    bekomm so aber immer einen Error.
  • Habs hinbekommen. Der Error kam daher das ich noch testweise den code in nem andern event hatte.
    Hab auch nicht ganz kapiert warum wenn ich den code im Step-Event habe nichts passiert. Seits im Alarm ist geht es.
    Wie dem auch sei, falls jemand mal das gleiche machen möchte

    Alarm:

    GML-Quellcode

    1. var map = ds_map_create();
    2. skeleton_bone_state_get("Muendung", map);
    3. var xbullet = ds_map_find_value(map, "worldX");
    4. var ybullet = ds_map_find_value(map, "worldY");
    5. instance_create(xbullet+obj_player1.x,ybullet+obj_player1.y,obj_bullet_p1)
    6. ds_map_destroy(map);