Advertisement
Trickysticks

viewfinder code

Nov 12th, 2020
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | None | 0 0
  1. task CreateViewfinder(initrad, stAng, change) {
  2. let angle = stAng;
  3. let rad = initrad;
  4. let obj = CreateSprite(Hatate, 57, [256, 0, 512, 128], [128, 64]);
  5. ObjRender_SetPosition(obj, ObjMove_GetX(objEnemy), ObjMove_GetY(objEnemy), 0);
  6. ObjRender_SetBlendType(obj, BLEND_ALPHA);
  7. ObjRender_SetAngleZ(obj, angle+90);
  8. ObjRender_SetAlpha(obj, 155);
  9. task scale {
  10. ascent(i in 0..16) {
  11. ObjRender_SetScaleXYZ(obj, sin(i/15*90)*0.75, 0.75, 0);
  12. yield;
  13. }
  14. }
  15. scale;
  16. ascent(i in 0..40){
  17. ObjRender_SetPosition(obj, ObjMove_GetX(objEnemy)+rad*cos(angle), ObjMove_GetY(objEnemy)+rad*sin(angle), 0);
  18. ObjRender_SetAngleZ(obj, angle+90);
  19. rad+=change;
  20. if(ObjEnemy_GetInfo(objEnemy, INFO_LIFE) <= 0) { break; }
  21. yield;
  22. }
  23. if(ObjEnemy_GetInfo(objEnemy, INFO_LIFE) > 0) {
  24. PlaySoundEffect("camerashutter", 80, GetCenterX);
  25. let collide = Collision_Box_Box(ObjRender_GetX(obj), ObjRender_GetY(obj), 192, 93, angle, GetPlayerX, GetPlayerY, 0.5, 0.5, 0);
  26. if(collide) { ObjEnemy_SetIntersectionCircleToPlayer(objEnemy, GetPlayerX, GetPlayerY, 5); }
  27. ascent(i in 0..length(objbullets)) {
  28. collide = Collision_Box_Box(ObjRender_GetX(obj), ObjRender_GetY(obj), 256-24, 128-24, angle-90, ObjMove_GetX(objbullets[i]), ObjMove_GetY(objbullets[i]), 0.01, 0.01, 0);
  29. if(collide){
  30. let obj3 = CreateShotA2(ObjMove_GetX(objbullets[i]), ObjMove_GetY(objbullets[i]), ObjMove_GetSpeed(objbullets[i])-0.25, GetAngleToPoint(ObjMove_GetX(objbullets[i]), ObjMove_GetY(objbullets[i]), GetPlayerX, GetPlayerY), 0.075, 4, WHITE54, 0);
  31. ObjRender_SetAlpha(obj3, 225);
  32. }
  33. }
  34. ViewfinderFlash(ObjRender_GetX(obj), ObjRender_GetY(obj), angle);
  35. }
  36. descent(i in 0..31) {
  37. ObjRender_SetAlpha(obj, i/30*155);
  38. yield;
  39. }
  40. Obj_Delete(obj);
  41. }
  42.  
  43. task ViewfinderFlash(x, y, angle) {
  44. let obj2 = CreateSprite(Hatate, 58, [256, 128, 512, 256], [128, 64]);
  45. ObjRender_SetPosition(obj2, x, y, 0);
  46. ObjRender_SetBlendType(obj2, BLEND_ADD_ARGB);
  47. ObjRender_SetAngleZ(obj2, angle+90);
  48. descent(i in 0..15) {
  49. ObjRender_SetScaleXYZ(obj2, 0.75+(15-i)/75, 0.75+(15-i)/75, 0);
  50. ObjRender_SetAlpha(obj2, i/10*255);
  51. yield;
  52. }
  53. Obj_Delete(obj2);
  54. }
  55.  
  56. function Collision_Box_Box(cx1, cy1, w1, h1, r1, cx2, cy2, w2, h2, r2) {
  57. let rectA = CalculateCorners(cx1, cy1, w1, h1, r1);
  58. let rectB = CalculateCorners(cx2, cy2, w2, h2, r2);
  59.  
  60. let axisList = [
  61. rectA[1] - rectA[0],
  62. rectA[1] - rectA[2],
  63. rectB[0] - rectB[3],
  64. rectB[0] - rectB[1]
  65. ];
  66.  
  67. ascent(i in 0..4){
  68. if(!IsAxisCollision(axisList[i])){
  69. return false;
  70. }
  71. }
  72.  
  73. return true;
  74.  
  75.  
  76. function CalculateCorners(cx, cy, width, height, rotation){
  77. if(rotation == 0){
  78. return [
  79. [cx-width/2, cy-height/2],
  80. [cx+width/2, cy-height/2],
  81. [cx+width/2, cy+height/2],
  82. [cx-width/2, cy+height/2]
  83. ];
  84. }
  85. else {
  86. let angles = [
  87. atan2(height/-2, width/-2)+rotation,
  88. atan2(height/2, width/-2)+rotation,
  89. atan2(height/2, width/2)+rotation,
  90. atan2(height/-2, width/2)+rotation
  91. ];
  92. let distance = (height^2 + width^2)^0.5/2;
  93. return [
  94. [cx+cos(angles[0])*distance, cy+sin(angles[0])*distance],
  95. [cx+cos(angles[1])*distance, cy+sin(angles[1])*distance],
  96. [cx+cos(angles[2])*distance, cy+sin(angles[2])*distance],
  97. [cx+cos(angles[3])*distance, cy+sin(angles[3])*distance]
  98. ];
  99. }
  100. }
  101.  
  102.  
  103. function IsAxisCollision(axis){
  104. let rectAScalars = [
  105. GenerateScalar(rectA[0], axis),
  106. GenerateScalar(rectA[1], axis),
  107. GenerateScalar(rectA[2], axis),
  108. GenerateScalar(rectA[3], axis)
  109. ];
  110. let rectBScalars = [
  111. GenerateScalar(rectB[0], axis),
  112. GenerateScalar(rectB[1], axis),
  113. GenerateScalar(rectB[2], axis),
  114. GenerateScalar(rectB[3], axis)
  115. ];
  116.  
  117. let rectAMin = ArrayMin(rectAScalars);
  118. let rectAMax = ArrayMax(rectAScalars);
  119. let rectBMin = ArrayMin(rectBScalars);
  120. let rectBMax = ArrayMax(rectBScalars);
  121.  
  122. if(rectBMax <= rectAMax && rectBMax >= rectAMin)
  123. {
  124. return true;
  125. }
  126. else if (rectAMax <= rectBMax && rectAMax >= rectBMin)
  127. {
  128. return true;
  129. }
  130.  
  131. return false;
  132. }
  133.  
  134.  
  135. function GenerateScalar(corner, axis){
  136. let num = (corner[0] * axis[0]) + (corner[1] * axis[1]);
  137. let denom = (axis[0] * axis[0]) + (axis[1] * axis[1]);
  138. let divisionResult = num / denom;
  139.  
  140. let cornerProjected = [divisionResult * axis[0], divisionResult * axis[1]];
  141.  
  142. let scalar = (axis[0] * cornerProjected[0]) + (axis[1] * cornerProjected[1]);
  143. return scalar;
  144. }
  145.  
  146. function ArrayMin(array){
  147. let minA = array[0];
  148. ascent(i in 1..length(array)){
  149. if(array[i] < minA){ minA = array[i]; }
  150. }
  151. return minA;
  152. }
  153. function ArrayMax(array){
  154. let maxA = array[0];
  155. ascent(i in 1..length(array)){
  156. if(array[i] > maxA){ maxA = array[i]; }
  157. }
  158. return maxA;
  159. }
  160. }
  161.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement