Cocos2dx - 无法设置速度 = 0.0

Cocos2dx - Unable to set velocity = 0.0

我正在用 cocos2dx 制作台球游戏。 首先,我用这个参数设置 edgeBox PhysicsMaterial(1.0f, 1.0f, 0.8f) 然后这2个球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。 我认为有某种力在不断改变速度。您可以在下图中看到蓝色胶水并一直设置 velocity = 0.0。

在将速度设置为零之前首先重置力:player2->getPhysicsBody()->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);
}