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