我正在用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。
答案 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);
}