首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3在跳台游戏中的box2d怪异效果

AS3在跳台游戏中的box2d怪异效果
EN

Stack Overflow用户
提问于 2015-08-05 14:02:08
回答 2查看 136关注 0票数 2

我正在用AS3和box2D制作一个平台游戏。我有一个奇怪的问题,我想不出来。这个角色一直在运行,一碰它就跳了起来--非常标准。但是当它从高处跳下来时,角色在重力作用下会放松水平速度,只在Y轴上移动,直到它接触到地面,然后恢复跑步。奇怪的是,如果我降低重力,就不会有这样的影响。我试着玩密度,摩擦。也没有阻尼。

我搜索了所有可能的box2d问题,这些问题都与跳跃、坠落和速度问题有关。什么都找不到。

这是字符运动的代码。重力为20,时间步长为1/15。

代码语言:javascript
复制
public class HeroModel extends GameObjectModel
{
    public var isJumping:Boolean = false;
    public var isAlive:Boolean = true;
    public var forwardForce:b2Vec2;
    public var decreasingForceY:Number = -200;
    public var decreasingForceX:Number = 100;
    public var startPos:Point;
    public var jumps:Number = 1;

    public function HeroModel()
    {
        super();
    }


    override public function initFrom(initObj:Object, world:b2World):void
    {
        super.initFrom(initObj, world);

        var filterdata:b2FilterData = new b2FilterData();
        filterdata.groupIndex = 1;
        filterdata.maskBits = 1;
        physicsBody.GetFixtureList().SetRestitution(0);
        physicsBody.GetFixtureList().SetDensity(0);
        physicsBody.GetFixtureList().SetFriction(0);
        physicsBody.GetFixtureList().SetFilterData(filterdata);
        physicsBody.SetType(b2Body.b2_dynamicBody);
        physicsBody.SetBullet(true);

        applyForwardForce();
        physicsBody.SetUserData(this);
        startPos = new Point(this.physicsBody.GetPosition().x, this.physicsBody.GetPosition().y);
    }

    public function die():void
    {
        //TODO Empty function.?
    }

    public function applyForwardForce():void
    {
        forwardForce = new b2Vec2(200,0);
        physicsBody.ApplyForce(forwardForce, new b2Vec2(0,0));
    }

    public function jump(e:EnterFrameEvent):void
    {

        if(decreasingForceY < 0 && decreasingForceX > 75)
        {
            physicsBody.ApplyImpulse(new b2Vec2(decreasingForceX, decreasingForceY), new b2Vec2(0,0));
            decreasingForceY+=5;
            decreasingForceX-=2.5;
        }

    }

    public function resetVelocity():void
    {
        decreasingForceX = 100;
        decreasingForceY = -200;
    }

}

这是游戏的截图。红色是发生的,绿色是我想要的。

我在哪里弄错了?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-20 09:09:24

我用SetLinearVelocity修复了它,现在一切都好了。:)

代码语言:javascript
复制
   public function jump(e:EnterFrameEvent):void
    {
        if (!singleJump)
        {
            physicsBody.IsAwake();
            physicsBody.IsBullet();



            physicsBody.SetLinearVelocity(new V2(75, -200));



            physicsBody.GetLinearVelocity();
            trace(physicsBody.GetLinearVelocity().x);
            trace(physicsBody.GetLinearVelocity().y);

            singleJump = true;
票数 0
EN

Stack Overflow用户

发布于 2015-08-05 14:35:20

20的重力很大(8或9更自然)。你所描述的运动/反应符合用于一个大物体的重力,比如公共汽车或一辆大卡车。我猜你的角色可能和公共汽车或卡车一样大。由于我在您的代码中没有看到任何地方使用比例因子,这似乎是一个很好的假设。跳过比例因素可能会使一切变得更简单,但它不能使您的模拟现实。

Box2D必须与标度因子一起使用,它的测量单元是以米为单位的,所以100x100物体是一座大建筑物。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31834747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档