弹弹堂手游吧 关注:68,812贴子:756,204

一种考虑高度差的高抛计算方法

只看楼主收藏回复

拿到新超武钻头才开始研究蓄力模式,为了发挥新超武的挖坑特性,显然比较适合用高抛的打法。但钻头的爆炸直径小,对高抛准度有很高的要求。
传统高抛计算一般采用经验公式:
力度=95
角度=90°-屏距±风力×2
但这样算出的只是近似结果,当距离较大或者有垂直高度差时结果往往不准
因此我采用二次函数图像拟合的方法计算,作出了一个计算高抛角度力度的小程序,输入xy坐标和风力就能计算出高抛的角度力度,误差在0.1屏距以内(测试并不是很多,可能还需要修正)


程序使用matlab编写的,暂时还不会打包,只能分享下代码
clear;
x0=input('x:');y0=input('y:');
theta=100;
t0=theta/180*pi;
power=95;
wind=input('风力:');
w=wind*0.352;
v=power*0.1795;
vx=v*cos(t0);
vy=v*sin(t0);
t1=(vy+(vy^2-2*10*y0)^0.5)/10;
% x1=t1*vx+0.5*w*t1^2;
dis=abs(vx*t1+0.5*w*t1^2-x0);
while(dis>0.1)
theta=theta-0.1;
t0=theta/180*pi;
vx=v*cos(t0);
vy=v*sin(t0);
t1=(vy+(vy^2-2*10*y0)^0.5)/10;
dis=abs(vx*t1+0.5*w*t1^2-x0);
end
t=0:0.01:20;
y=t.*vy-0.5*10*t.^2;
x=t.*vx+0.5*w*t.^2;
plot(x,y);
hold on;
plot(x0,y0,'*');
axis([0 30 -10 30]);
theta1=round(theta);
power=95+(theta-theta1)*10;
disp('角度:');
disp(theta1);
disp('力度:');
disp(power);


IP属地:陕西1楼2020-04-19 17:08回复
    下面讲一下建模过程
    炮弹的飞行实际上是一个受水平加速度(风)影响的斜抛过程,已知两点坐标(自身为原点,敌人坐标xy)求解析式(角度,力度)的过程
    考虑风力影响时,解析式比常规的抛物线复杂很多,因此从运动学的角度对弹道进行分析,可以将炮弹运动拆分成水平和垂直两个方向:
    水平方向做带有初速度的匀加速(风)直线运动:
    x=Vx*t+0.5*w*t²
    垂直方向上做带有初速度的匀加速(重力)直线运动:
    y=Vy*t-0.5*g*t²
    其中变量含义:
    Vx——初速度的水平分量等于
    Vy——初速度的垂直分量
    t——运动时间
    w——风力带来的加速度
    g——重力加速度

    由于角度和力度有分度值的影响,求出精确解析式意义并不大(比如求出角度83.12度,但实际只能取83度)
    因此采用了一种迭代法进行求解,思路更加简单:
    1. 默认角度100度,力度95
    2. 计算炮弹飞行到和目标y坐标相同时所需时间(二次方程求根公式)
    3. 根据上一步求出的时间反算此时炮弹与目标x方向上的距离
    4. 若距离大于0.1(屏距)则将角度减去0.1度,返回第二步
    5. 将算得的小数部分省去,折入力度计算
    (这里其实也是经验公式:例如83.5度95力可以近似成83度90力或84度100力,每0.1角度折算为1力)
    建模最麻烦的其实是测修正系数,因为游戏里面显示的力度power和风力wind,并不是实际的速度v和加速度w,变换公式为:
    v=power*0.1795
    w=wind*0.352


    IP属地:陕西3楼2020-04-19 17:13
    收起回复
      其实主要还是自己高抛玩的少,遇到高度差就打不准了,就搞了这么个东西


      IP属地:陕西4楼2020-04-19 17:16
      收起回复
        matlab打包完的程序几百mb太大了,有时间研究研究怎么用c语言或者python写一个


        IP属地:陕西5楼2020-04-19 17:18
        收起回复
          原来学习不好,玩游戏也会被虐


          IP属地:河南来自Android客户端6楼2020-04-19 17:18
          回复
            楼主牛逼,收藏了


            来自Android客户端7楼2020-04-19 17:18
            回复
              关注了,希望楼主多出技术贴


              IP属地:江西来自Android客户端8楼2020-04-19 17:23
              收起回复
                其实高抛本来是个无视高差的公式,不过手游地图太大了经常会超出两屏超过20还有高差的话我力度一般会按在97.8这样


                IP属地:辽宁来自iPhone客户端9楼2020-04-19 17:27
                收起回复
                  觉得用处不大的可以看下一楼的游戏截图,
                  按照原来的公式算我那个图片里的情况,不考虑高度差,距离18.1顺风5,应该是角度82力度95,
                  而实际上要角度80力度95,跟计算结果差距很大
                  而且推荐力度也不适用,因为推荐力度不考虑风力影响,95的力量已经超出了红色区域的推荐范围但也能打中


                  IP属地:陕西10楼2020-04-19 17:36
                  收起回复
                    水一波技术贴,很难有人这么认真的玩游戏


                    来自iPhone客户端11楼2020-04-19 17:50
                    回复
                      等个python的


                      IP属地:广东12楼2020-04-19 17:58
                      回复
                        太难了,我选择飞对方身边埋


                        IP属地:广东来自Android客户端13楼2020-04-19 19:02
                        回复
                          我都按推荐的打 除了自己手笨按超了或者提前松手了都能打中


                          IP属地:广东来自iPhone客户端14楼2020-04-19 19:04
                          回复
                            大佬


                            IP属地:天津来自Android客户端15楼2020-04-19 19:29
                            回复
                              太离谱了,玩游戏都得会编程


                              IP属地:江苏来自Android客户端18楼2020-04-19 19:32
                              回复