害怕重新发明轮子,我想知道:
使用 libGDX 在自上而下 Tiled (2D)地图上实现基于平滑网格的游戏角色移动的最佳方法是什么?
只要按下箭头键(或者在角色的某个方向上发生触摸事件),角色就应该在瓷砖之间保持平滑移动,并且应该完成限制在按键/触摸释放上的网格位置。移动应独立于帧速率。
我很高兴已经实现的一些示例可以研究并导致正确的libGDX API使用。
答案 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;
}
}