Cocos2dx - 无法设置速度= 0.0

时间:2016-09-27 04:42:59

标签: cocos2d-x game-physics velocity

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

在更新功能上,我希望通过添加来减少球的时间而不重力(如制作地面摩擦力) physicsBody->setLinearDamping(0.3);

在更新功能上,我设置了最小速度,如果每个球的速度低于15,则将速度重置为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。

enter image description here

1 个答案:

答案 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);
}