Cocos2d x Cocos2dx-无法设置速度=0.0

Cocos2d x Cocos2dx-无法设置速度=0.0,cocos2d-x,game-physics,velocity,Cocos2d X,Game Physics,Velocity,我正在用cocos2dx做一个台球游戏。 首先,我使用此参数设置edgeBoxPhysicsMaterial(1.0f、1.0f、0.8f) 然后这两个球物理材料(1.0f,1.0f,0.5f) 在update函数中,我希望通过添加 physicsBody->setLinearDamping(0.3) 在更新函数中,我设置了最小速度,如果每个球的速度低于15,则将速度重置为0,0 auto MV = 15; auto v1 = player1->getPhysicsBody()->g

我正在用cocos2dx做一个台球游戏。 首先,我使用此参数设置edgeBox
PhysicsMaterial(1.0f、1.0f、0.8f)
然后这两个球
物理材料(1.0f,1.0f,0.5f)

在update函数中,我希望通过添加
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);
}
auto MV=15;
自动v1=player1->getPhysicsBody()->getVelocity();
auto v2=player2->getPhysicsBody()->getVelocity();
如果(v1.x>MV | | v1.x<-MV||
v1.y>MV | | v1.y<-MV){
}else如果(v1!=Vec2(0,0)){
player1->getPhysicsBody()->setVelocity(Vec2(0,0));
CCLOG(“sx1:%f%f”,v1.x,v1.y);
}
如果(v2.x>MV | | v2.x<-MV||
v2.y>MV | v2.y<-MV){
}else如果(v2!=Vec2(0,0)){
player2->getPhysicsBody()->setVelocity(Vec2(0,0));
CCLOG(“sx2:%f%f”,v2.x,v2.y);
}
除了球挨着墙或彼此站着外,一切都很好。我看到蓝色的小胶水粘在这些物体上,这是接触的时候

在这种情况下,我不能把速度设为0,0。 我认为有某种力在不断地改变速度。您可以看到下面的图像,以查看蓝色胶水,并始终保持设置速度=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);
}

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

你需要我提供演示代码吗?我有截图,一切都像我描述的那样。注意屏幕截图上球和墙之间的胶水,每次接触(球到墙,球到球),速度都在不断变化。我发现解决方法是将
setDynamic
设置为
false
,以在速度等于0时禁用移动。但这个愚蠢的错误可能会导致很多事情,例如:@TomSawyer嘿,检查(要使球移动,点击右上角按钮)@TomSawyer你可以。我注意到,如果速度和方向等于示例中的值,我的演示也有相同的行为。我还尝试调用
setDynamic
方法,而不是将速度设置为零,但在这种情况下,主体有时会有一点重叠。因此,我认为这是物理引擎的预期行为,我建议您在物理世界中以@TomSawyer的形式打开自动睡眠模式,但我不确定您是否可以通过cocos2-x包装器为物理打开自动睡眠模式。你可以在cocos2d-x论坛上问这个问题。谢谢,如果速度等于零,我会通过
setDynamic
来解决,这样可以避免重叠。基本上,这个错误暂时已经修复,即使我不知道主要原因。现在我必须处理多个设备之间的同步坐标:(BTW,你的代码很棒。我是C++和COCOS的新2周,可以从你的代码中学习。你需要我提供演示代码吗?我有截图,一切都像我所描述的一样。注意在球和墙之间的屏幕上的胶粘,每次接触都是(球到墙,球到球)。,速度不断变化。我发现解决方法是将
setDynamic
设置为
false
,如果速度等于0,则禁用移动。但是这个愚蠢的错误可能会导致很多事情,例如:@TomSawyer嘿,检查(要使球移动,请点击右上角按钮)@TomSawyer你可以。我注意到,如果速度和方向等于你例子中的值,我的演示也有相同的行为。我也尝试调用
setDynamic
方法,而不是将速度设置为零,但在这种情况下,物体有时会有一点重叠。所以我认为这是物理的预期行为gine和我建议你在物理世界中以@TomSawyer的形式打开自动睡眠模式,但我不确定你是否可以通过cocos2-x包装器为你的物理打开自动睡眠模式。你可以在cocos2d-x论坛上问这个问题。谢谢,如果速度等于零,我可以通过
setDynamic
解决,这样可以避免重叠。基本这一错误在时间上已经被固定了,即使我不知道主要原因。现在我必须处理多个设备之间的同步坐标:(BTW,你的代码很棒。我是C++和COCOS的新2个星期,可以从你的代码中学习。