0

在我正在写的这个游戏中,到目前为止,我只是用瓷砖处理这样的碰撞检测:

我将地图向左滚动 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();
}
4

1 回答 1

1

您可能需要考虑将角色“推出”出瓷砖,而不是简单地将角色设置在您影响的瓷砖“外部”。所以,如果你跳墙,代码会识别出你之前的位置和运动矢量,并意识到你在 x 方向上首先发生了碰撞。然后,您的演员将沿着其运动矢量“向后推”,直到它接触到与之碰撞的对象。然后再次检查以确保您没有与任何东西发生碰撞并重复。这也应该有助于确保您不会将角色嵌入墙壁/地板中。

有效地,尝试迭代而不是一次完成。

你也可以先发制人地做事——也就是说,在你移动之前检查。有关示例,请参见此处。

还有box2d,对于这种复杂程度,它会很快上手。它会比自己动手做碰撞检测更干净,并且非常适合平台游戏。

于 2013-09-17T10:41:33.287 回答