【问题标题】:Cocos2dx - Unable to set velocity = 0.0Cocos2dx - 无法设置速度 = 0.0
【发布时间】:2017-02-04 13:56:14
【问题描述】:

我正在使用 cocos2dx 制作台球游戏。 首先,我使用此参数设置 edgeBox PhysicsMaterial(1.0f, 1.0f, 0.8f) 然后这两个球PhysicsMaterial(1.0f, 1.0f, 0.5f)

在更新功能上,我想在没有重力的情况下(比如制造地面摩擦)通过添加 physicsBody->setLinearDamping(0.3);

在更新功能上,我设置了最小速度,如果每个球的速度低于15,则将速度重置为0,0

auto MV = 15;
auto v1 = player1->getPhysicsBody()->getVelocity();
auto v2 = player2->getPhysicsBody()->getVelocity();
if (v1.x > MV || v1.x < -MV ||
    v1.y > MV || v1.y < -MV) {
} else if(v1 != Vec2(0,0)) {
    player1->getPhysicsBody()->setVelocity(Vec2(0,0));
    CCLOG("sx 1 : %f %f",v1.x,v1.y);
}

if (v2.x > MV || v2.x < -MV ||
    v2.y > MV || v2.y < -MV) {
} else if(v2 != Vec2(0,0)) {
    player2->getPhysicsBody()->setVelocity(Vec2(0,0));
    CCLOG("sx 2 : %f %f",v2.x,v2.y);
}

除了球靠墙或彼此相邻时,一切正常。我看到这些物体上有蓝色的小胶水,这就是接触的时间。

在这种情况下,我无法将速度设置为 0,0。 我认为有某种力量不断改变速度。你可以看到下图看到蓝色的胶水,并像永远一样保持设置速度 = 0.0。

【问题讨论】:

    标签: cocos2d-x game-physics velocity


    【解决方案1】:

    在将速度设置为零之前首先重置力:player2-&gt;getPhysicsBody()-&gt;resetForces();

    重力也可能是物体继续运动的原因。 因此,您可以将整个物理世界的重力设置为零。例如:

    auto scene = Scene::createWithPhysics();
    scene->getPhysicsWorld()->setGravity(Vec2(0, 0));
    

    或只针对一个特定的机构:

    player2->getPhysicsBody()->setGravityEnable(false);
    

    或者你可以自定义速度函数:

    #include "chipmunk.h"
    
    cocos2d::PhysicsBody * pBody = player2->getPhysicsBody();
    pBody->getCPBody()->velocity_func = customVelFunc;
    

    customVelFunc 可以定义为:

    void customVelFunc(cpBody *body, cpVect gravity, cpFloat damping, cpFloat dt)
    {
        cpBodyUpdateVelocity(body, cpvzero, damping, dt);
    }
    

    【讨论】:

    • 需要我提供demo代码吗?我有截图,一切都像我描述的那样工作。注意球和墙之间截图上的胶水,每次接触(球与墙,球与球)时,速度都会不断变化。我发现解决方法是 setDynamicfalse 如果速度等于 0 则禁用移动。但是这个愚蠢的错误可能会导致很多事情,例如:stackoverflow.com/questions/39815898/…
    • @TomSawyer 嘿,检查my repo(让球移动点击右上角的按钮)
    • @TomSawyer 你可以create pull request。我注意到如果速度和方向等于您示例中的值,我的演示具有相同的行为。我也尝试调用setDynamic 方法而不是将速度设置为零,但在这种情况下,主体有时会保持一点重叠。所以我认为这是物理引擎的预期行为,我建议你在物理世界中打开自动睡眠模式stated here
    • @TomSawyer 但我不确定你是否可以通过 cocos2-x 包装器为你的物理打开自动睡眠模式。你可以在 cocos2d-x 论坛上问这个问题。
    • 谢谢,如果速度为零,我会通过setDynamic 解决,这样可以避免重叠。基本上这个错误已经暂时修复了,即使我真的不知道主要原因。现在我必须处理多个设备之间的同步坐标:(。顺便说一句,你的代码很棒。我是 C++ 和 cocos 的新手 2 周,可以从你的代码中学习。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多