EnemyStates.gml 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. function enemy_move_and_collide()
  2. {
  3. x_spd_kb = lerp(x_spd_kb, 0, 0.2);
  4. if abs(x_spd_kb) < 1
  5. x_spd_kb = 0;
  6. y_spd_kb = lerp(y_spd_kb, 0, 0.2);
  7. if abs(y_spd_kb) < 1
  8. y_spd_kb = 0;
  9. var _y_spd_total = (y_spd + y_spd_kb) * global.time_scale;
  10. var _x_spd_total = (x_spd + x_spd_kb) * global.time_scale;
  11. if place_meeting(x, y + _y_spd_total, oParentSolid) && apply_collision
  12. {
  13. while !place_meeting(x, y + sign(_y_spd_total), oParentSolid)
  14. y += sign(_y_spd_total);
  15. _y_spd_total = 0;
  16. y_spd = 0;
  17. y_spd_kb = 0;
  18. }
  19. y += _y_spd_total;
  20. if place_meeting(x + _x_spd_total, y, oParentSolid) && apply_collision
  21. {
  22. while !place_meeting(x + sign(_x_spd_total), y, oParentSolid)
  23. x += sign(_x_spd_total);
  24. _x_spd_total = 0;
  25. x_spd = 0;
  26. x_spd_kb = 0;
  27. }
  28. x += _x_spd_total;
  29. }
  30. function enemy_check_hazard()
  31. {
  32. var _hazard = instance_place(x, y, oParentHazard);
  33. if _hazard == noone exit;
  34. hp -= _hazard.damage;
  35. if hp <= 0
  36. {
  37. is_dead = true;
  38. enemy_death();
  39. }
  40. }
  41. function enemy_check_hitstun()
  42. {
  43. if hitstun_timer > 0
  44. {
  45. hitstun_timer -= global.time_scale;
  46. x_spd = 0;
  47. y_spd = 0;
  48. if global.developer_mode
  49. image_blend = c_orange;
  50. }
  51. else
  52. {
  53. image_index += animation_spd;
  54. enemy_ai();
  55. image_blend = c_white;
  56. }
  57. }
  58. function enemy_death()
  59. {
  60. //death_pe(); 没有_info传参,不要去注释!!
  61. if !is_undefined(death_callback)
  62. death_callback();
  63. else
  64. {
  65. var _corpse = icd(oEnemyCorpse, x, y, 50);
  66. _corpse.sprite_index = corpse_sprite;
  67. if corpse_doll
  68. {
  69. _corpse.x_spd = x_spd_kb;
  70. _corpse.y_spd = -max(abs(y_spd_kb), abs(x_spd_kb));
  71. _corpse.apply_gravity = true;
  72. }
  73. instance_destroy();
  74. }
  75. }
  76. /// @desc 优雅地以该实例为原点,给定宽高、偏移与持续时间为参数,生成敌人middle/left碰撞箱(多用于横向攻击)
  77. /// @param {real} _x 碰撞箱宽度
  78. /// @param {real} _y 碰撞箱高度
  79. /// @param {real} _x_offset 碰撞箱与该实例在x轴上的偏移量,默认为0
  80. /// @param {real} _y_offset 碰撞箱与该实例在y轴上的偏移量,默认为0
  81. /// @param {real} _duration 碰撞箱持续时间,默认为0,即无限
  82. function enemy_create_hitboxML(_x, _y,
  83. _x_offset = 0, _y_offset = 0, _duration = 0)
  84. {
  85. var _hb = icd(oEnemyHitbox, x + _x_offset, y + _y_offset);
  86. _hb.owner = id;
  87. _hb.sprite_index = sEnemyHitboxML;
  88. _hb.x_offset = _x_offset;
  89. _hb.y_offset = _y_offset;
  90. var _base = 2;
  91. _hb.image_xscale = _x / _base * facing_x;
  92. _hb.image_yscale = _y / _base;
  93. /*
  94. oEnemyHitbox的基础大小为2*2
  95. 因为gml的1*1sprite无法将重心放在middle/center
  96. 此处定义后续用于缩放
  97. */
  98. if _duration != 0
  99. {
  100. _hb.hitbox_type = "BLADE";
  101. _hb.duration = _duration;
  102. }
  103. return _hb;
  104. }
  105. /// @desc 优雅地以该实例为原点,给定宽高为参数,生成敌人middle/center碰撞箱(多用于空中本体,射弹等)
  106. /// @param {real} _x 碰撞箱宽度
  107. /// @param {real} _y 碰撞箱高度
  108. function enemy_create_hitboxMC(_x, _y)
  109. {
  110. var _hb = icd(oEnemyHitbox, x, y);
  111. _hb.owner = id;
  112. _hb.sprite_index = sEnemyHitboxMC;
  113. var _base = 2;
  114. _hb.image_xscale = _x / _base;
  115. _hb.image_yscale = _y / _base;
  116. return _hb;
  117. }
  118. /// @desc 优雅地以该实例为原点,给定宽高、偏移与持续时间为参数,生成敌人bottom/center碰撞箱(多用于地面本体、纵向攻击等)
  119. /// @param {real} _x 碰撞箱宽度
  120. /// @param {real} _y 碰撞箱高度
  121. /// @param {real} _x_offset 碰撞箱与该实例在x轴上的偏移量,默认为0
  122. /// @param {real} _y_offset 碰撞箱与该实例在y轴上的偏移量,默认为0
  123. /// @param {real} _duration 碰撞箱持续时间,默认为0,即无限
  124. function enemy_create_hitboxBC(_x, _y,
  125. _x_offset = 0, _y_offset = 0, _duration = 0)
  126. {
  127. var _hb = icd(oEnemyHitbox, x + _x_offset, y + _y_offset);
  128. _hb.owner = id;
  129. _hb.sprite_index = sEnemyHitboxBC;
  130. _hb.x_offset = _x_offset;
  131. _hb.y_offset = _y_offset;
  132. var _base = 2;
  133. _hb.image_xscale = _x / _base;
  134. _hb.image_yscale = _y / _base;
  135. if _duration != 0
  136. {
  137. _hb.hitbox_type = "BLADE";
  138. _hb.duration = _duration;
  139. }
  140. return _hb;
  141. }
  142. function weighted_pick(_weights)
  143. {
  144. var _total = 0;
  145. for (var i = 0; i < array_length(_weights); i++)
  146. _total += _weights[i];
  147. var _roll = irandom(_total - 1);
  148. var _acc = 0;
  149. for (var i = 0; i < array_length(_weights); i++)
  150. {
  151. _acc += _weights[i];
  152. if _roll < _acc
  153. return i;
  154. }
  155. }