由于害怕重新发明轮子,我想知道:
使用libGDX在自上而下的平铺(2D)地图上实现基于平滑网格的游戏角色移动的最佳方法是什么?
只要按下箭头键(或在角色的某个方向上发生触摸事件),角色就应该在图块之间保持平滑移动,并且应该在键/触摸释放时完成限制在网格位置。运动应该独立于帧速率。
我会很高兴一些已经实现的示例可以研究并导致正确的 libGDX API 使用。
测试是否按下了特定的按钮(或触摸了屏幕),如果是,则将正确的目标图块(玩家将要去的图块)设置在一个字段中并开始移动到那里,这个移动只会在玩家进入时结束下一个瓷砖。发生这种情况时,再次检查输入以继续移动(即重复)。
假设,您的瓦片宽度/高度为 1,并且您希望每秒移动 1 个瓦片。您的用户按下了右箭头键。然后,您只需将 targettile 设置为播放器右侧的图块。
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 是一个 Vector3 来存储未投影的触摸坐标,moverightBounds 是一个 (libgdx) Rectangle):
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
}
}
没有人说过,您可以在render方法中将 delta 作为参数,或者您可以在其他任何地方使用:
Gdx.graphics.getDeltatime();
参考:
这仅适用于一个维度,但我希望您明白这一点,通过检查方向键并加/减 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;
}
}