有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaLibGDX:如何实现基于平铺/网格的平滑游戏角色移动?

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

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

只要按下箭头键(或在角色的特定方向上发生触摸事件),角色就应在平铺之间平稳移动,并应在按键/触摸释放时限制在网格位置完成。移动应独立于帧速率

我很高兴看到一些已经实现的示例,这些示例可以被研究并引导libgdxapi的正确使用


共 (2) 个答案

  1. # 1 楼答案

    这只适用于一个维度,但我希望你能理解,通过检查方向键并加/减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;
        }
    }
    
  2. # 2 楼答案

    测试是否按下(或触摸屏幕)特定按钮,如果按下,则在一个场地中设置正确的目标磁贴(玩家将去的磁贴)并开始移动,该移动仅在玩家进入下一个磁贴时结束。发生这种情况时,再次检查输入以保持移动(即重复)

    假设您的瓷砖宽度/高度为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;
        }
    }
    

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

    编辑:

    键的输入轮询:

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

    InputPolling for touchs(cam是您的相机,touchPoint是一个矢量,用于存储未投影的触摸坐标,moverightBounds是一个(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已经说过了,你可以在render方法中获得delta作为参数,或者你可以在其他任何地方使用:

    Gdx.graphics.getDeltatime();
    

    参考资料: