我花了很多时间尝试在sdl中从this tutorial渲染汽车。但出于某种原因,我无法在正确的位置渲染它。我试图让汽车与一个静态物体碰撞(一棵树也会被渲染),但碰撞永远不会在正确的位置。
在我的车里,我做了一个返回轮胎的功能,所以我可以将它们作为参考点(我知道如果它在轮胎之间,我会将车身正确渲染)。
为了渲染汽车,我制作了以下代码。
void World::drawObject(float nwidth, float nheight, float nx, float ny, float nangle)
{
float angle = nangle * RADTODEG;
//To get the center
float x = nx - (nwidth / 2);
float y = ny + (nheight / 2);
//- before y to mirror axis
SDL_Rect drawingRect = { x * scale, - y * scale, nwidth * scale, nheight * scale };
SDL_RenderCopyEx(renderTarget, textureCar, NULL, &drawingRect, transfrom(angle), NULL, SDL_FLIP_VERTICAL);
}
void World::drawCar(){
SDL_RenderClear(renderTarget);
drawObject(6, 10, myCar->getB2DPosition().x, myCar->getB2DPosition().y, myCar->getAngleB2D());
drawObject(6, 10, myTree->getB2DPosition().x, myTree->getB2DPosition().y, myTree->getAngleB2D());
//get all tires and render them
std::vector<TDTire*> tires = myCar->getTires();
for (int i = 0; i < tires.size(); i++)
{
drawObject(0.5, 1.25, tires[i]->getX(), tires[i]->getY(), 0);
}
SDL_RenderPresent(renderTarget);
}
//used to get the mirrored angle.
int World::transfrom(float dgrs)
{
int add360 = dgrs + 360;
int newAngle = 0;
int gradenBox2d = add360 % 360;
if (gradenBox2d < 90)
{
int temp = 90 - gradenBox2d;
newAngle = 90 + temp;
}
if (gradenBox2d < 180)
{
int temp = gradenBox2d - 90;
newAngle = 90 - temp;
}
if (gradenBox2d < 270)
{
int temp = 270 - gradenBox2d;
newAngle = 270 + temp;
}
else{
int temp = gradenBox2d - 270;
newAngle = 270 - temp;
}
int newNewAngle = newAngle % 360;
return newNewAngle;
}
根据我目前的代码,汽车总是在前轮胎后面。
当我调用getB2Position和getAngle时,我返回
return m_body->GetPosition();
return m_body->GetAngle();
我用箭头作为图像来显示方向。 欢迎任何帮助。