Project1

标题: 高达游戏 , 实体彈幕与碰撞测试 , 使用RGD引擎 [打印本页]

作者: ppspssss    时间: 2020-9-9 12:10
标题: 高达游戏 , 实体彈幕与碰撞测试 , 使用RGD引擎
之前看到张咚咚的那个彈幕, 想不到也能做这类遊戏, 但要使用到三角函数的公式,


以Y及X之分速度, 计算角度得出的分速度, 而这需要弧度制转角度制 , 张咚咚的看上去我自己看不懂, 还是要自己写一次, 才能明白其中的公式(其实现在也不懂), 列出子弹移动之公式使用(部分),    zy90d为判断为第几象限开始, 0~89度 得出数值为0 , 91~180度为得出数值为1,181~270为2,271~360度为3, 360度和0度相同, 所以还是把角度等于360度时变成0度, pc90d是第几象限中的角度余数,数值为0~90 ,pc90则为用于计算时使用, 所以是浮点数, 最后@suz_x,和@suz_y, 是储存计算之座标, 是浮点数, 所以最后才精灵图象的x,y值等于@suz_x,@suz_y , 不然会小数点被忽略不计, 那么@speed 经计算后, 会把合速度分解为x,y两个分速度, 用于移动, 第一象限就右上,所以X轴+,Y轴- , 第二象限就左上, 所以X轴-,Y轴-,第三象限左下,X轴-,Y轴-,第四象限右下, X轴+,Y轴+ , 一开始的give_angle 是把超过360度的角度转为正角, 所以减360度, 负角就加去360度

cos角度为邻比斜 , 那么减去的角度就作为另一个轴之角度计算 (已知斜轴长度, 和角度求出X,Y轴的公式) , 要使用三角函数
如: 0~89度
speedx = Math.cos(pc90*Math::PI/180.0)*@speed
speedy = Math.cos(downangle*Math::PI/180.0)*@speed


