Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libGDX:如何实现基于平铺/网格的游戏角色平滑移动?_Java_Android_Windows_Libgdx_Tiled - Fatal编程技术网

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

Java libGDX:如何实现基于平铺/网格的游戏角色平滑移动?,java,android,windows,libgdx,tiled,Java,Android,Windows,Libgdx,Tiled,由于害怕重新发明轮子,我想知道: 使用libGDX在自顶向下的平铺(2D)地图上实现基于网格的游戏角色平滑移动的最佳方法是什么 只要按下箭头键(或在角色的特定方向上发生触摸事件),角色就应在平铺之间平稳移动,并应在按键/触摸释放时限制在网格位置完成。移动应独立于帧速率 我很高兴看到一些已经实现的示例,这些示例可以被研究并导致libGDX API的正确使用。测试是否按下了某个特定按钮(或触摸了屏幕),如果是,则在某个字段中设置正确的目标磁贴(播放器将要去的磁贴),并开始移动,此移动仅在玩家进入下一

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

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

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


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

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

假设您的瓷砖宽度/高度为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 touch(cam是您的相机,touchPoint是一个矢量,用于存储未投影的触摸坐标,moverightBounds是一个(libgdx)矩形):

如前所述,您可以在render方法中获取delta作为参数,也可以使用以下方法在其他任何地方获取它:

Gdx.graphics.getDeltatime();
参考资料:


这只适用于一维,但我希望您能理解,通过检查方向键并加/减1,然后将其转换为整数(或地板),将获得下一个瓷砖。如果释放该键,您仍然有一个未到达的目标,实体将继续移动,直到到达目标磁贴。我想它会像这样:

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;
    }
}
void update()(
//获取目标磁贴
如果(按下向右箭头){
targetX=(int)(currentX+1);//强制转换为int以保持
//目标指向下一个磁贴
}else if(按左箭头键){
targetX=(int)(当前x-1);
}
//更新移动实体
如果(当前x<目标x){
电流X+=0.1f;
}否则如果(当前X>目标X){
电流X-=0.1f;
}
}

谢谢您的帮助。您能再解释一下从哪里调用该代码以及如何进行输入轮询吗?此外,我不确定如何根据不断变化的帧速率计算
增量。@JensPiegsa您可以通过LibGDX获得增量作为render()中的参数方法。否则,您可以通过Gdx.graphics.getDeltaTime()获得它。编辑我的答案:)您可以在渲染方法中调用它(每帧),再次感谢您提供的重要提示,这些提示实际上导致了一个有效的解决方案。这正是我数小时前回答的。。。这使用了一个固定的步骤,而不是使用帧之间传递的时间来实现帧无关的移动。抱歉,当我发布我的回复时,我看不到你的答案。我写了一篇关于平滑的基于瓷砖的移动的文章,希望能有所帮助
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;
    }
}