Frame Animation Problem

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

  • Frame Animation Problem


    Hey Leute,

    gestern habe ich schon 2h über den Code gebrütet um den Fehler zu finden, aber irgendwie erschliesst sich mir das Problem nicht!

    Ich habe eine Gun programmiert, die dem Spieler folgt und in gewissen Abständen auch auf ihn schiesst.
    Ich benutze dafür einen Switch mit 9 Fällen. Der erste Fall (180) und der letzte (0) funktionieren einwandfrei, dies bedeutet die Animation (alle 8 Frames) werden korrekt abgespielt.
    Um das zu erkennen lasse ich die Animation sehr langsam abspielen und zähle die Frames mit, die Gun soll sozusagen 4x schiessen und muss somit auch 4x aufleuchten.

    Nun ist es so, das in Case 2(202.5°) und 3(225°) die Animation nur noch 3x abspielt, in Case 4 und 5 nur noch 2x abspielt, in Case 6 und 7 nur noch 1x abspielt, in Fall 8 garnicht mehr abspielt und wie erwähnt im letzten 9. Fall wird wieder alles korrekt abgespielt.
    Und während ich das hier schreibe, was einem ja oft schon hilft einen Fehler zu entdecken, erkenne ich auch ein Muster 4,3,2,1,0,4. Aber anfangen kann ich mit dem Muster im Hinblick auf die Fehlersuche nicht wirklich was.

    Die Sprites die ich dafür nutze habe ich schon ein paar mal kontrolliert, sind soweit identisch und ich habe unten mal 3 Beispiele angehängt.

    Jemand eine Idee wo da der Denkfehler ist?


    Hier der Code dazu:

    Spoiler anzeigen

    Quellcode

    1. ///allin
    2. //Activity
    3. if (obj_player.y > y-20 && obj_player.y < y+250)
    4. {
    5. if (obj_player.x > x-400 && obj_player.x < x +400)
    6. {
    7. gun_active = true;
    8. }
    9. }
    10. else
    11. {
    12. gun_active = false;
    13. sprite_index = spr_gun180_top;
    14. }
    15. //Targeting
    16. if gun_active = true
    17. {
    18. var target_angle = point_direction(x,y,obj_player.x,obj_player.y)
    19. target_angle = round(target_angle/22.5)*22.5;
    20. //image_index = round((target_angle-180)/22.5)
    21. switch(target_angle)
    22. {
    23. case 180:
    24. if gun_shooting = true
    25. {
    26. sprite_index = spr_gun180_top_shooting_0;
    27. image_speed = 0.05;
    28. if image_index >= 7
    29. {
    30. gun_shooting = false;
    31. }
    32. }
    33. else
    34. {
    35. sprite_index = spr_gun180_top;
    36. image_index = 0;
    37. image_speed = 0;
    38. if gun_delay = false
    39. {
    40. gun_delay = true;
    41. alarm[0] = 60;
    42. }
    43. }
    44. break;
    45. case 202.5:
    46. if gun_shooting = true
    47. {
    48. sprite_index = spr_gun180_top_shooting_1;
    49. image_speed = 0.05;
    50. if image_index >= 7
    51. {
    52. gun_shooting = false;
    53. }
    54. }
    55. else
    56. {
    57. sprite_index = spr_gun180_top;
    58. image_index = 1;
    59. image_speed = 0;
    60. if gun_delay = false
    61. {
    62. gun_delay = true;
    63. alarm[0] = 60;
    64. }
    65. }
    66. break;
    67. case 225:
    68. if gun_shooting = true
    69. {
    70. sprite_index = spr_gun180_top_shooting_2;
    71. image_speed = 0.05;
    72. if image_index >= 7
    73. {
    74. gun_shooting = false;
    75. }
    76. }
    77. else
    78. {
    79. sprite_index = spr_gun180_top;
    80. image_index = 2;
    81. image_speed = 0;
    82. if gun_delay = false
    83. {
    84. gun_delay = true;
    85. alarm[0] = 60;
    86. }
    87. }
    88. break;
    89. case 247.5:
    90. if gun_shooting = true
    91. {
    92. sprite_index = spr_gun180_top_shooting_3;
    93. image_speed = 0.05;
    94. if image_index >= 7
    95. {
    96. gun_shooting = false;
    97. }
    98. }
    99. else
    100. {
    101. sprite_index = spr_gun180_top;
    102. image_index = 3;
    103. image_speed = 0;
    104. if gun_delay = false
    105. {
    106. gun_delay = true;
    107. alarm[0] = 60;
    108. }
    109. }
    110. break;
    111. case 270:
    112. if gun_shooting = true
    113. {
    114. sprite_index = spr_gun180_top_shooting_4;
    115. image_speed = 0.05;
    116. if image_index >= 7
    117. {
    118. gun_shooting = false;
    119. }
    120. }
    121. else
    122. {
    123. sprite_index = spr_gun180_top;
    124. image_index = 4;
    125. image_speed = 0;
    126. if gun_delay = false
    127. {
    128. gun_delay = true;
    129. alarm[0] = 60;
    130. }
    131. }
    132. break;
    133. case 292.5:
    134. if gun_shooting = true
    135. {
    136. sprite_index = spr_gun180_top_shooting_5;
    137. image_speed = 0.05;
    138. if image_index >= 7
    139. {
    140. gun_shooting = false;
    141. }
    142. }
    143. else
    144. {
    145. sprite_index = spr_gun180_top;
    146. image_index = 5;
    147. image_speed = 0;
    148. if gun_delay = false
    149. {
    150. gun_delay = true;
    151. alarm[0] = 60;
    152. }
    153. }
    154. break;
    155. case 315:
    156. if gun_shooting = true
    157. {
    158. sprite_index = spr_gun180_top_shooting_6;
    159. image_speed = 0.05;
    160. if image_index >= 7
    161. {
    162. gun_shooting = false;
    163. }
    164. }
    165. else
    166. {
    167. sprite_index = spr_gun180_top;
    168. image_index = 6;
    169. image_speed = 0;
    170. if gun_delay = false
    171. {
    172. gun_delay = true;
    173. alarm[0] = 60;
    174. }
    175. }
    176. break;
    177. case 337.5:
    178. if gun_shooting = true
    179. {
    180. sprite_index = spr_gun180_top_shooting_7;
    181. image_speed = 0.05;
    182. if image_index >= 7
    183. {
    184. gun_shooting = false;
    185. }
    186. }
    187. else
    188. {
    189. sprite_index = spr_gun180_top;
    190. image_index = 7;
    191. image_speed = 0;
    192. if gun_delay = false
    193. {
    194. gun_delay = true;
    195. alarm[0] = 60;
    196. }
    197. }
    198. break;
    199. case 0:
    200. if gun_shooting = true
    201. {
    202. sprite_index = spr_gun180_top_shooting_8;
    203. image_speed = 0.05;
    204. if image_index >= 7
    205. {
    206. gun_shooting = false;
    207. }
    208. }
    209. else
    210. {
    211. sprite_index = spr_gun180_top;
    212. image_index = 8;
    213. image_speed = 0;
    214. if gun_delay = false
    215. {
    216. gun_delay = true;
    217. alarm[0] = 60;
    218. }
    219. }
    220. break;
    221. }
    222. }
    Alles anzeigen



    lg Zhe
    Bilder
    • 1.png

      229,2 kB, 1.772×1.058, 401 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von zhe73 ()

  • HEUREKA !!!

    Ich sage doch, man muss einfach mal drüber schreiben und man kommt vielleicht selbst drauf. Dadurch das ich das Image_Index stetig erhöhe wenn die Gun die Animation wechselt, also mit zunehmender Casehöhe :) , sind halt nicht mehr viel Frames übrig bis hin zum Image_Index 7.

    Hmmm, na dann mal schauen wie ich es anders lösen kann als image_index 7 abzufragen.

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

  • Ok ich habe das Problem gelöst, allerdings auf die wohl schlechteste denkbare Weise. Und zwar habe ich jetzt bei den Sprites einfach immer mehr Frames angehangen und die Abfrage nach dem image_index einfach weiter von 7 erhöht.
    Das vergrößert die T-Page natürlich unnötig. Aber generell habe ich das ja schon am Anfang falsch gemacht, da ich die selben 2 Frames in den Sprites hintereinander gereiht habe um die Animation mit dem 4x schiessen zu bekommen.

    Welche Lösung würdet ihr denn Vorschlagen wenn man eine Animation einfach 3-4 mal wiederholen möchte, ohne einfach unnötig die Frames im Sprite zu erhöhen.
    Mit einem Alarm arbeiten????

    €: Jup, habs mit einem Alarm-Event gelöst und damit auch unnötig viele Frames in den Sprites gespart...
    Wo ist denn der THEMA-ERLEDIGT Buttom?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von zhe73 ()

  • Bevor es erledigt wird kann ich dir noch 2 cents of advice mitgeben. Du hast sehr viele Teile von Bildern in deinen Animationen die eigtl gleich zu anderen sind. Daher solltest du nur 3 sprites brauchen. Den Kopf vom Geschütz und davon nur links, links unten und runter, den Rest kannst du im Code mit image_xscale = -1 spiegeln. (Zumindest habe ich nicht gesehen, wo sich links und rechts am Kopf unterscheiden würden.) Und beim Lauf dasselbe, aber einmal mit Mündungsfeuer und einmal ohne. Da brauchst du auch nicht mehrere gleiche Bilder sich wiederholen lassen, sondern nur im code, mal das eine mal das andere Bild anzeigen lassen.
    Somit hast du dann 3 sprites zu je 5 subimages, insgesamt 15. Und das gun object baut sich die gun aus den richtigen sprites zusammen. Kopf, Lauf und ggf das Mündungsfeuer. Das spart am meisten Platz auf der Texture page.

    Thema erledigt muss ich auch immer suchen^^ der ist glaub ich oben rechts oder oben links.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Ja an image_xscale = -1 habe ich nicht gedacht, dass sollte ich noch nachholen, danke dir. Die Frames widerum habe ich schon auf 2 pro Sprite geändert, da ich es jetzt mit einem Alarm programmiert habe, wie lange eine Gun schiesst, vorher hatte ich es mit image_index abgefragt und da hätte ich 8 frames gebraucht.