赞 | 77 |
VIP | 0 |
好人卡 | 0 |
积分 | 146 |
经验 | 0 |
最后登录 | 2024-10-24 |
在线时间 | 2147 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 14565
- 在线时间
- 2147 小时
- 注册时间
- 2016-9-20
- 帖子
- 859
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
之前看到张咚咚的那个彈幕, 想不到也能做这类遊戏, 但要使用到三角函数的公式,
以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
代碼如下:(仅限參考
give_angle = @g_amm.angle if give_angle > 360 give_angle = (give_angle-360) elsif give_angle < 0 give_angle = (give_angle+360) end @g_amm.angle = give_angle if true#子弹之自动向前移动#Kboard.keyb($R_Key_NUMPAD8) pc90d = (@g_amm.angle%90).to_i zy90d = (@g_amm.angle/90).to_i pc90 = @g_amm.angle%90 #0~90度(包含)360 if @g_amm.angle >= 0 and @g_amm.angle <=90 if @g_amm.angle == 0 speedx = @speed speedy = 0 end if @g_amm.angle == 90 speedy = @speed speedx = 0 end if @g_amm.angle != 0 and @g_amm.angle !=90 downangle = 90- pc90 speedx = Math.cos(pc90*Math::PI/180.0)*@speed speedy = Math.cos(downangle*Math::PI/180.0)*@speed end @suz_x +=speedx @suz_y -=speedy end #90度并合发散 ####test if @g_amm.angle == 180 speedy = 0 speedx = @speed @suz_x -=speedx #return end if @g_amm.angle == 270 speedy = @speed speedx = 0 @suz_y +=speedy #return end if @g_amm.angle == 360 #or @g_amm.angle == 0 speedy = 0 speedx = @speed @suz_x +=speedx #return end #### #91~180度 if pc90d >=1 and pc90d <=90 and zy90d == 1 or @g_amm.angle == 91.0 if pc90d != 1 and pc90d !=90 or @g_amm.angle == 91.0 downangle = 90- pc90#@g_amm.angle speedx = Math.cos(downangle*Math::PI/180.0)*@speed speedy = Math.cos(pc90*Math::PI/180.0)*@speed end @suz_x -=speedx @suz_y -=speedy end #181~270度 if pc90d >=1 and pc90d <=90 and zy90d == 2 or @g_amm.angle == 181.0 if pc90d != 1 and pc90d !=90 or @g_amm.angle == 181.0 downangle = 90- pc90 speedx = Math.cos(pc90*Math::PI/180.0)*@speed speedy = Math.cos(downangle*Math::PI/180.0)*@speed end @suz_x -=speedx @suz_y +=speedy end #270~359度 if pc90d >=1 and pc90d <=90 and zy90d == 3 or @g_amm.angle == 271.0 if pc90d != 1 and pc90d !=90 or @g_amm.angle == 271.0 downangle = 90- pc90 speedx = Math.cos(downangle*Math::PI/180.0)*@speed speedy = Math.cos(pc90*Math::PI/180.0)*@speed end @suz_x +=speedx @suz_y +=speedy end #, ##{(@g_amm.angle%90).to_i},#{(@g_amo.angle/90).to_i} # 提示xy速度,以及角度 #pst "x速度#{speedx},y速度#{speedy},角度#{@g_amm.angle} " end #向前行走(使用變量來制定小數点,sprite,x,y不支持小數點) @runed_long += @speed#b end #def
give_angle = @g_amm.angle
if give_angle > 360
give_angle = (give_angle-360)
elsif give_angle < 0
give_angle = (give_angle+360)
end
@g_amm.angle = give_angle
if true#子弹之自动向前移动#Kboard.keyb($R_Key_NUMPAD8)
pc90d = (@g_amm.angle%90).to_i
zy90d = (@g_amm.angle/90).to_i
pc90 = @g_amm.angle%90
#0~90度(包含)360
if @g_amm.angle >= 0 and @g_amm.angle <=90
if @g_amm.angle == 0
speedx = @speed
speedy = 0
end
if @g_amm.angle == 90
speedy = @speed
speedx = 0
end
if @g_amm.angle != 0 and @g_amm.angle !=90
downangle = 90- pc90
speedx = Math.cos(pc90*Math::PI/180.0)*@speed
speedy = Math.cos(downangle*Math::PI/180.0)*@speed
end
@suz_x +=speedx
@suz_y -=speedy
end
#90度并合发散
####test
if @g_amm.angle == 180
speedy = 0
speedx = @speed
@suz_x -=speedx
#return
end
if @g_amm.angle == 270
speedy = @speed
speedx = 0
@suz_y +=speedy
#return
end
if @g_amm.angle == 360 #or @g_amm.angle == 0
speedy = 0
speedx = @speed
@suz_x +=speedx
#return
end
####
#91~180度
if pc90d >=1 and pc90d <=90 and zy90d == 1 or @g_amm.angle == 91.0
if pc90d != 1 and pc90d !=90 or @g_amm.angle == 91.0
downangle = 90- pc90#@g_amm.angle
speedx = Math.cos(downangle*Math::PI/180.0)*@speed
speedy = Math.cos(pc90*Math::PI/180.0)*@speed
end
@suz_x -=speedx
@suz_y -=speedy
end
#181~270度
if pc90d >=1 and pc90d <=90 and zy90d == 2 or @g_amm.angle == 181.0
if pc90d != 1 and pc90d !=90 or @g_amm.angle == 181.0
downangle = 90- pc90
speedx = Math.cos(pc90*Math::PI/180.0)*@speed
speedy = Math.cos(downangle*Math::PI/180.0)*@speed
end
@suz_x -=speedx
@suz_y +=speedy
end
#270~359度
if pc90d >=1 and pc90d <=90 and zy90d == 3 or @g_amm.angle == 271.0
if pc90d != 1 and pc90d !=90 or @g_amm.angle == 271.0
downangle = 90- pc90
speedx = Math.cos(downangle*Math::PI/180.0)*@speed
speedy = Math.cos(pc90*Math::PI/180.0)*@speed
end
@suz_x +=speedx
@suz_y +=speedy
end
#,
##{(@g_amm.angle%90).to_i},#{(@g_amo.angle/90).to_i}
# 提示xy速度,以及角度
#pst "x速度#{speedx},y速度#{speedy},角度#{@g_amm.angle} "
end
#向前行走(使用變量來制定小數点,sprite,x,y不支持小數點)
@runed_long += @speed#b
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 |
|