我试图获取Box2D对象的坐标以适应屏幕上对象的坐标(这些与纹理一起显示)。我已经知道box2D以米为单位工作,所以我必须找到适用于我的程序的转换因子(在这种情况下,我说50像素是2米)。
首先用这个来设置盒子的位置和大小:
b2BodyDef def
def.postition.Set(0.02 * x, y* 0.02)
def.SetAsBox(0.02 * w/2, 0.02* h/2)
因为即时通讯使用openGL我只会制作一个纹理并像往常一样渲染它,但这次我想把纹理x和y与Box2D中它的碰撞盒的x和y相匹配。
当我尝试将我的播放器纹理从地板纹理移开时,我运行程序时,它会在到达结束之前下降。这让我知道我的box2D机身和我的OpenGL纹理没有共享相同的位置。但无论我做什么来尝试和修复,没有任何变化(例如:我尝试将转换因子更改为1m = 20p而不是50p,我尝试不转换坐标,然后我得到一些真正有线的结果,也没有工作,并且一堆其他东西)。最糟糕的是box2D当我使用SDL 2时做了同样的事情,我转而认为OpenGL认为这不会再发生了。
演示中的图片: https://drive.google.com/file/d/0B4anrJs1BRh1aVpOYXI3T3JlWWM/view?usp=drivesdk https://drive.google.com/file/d/0B4anrJs1BRh1dVlTb0czMTE3RWc/view?usp=drivesdk
tile类的代码(目前我的项目中使用box2D的唯一类)
void tile::load(bool square, std::string path)
{
if(square)
{
glGenTextures(1, &texID);
SDL_Surface *sur = IMG_Load(path.c_str());
w = sur->w;
h = sur->h;
glBindTexture(GL_TEXTURE_2D, texID);
glTexImage2D(GL_TEXTURE_2D, 0, 4, sur->w, sur->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, sur->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture( GL_TEXTURE_2D, NULL );
}
}
void tile::addRect(int x, int y, int wt, int ht, bool dyn)
{
b2BodyDef def;
//Convert the x and y into meters.
def.position.Set(vars::P2M * x, vars::P2M * y);
if(dyn)
{
def.type = b2_dynamicBody;
}
b = vars::world->CreateBody(&def);
b2PolygonShape shape;
//Convert the width and height entered into meters
shape.SetAsBox(vars::P2M * w/2,vars::P2M * h/2);
float th = w * 0.02;
float tw = h * 0.02;
b2FixtureDef fix;
fix.shape = &shape;
fix.density = 1.0;
b->CreateFixture(&fix);
h = h;
w = w;
}
void tile::Render()
{
glLoadIdentity();
b2Vec2 pos;
pos = b->GetPosition();
float x = pos.x;
float y = pos.y;
//Convert the x and y of the body to pixels.
glTranslatef(x * vars::M2P, y * vars::M2P, 0);
glBindTexture( GL_TEXTURE_2D, texID);
glBegin( GL_QUADS );
glTexCoord2f(0.f, 0.f); glVertex2f(0.f, 0.f);
glTexCoord2f(1.f, 0.f); glVertex2f(w, 0);
glTexCoord2f(1.f, 1.f); glVertex2f(w, h);
glTexCoord2f(0.f, 1.f); glVertex2f(0, h);
glEnd();
}
void tile::Update()
{
b2Vec2 vel;
vel = b->GetLinearVelocity();
if(key[SDL_SCANCODE_D])
{
d_key = true;
}
else
{
d_key = false;
}
if(key[SDL_SCANCODE_A])
{
a_key = true;
}
else
{
a_key = false;
}
if(a_key)
{
//Move the box left
vel.x = -5;
}
if(d_key)
{
//Move the box right
vel.x = 5;
}
b->SetLinearVelocity(vel);
}
如果有人有这方面的解决方案,请发布它,因为我没有选项,我不知道该怎么办。感谢。
哦,顺便说一下, vars :: M2P = 50和vars :: P2M = 1 / vars :: M2P(反过来为0.02)。