在我正在写的这个游戏中,到目前为止,我只是用瓷砖处理这样的碰撞检测:
我将地图向左滚动 8 个单位。然后我检查我的角色右侧是否与具有“碰撞”属性的图块发生碰撞。如果发生碰撞,则我定位我的角色,使其右边缘像素值等于图块的左边缘。
现在要检查垂直碰撞检测,我检查角色的右下角和左下角。如果任一角在“碰撞”图块中,那么我将字符的 y 值设置为等于图块的顶部(即,如果它与实心图块发生碰撞,那么它将始终出现在该图块的顶部)。
这种垂直碰撞检测一直有效,直到我撞到墙为止。由于垂直碰撞检查将始终将角色推到瓷砖的顶部,如果我的角色跳跃并降落在墙的中心,那么他将被卡在墙上的一个瓷砖的顶部,直到你按跳跃,然后他立即向上移动到下一个瓷砖的顶部。
解决这种垂直碰撞检测的更好方法是什么?我在想永远不要让角色完全拥抱“墙”瓷砖,这样他的右边缘总是距离墙砖左 1 个像素,这样我仍然可以检查角色的右上角并且它永远不会真正撞到那堵墙(所以如果靠近墙,角色仍然可能会摔倒)。不过,这似乎很草率。有没有更好的办法?我整天都在研究这个问题,我似乎无法找到一个好的解决方案。
代码如下所示:
public void render()
{
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gameTime += Gdx.graphics.getDeltaTime();
characterDisplay = characterAnimation.getKeyFrame(gameTime, true);
TiledMapTileLayer layer = (TiledMapTileLayer)tiledMap1.tiledMap.getLayers().get(0);
float x;
float x1;
float x2;
x1 = ((characterPosition.x + characterWidth)/tileWidth);
x2 = (-tileRenderer.tiledMap.x);
x = x1 + x2;
if (isFalling)
characterPosition.y -= FALLING_SPEED;
float yBottom;
float y1 = (int)((characterPosition.y)/tileWidth) + 1;
yBottom = y1;
tileRenderer.tiledMap.x -= .2;
if (layer.getCell((int)x, (int)yBottom).getTile().getProperties().containsKey("collision"))
{
characterPosition.x = ((x + tileRenderer.tiledMap.x )* tileWidth) - characterWidth;
}
y1 = (int)(characterPosition.y/tileWidth);
yBottom = y1;
x1 = ((characterPosition.x + characterWidth)/tileWidth);
x2 = (-tileRenderer.tiledMap.x);
x = x1 + x2;
if ((layer.getCell((int)x, (int)yBottom).getTile().getProperties().containsKey("collision") || layer.getCell((int)x - 1, (int)yBottom).getTile().getProperties().containsKey("collision")))
{
characterPosition.y = (yBottom * tileHeight) + tileHeight;
isFalling = false;
}
tileRenderer.render();
//draw textures
batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.draw(characterDisplay, characterPosition.x, characterPosition.y);
batch.end();
//handle user input
handleUserInput();
}