弹弹堂弹道模拟程序——第一帖

来源:互联网 发布:网络大电影剧本格式 编辑:程序博客网 时间:2024/04/29 17:00

一天一贴,进来骂的先管好你的功利心,爷不吃这套。

在360玩这个游戏不少日子了,不过某些公司的套钱运营真是让人头痛,牟上你了!那么本人本着技术交流和防外挂的角度来发个帖子。闲话少提,开源!

说说思路

不读内存只读屏幕,里面的风力、角度、地图、人物位置都可以识别。而后利用物理引擎模拟其参数即可求算出需要多少力度能够击中对手。

第一部分:先讲物理引擎,图像识别其实太简单了。

作为一个游戏来讲,使用较好的物理引擎来模拟真实世界是必要的,而免费的物理引擎中也有很多做得很好的。就以入门级比较适合的BOX2D引擎说,这个引擎里面的名空间比较少功能也完全可以胜任了。有兴趣的可以参照其自带的说明,其实只要你稍微熟悉一点C语言把他的代码改成VB.NET就很简单。

简要的说:
1、世界:就是说你要模拟的东东都在多大的范围内,当然世界是一个类,还包括着各种各样的参数,而世界里面的物体就是一个属性。
2、世界参数:比较重要的就是重力和空气阻尼等,这些只需要我们有几条游戏的抛物曲线即可模拟到非常精准。当然,还有一些像步长参数等,看了代码你就明白了。
3、物体:包括静态物体、动态物体、AABB等,实际上只需要了解动态物体和AABB即可,因为我们要“试探”到底多少力度会使炮弹进入到AABB里面。

基本思路就是确定自己的位置从而得到炮弹发射点位置,再确定对手位置设为AABB,每隔一定力度检测一次发射炮弹的结果是否使路径中某一点被包含在AABB内。好了,一步一步跟我来,首先创建一个世界:

    Sub New()
        '世界外边框,这里我们把它设置的足够大,这样做是因为一旦炮弹跑到外面去了,就会引发错误,错误处理将耗时很多。
        Dim Wordaabb As Box2DX.Collision.AABB
        Wordaabb.LowerBound.Set(-10000.0F, -10000.0F)
        Wordaabb.UpperBound.Set(10000.0F, 10000.0F)
        '允许引擎休眠,当物体静止时,引擎可以不计算他的位置,看起来很可笑的一个参数,在这里实际上我们用不到,因为一旦一次试探结束了,我们就销毁物体了。
        Dim dosleep As Boolean = False ' True
        '创建世界,这里的第二个参数g,就是重力加速度了
        world = New Box2DX.Dynamics.World(Wordaabb, g, dosleep)
    End Sub


好了,有了世界,我们下一步就创建一个物体:

这个函数好像参数有点多,不过意义基本都是明确的:
玩家位置,是否面向右侧(这关系到发射点),炮弹半径,是否是感应器(因为需要较高级的回调方法,所以这里没有使用),发射角度。

Private Function CreateBody(ByVal PlayerPoint As PointF, ByVal ForRight As ForRight, ByVal R As Single, ByVal IsSensor As Boolean, ByVal Angle As Double) As Box2DX.Dynamics.Body
        '创建动态物体,它的质量一定要大于0,动态物体就可以运动了,他是我们的炮弹
        Dim bodyDef As New Box2DX.Dynamics.BodyDef
        ’下面这个就是武器相对于人的位置了——当然只是一个近似,用了一个二维向量旋转函数:
'        ret.X = p.X * Math.Cos(b) - p.Y * Math.Sin(b)
'        ret.Y = p.X * Math.Sin(b) + p.Y * Math.Cos(b)
        WapOffset = RotateV2(New PointF(50, 0), Angle)
'下面我们就设置炮弹的发射点了
        bodyDef.Position.Set((PlayerPoint.X + CInt(ForRight) * WapOffset.X) / 10, (PlayerPoint.Y + WapOffset.Y) / 10)
’这句话相信很容易理解,那就是……哦耶空气阻尼
        bodyDef.LinearDamping = Damping
'接下来我们只需要把物体创建出来即可,使用的是世界的创建方法
        Dim Body As Box2DX.Dynamics.Body
        Body = world.CreateBody(bodyDef)
'当物体被创建之后,还需要设置它的形状,密度,大小,摩擦系数(我们这里没有用到,因为我们的炮弹没有和任何物体解除——世界上只有一个炮弹,是否击中对手使用AABB检测)等等一些参数
        '为物体附加一个多边形,这里附加了一个圆形
        Dim shapeDef As New Box2DX.Collision.CircleDef
        shapeDef.IsSensor = IsSensor
        shapeDef.Radius = R   '设置体积为1,以使得质量计算结果为1
        shapeDef.Density = Density    '密度
        'shapeDef.Friction = 1   '摩擦系数
        Dim shape = Body.CreateShape(shapeDef) '附加到物体
        Body.SetMassFromShapes()   '根据形状计算质量
        Return Body
    End Function

很好,我们已经有一个物体了,我们知道它的质量、大小,知道空气阻尼,知道重力,哦对了,还有风力耶,很遗憾BOX2D没有给我们提供一个持久力作用于物体的方法,但是不要担心,我们只需要在每次让BOX2D计算的时候给物体一个风力冲量即可!也就是应用Body.ApplyForce方法了。

好了,今天先到这里!

 

原创粉丝点击