libGDX:如何实现基于平铺/网格的游戏角色运动?

时间:2014-01-07 00:01:56

标签: java android windows libgdx tiled

害怕重新发明轮子,我想知道:

使用 libGDX 在自上而下 Tiled (2D)地图上实现基于平滑网格的游戏角色移动的最佳方法是什么?

只要按下箭头键(或者在角色的某个方向上发生触摸事件),角色就应该在瓷砖之间保持平滑移动,并且应该完成限制在按键/触摸释放上的网格位置。移动应独立于帧速率。

我很高兴已经实现的一些示例可以研究并导致正确的libGDX API使用。

2 个答案:

答案 0 :(得分:6)

测试是否按下了特定按钮(或触摸了屏幕),如果是,则在一个字段中设置正确的目标图块(玩家将要去的图块)并开始移动到那里,此运动仅在玩家结束时结束是在下一个瓷砖。当发生这种情况时,再次检查输入以继续移动(即重复)。

假设您的图块宽度/高度为1,并且您希望每秒移动1个图块。您的用户按右箭头键。然后你只需将目标设置为播放器右侧的平铺块。

if(targettile!=null){
    yourobject.position.x += 1*delta;
    if(yourobject.position.x>=targettile.position.x){
        yourobject.position.x = targettile.position.x;
        targettile = null;
    }
}

此代码仅针对右移动进行了简化,您也需要将其用于其他方向 如果玩家没有移动,请不要忘记再次轮询输入。

修改

键的InputPolling:

if (Gdx.input.isKeyPressed(Keys.DPAD_RIGHT)){

用于触摸的InputPolling(cam是您的相机,touchPoint是用于存储未投影触摸坐标的Vector3,以及moverightBounds a(libgdx)矩形):

if (Gdx.input.isTouched()){
    cam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
    //check if the touch is on the moveright area, for example:
    if(moveRightBounds.contains(touchPoint.x, touchPoint.y)){
        // if its not moving already, set the right targettile here
    }
}

并且noone已经说过了,您可以将delta作为参数添加到渲染方法中,或者您可以使用以下任意方式获取它:

Gdx.graphics.getDeltatime();

参考文献:

答案 1 :(得分:2)

这仅适用于一个维度,但我希望您能够理解,通过检查方向键并添加/减去1然后将其转换为int(或地板)将为您提供下一个图块。如果释放密钥,则仍然有未到达的目标,实体将继续移动,直到达到目标磁贴。我认为它看起来像这样:

void update()(
    // Getting the target tile
    if ( rightArrowPressed ) {
        targetX = (int)(currentX + 1); // Casting to an int to keep 
                                       // the target to next tile
    }else if ( leftArrowPressed ){
        targetX = (int)(currentX - 1);
    }

    // Updating the moving entity
    if ( currentX < targetX ){
        currentX += 0.1f;
    }else if ( currentX > targetX ){
        currentX -= 0.1f;
    }
}