代碼如下:(仅限參考

RUBY 代码复制
  1. give_angle = @g_amm.angle
  2.   if give_angle > 360
  3.     give_angle =  (give_angle-360)
  4.   elsif give_angle < 0
  5.     give_angle =  (give_angle+360)
  6.   end
  7. @g_amm.angle = give_angle
  8. if  true#子弹之自动向前移动#Kboard.keyb($R_Key_NUMPAD8)
  9.   pc90d = (@g_amm.angle%90).to_i
  10.   zy90d = (@g_amm.angle/90).to_i
  11.   pc90 = @g_amm.angle%90
  12.   #0~90度(包含)360
  13. if @g_amm.angle >= 0 and @g_amm.angle <=90
  14. if @g_amm.angle == 0
  15.   speedx = @speed
  16.   speedy = 0
  17.   end
  18. if @g_amm.angle == 90
  19.   speedy = @speed
  20.   speedx = 0
  21. end
  22.  
  23.  
  24. if @g_amm.angle != 0 and @g_amm.angle !=90
  25. downangle = 90- pc90
  26. speedx = Math.cos(pc90*Math::PI/180.0)*@speed
  27. speedy = Math.cos(downangle*Math::PI/180.0)*@speed
  28.  
  29. end
  30. @suz_x +=speedx
  31. @suz_y -=speedy
  32.  
  33. end
  34. #90度并合发散
  35.  
  36.  
  37. ####test
  38. if @g_amm.angle == 180
  39.   speedy = 0
  40.   speedx = @speed
  41.   @suz_x -=speedx
  42.   #return
  43. end
  44. if @g_amm.angle == 270
  45.   speedy = @speed
  46.   speedx = 0
  47.   @suz_y +=speedy
  48.   #return
  49. end
  50.   if @g_amm.angle == 360 #or @g_amm.angle == 0
  51.   speedy = 0
  52.   speedx = @speed
  53.   @suz_x +=speedx
  54. #return
  55. end
  56.  
  57. ####
  58.  
  59.  
  60.   #91~180度
  61.   if pc90d >=1 and pc90d <=90 and zy90d == 1 or @g_amm.angle == 91.0
  62.  
  63.  
  64. if pc90d != 1 and pc90d !=90 or @g_amm.angle == 91.0
  65. downangle = 90- pc90#@g_amm.angle
  66. speedx = Math.cos(downangle*Math::PI/180.0)*@speed
  67. speedy = Math.cos(pc90*Math::PI/180.0)*@speed
  68.  
  69. end
  70. @suz_x -=speedx
  71. @suz_y -=speedy
  72.  
  73.   end
  74.  
  75.   #181~270度
  76.   if pc90d >=1 and pc90d <=90 and zy90d == 2 or @g_amm.angle == 181.0
  77.  
  78.  
  79.  
  80. if pc90d != 1 and pc90d !=90 or @g_amm.angle == 181.0
  81. downangle = 90- pc90
  82. speedx = Math.cos(pc90*Math::PI/180.0)*@speed
  83. speedy = Math.cos(downangle*Math::PI/180.0)*@speed
  84.  
  85. end
  86. @suz_x -=speedx
  87. @suz_y +=speedy
  88.   end
  89.   #270~359度
  90.  
  91.   if pc90d >=1 and pc90d <=90 and zy90d == 3 or @g_amm.angle == 271.0
  92.  
  93. if pc90d != 1 and pc90d !=90 or @g_amm.angle == 271.0
  94. downangle = 90- pc90
  95. speedx = Math.cos(downangle*Math::PI/180.0)*@speed
  96. speedy = Math.cos(pc90*Math::PI/180.0)*@speed
  97.  
  98. end
  99. @suz_x +=speedx
  100. @suz_y +=speedy
  101.   end
  102.  
  103.  
  104.  
  105. #,
  106. ##{(@g_amm.angle%90).to_i},#{(@g_amo.angle/90).to_i}
  107.  
  108. # 提示xy速度,以及角度
  109. #pst  "x速度#{speedx},y速度#{speedy},角度#{@g_amm.angle} "
  110. end
  111.  
  112.  
  113. #向前行走(使用變量來制定小數点,sprite,x,y不支持小數點)
  114.    @runed_long += @speed#b
  115.   end #def


至于相对位移, 以屏幕原点之中心, 这樣会
$屏幕位移_x= @suz_x- $Screen_X/2 #$Screen_X為屏幕之X軸長度比如640  (p_car主角作為參考点)
$屏幕位移_y= @suz_y- $Screen_Y/2 #$Screen_Y為屏幕之Y軸長度比如480

@p_car.x =  @suz_x-$屏幕位移_x  #主角和屏幕之位移
@p_car.y =  @suz_y-$屏幕位移_y

@g_amm.x = @suz_x - $屏幕位移_x   #彈幕和屏幕之位移
@g_amm.y = @suz_y - $屏幕位移_y

彈幕, 但是如果高达配件, 也还是要想公式, 因为我想每个配件都有独立的体积判断, 不是整机
把方形分成三等分,根椐图片的高度而定, 然后
以中间的方形为中心,利用cos邻比斜求出方框中的移位(也是子弹移动合速度的公式) 来定位三个矩形




RGSS3 是50怪时, 会變成10幀,發彈幕差不多 , 屏幕外20幀
至于RGD , 50怪时依舊60幀, 但發彈幕会尤其多时會掉幀至40多, 目測是我没优化, 总是和所有敌人对称軸包圍盒AABB所計算, 因此如优化應該还有一些幀數提升空間,


彈幕遊戏演示:
https://www.bilibili.com/video/BV13D4y1o7NT

轴对称包围盒參考网站:
https://aotu.io/notes/2017/02/16/2d-collision-detection/


彈幕角度公式 (射擊之角度) 參考了@张咚咚 的条条丝丝弹幕游戏
https://rpg.blue/thread-410703-1-1.html
作者: fux2    时间: 2020-9-9 13:15
RGD的sprite十分高效,做弹幕游戏的优势很大
楼主每次都能拿出有意思的东西啊
作者: 张咚咚    时间: 2020-9-9 18:27
感觉可以加个截肢系统,就更有意思了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1