我正在使用Box2D创建一个简单的游戏,我希望实现这样的目标:
我有一个圆圈,箭头指向它的当前角度。在键盘上单击,角度将增加一个值,圆的角度将根据下面第二张图中的变化而变化。
圆的初始状态,其中圆的角度= 0.该线指向0度。
这是用户点击键盘后圆圈的下一个状态。圆的角度现在是15度。
为了进行转换,我做了类似的事情:
void MyCirclecle::turnBall(float angle)
{
body_->SetTransform( body_->GetWorldPoint( b2Vec2(0,0) ), body_->GetAngle() + (angle * b2_pi/180));
}
圆圈正在朝正确方向转动,但圆圈同时移动。每次点击,它会略微向上或向右移动,在180度后,它会略微向下或向左移动。最终在360度之后,它将略微位于初始状态之上。我还尝试使用body_->GetWorldCenter()
和body_->GetPosition()
作为SetTransform
的第一个参数,但我仍然得到同样的结果。我有什么方法可以做,不移动圆圈但可以改变它所面对的角度?
答案 0 :(得分:0)
在b2Vec2(0, 0)
的身体相对位置处更改圆的角度而不是线性移动它是通过实现的MyCircle::turnBall
方法完成的:
void MyCirclecle::turnBall(float angle)
{
body_->SetTransform( body_->GetPosition(), body_->GetAngle() + (angle * b2_pi/180));
}
你看到圆圈正如你所描述的那样线性移动,但是暗示圆圈不在b2Vec2(0, 0)
的身体相对位置。不知怎的,你的圆圈形状的位置已经远离身体的起源。
至少在Box2D 2.3.2中,b2CircleShape
形状的构造函数设置m_p
成员变量(通过m_p.SetZero();
),使其位于主体的原点。因此,我怀疑您的代码是明确更改了m_p
值,或者您正在进行一些内存损坏(正在为您更改它)。
OTOH,如果你真正想要的是一种方法来旋转圆圈的相对偏移(无论可能是什么)从它的身体(所以在圆圈只旋转时移动身体),你需要{{1}方法实现更像这样:
MyCircle::turnBall