C++ 在box2d中操纵精灵移动
在过去的几天里,我一直在尝试做一个类似乒乓球的游戏。我有两个桨和一个球。所有动态精灵。除了我遇到的一个问题外,一切都很顺利。球在某一点上倾向于以相同的角度反弹。因此,有时玩家只需在某个特定部位移动球拍,游戏就可以持续一段时间,或者可能永远持续下去,因为无论球击中球拍的哪个部位,球的角速度都不会改变。我使用线速度和角速度的组合来保持球像这样运动:C++ 在box2d中操纵精灵移动,c++,cocos2d-iphone,box2d,C++,Cocos2d Iphone,Box2d,在过去的几天里,我一直在尝试做一个类似乒乓球的游戏。我有两个桨和一个球。所有动态精灵。除了我遇到的一个问题外,一切都很顺利。球在某一点上倾向于以相同的角度反弹。因此,有时玩家只需在某个特定部位移动球拍,游戏就可以持续一段时间,或者可能永远持续下去,因为无论球击中球拍的哪个部位,球的角速度都不会改变。我使用线速度和角速度的组合来保持球像这样运动: if(_isPaused == FALSE) { _world->Step(dt, 10, 10); for(b2Body *b
if(_isPaused == FALSE)
{
_world->Step(dt, 10, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *)b->GetUserData();
if(sprite.tag == 2)
{
b2Vec2 dir = b->GetLinearVelocity();
dir.Normalize();
float currentSpeed = dir.Length();
int maxSpeed = 60;
float accelerate = vel;
if(currentSpeed <= maxSpeed)
{
b->SetLinearVelocity(accelerate * dir);
}
sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
//Keep sprite from bouncing in a straight angle
b->SetAngularVelocity(_body->GetAngle());
}}}
if(\u isPaused==FALSE)
{
_世界->步骤(dt,10,10);
对于(b2Body*b=_world->GetBodyList();b;b=b->GetNext()){
如果(b->GetUserData()!=NULL){
CCSprite*sprite=(CCSprite*)b->GetUserData();
if(sprite.tag==2)
{
b2Vec2 dir=b->GetLinearVelocity();
dir.Normalize();
float currentSpeed=dir.Length();
int-maxSpeed=60;
浮动加速=水平;
if(当前速度设置线性速度)(加速*dir);
}
sprite.position=ccp(b->GetPosition().x*PTM_比率,
b->GetPosition().y*PTM_比率);
sprite.rotation=-1*CC_弧度到_度(b->GetAngle());
//防止精灵以直线角度反弹
b->SetAngularVelocity(_body->GetAngle());
}}}
所以我的问题是,我如何操纵角速度,使球在每次与我的桨碰撞时都能以不同的角度弹跳?我想得到当前的角速度,然后将其乘以某个值,但我不确定这是否是解决我遇到的问题的正确方法。有什么建议或想法吗非常感谢。非常感谢。在我看来,您有两种选择:
希望有帮助!一些提示,您应该很少使用
SetLinearVelocity()
和SetAngularVelocity()
。每种方法都会改变主体定义的属性,这可能会使您在以后事情变得更复杂时遇到问题。最好使用ApplyForceToCenter()
或ApplyLinearImpulse()
代替了SetLinearVelocity()
,因为这两个函数更通用,对编码人员更友好。在我看来,我不认为您应该使用
b->setangularvocity(\u body->GetAngle())如果你想在每次碰撞时改变角速度,你可以在你的beginContact
方法中,写下每次物体与桨体碰撞时,都会对球施加一个随机的角脉冲,使用ApplyAngularImpulse().
希望能有所帮助。谢谢你的建议。你给出的第二个选项似乎是一个不错的方法。我将尝试一下。)