Java LibGDX精灵的移动速度是照相机的两倍
因此,我有一个类,它Java LibGDX精灵的移动速度是照相机的两倍,java,android,libgdx,Java,Android,Libgdx,因此,我有一个类,它扩展了ApplicationAdapter,实现了InputProcessor,并在屏幕上拖动时执行以下操作 @Override public boolean touchDragged(int screenX, int screenY, int pointer) { float x = Gdx.input.getDeltaX(); float y = Gdx.input.getDeltaY(); if (Store.isGameState) {
扩展了ApplicationAdapter,实现了InputProcessor
,并在屏幕上拖动时执行以下操作
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
float x = Gdx.input.getDeltaX();
float y = Gdx.input.getDeltaY();
if (Store.isGameState) {
Store.Entity.player.setxMove(x);
Store.Entity.player.setyMove(-y);
}
return true;
}
在我的player类中,我有一个更新方法,它执行以下操作:
@Override
public void update() {
x += xMove;
y += yMove;
Store.Camera.Camera.position.set(Store.Entity.player.getXPos() + Store.Entity.player.getWidth() / 2, Store.Entity.player.getYPos() + Store.Entity.player.getHeight() / 2, 0);
Store.Camera.Camera.update();
}
package com.imjoshscott.dataria.states;
import com.imjoshscott.dataria.Game;
import com.imjoshscott.dataria.Store;
public class GameState extends State {
public GameState(Game game) {
super(game);
Store.isGameState = true;
Store.Entity.getPlayer(game, Store.Entity.getSprite());
Store.Graphics.getSpriteBatch();
Store.Graphics.getTiledMap();
Store.Graphics.getTiledMapRenderer();
Store.Camera.getCamera();
Store.Camera.getHudCamera();
Store.Camera.Camera.setToOrtho(false, Game.GAME_WIDTH, Game.GAME_HEIGHT);
Store.Camera.HudCamera.setToOrtho(false, Game.GAME_WIDTH, Game.GAME_HEIGHT);
Store.Camera.Camera.viewportHeight = Game.GAME_HEIGHT / 2.5f;
Store.Camera.Camera.viewportWidth = Game.GAME_WIDTH / 2.5f;
}
@Override
public void update() {
Store.Graphics.tiledMapRenderer.setView(Store.Camera.Camera);
Store.Entity.player.update();
}
@Override
public void render() {
Store.Graphics.tiledMapRenderer.render();
Store.Entity.player.render(Store.Graphics.SB);
}
}
以及一种渲染方法,其为:
public void render(SpriteBatch SB) {
SB.begin();
Store.Entity.sprite.setPosition(Store.Entity.player.getXPos(), Store.Entity.player.getYPos());
Store.Entity.sprite.draw(SB);
SB.end();
}
总而言之,相机会像我的精灵一样移动。然而,我的精灵并没有像我的相机一样以同样的速度移动,我一辈子也弄不明白为什么会这样。精灵的移动速度大约是相机的两倍,并且没有以我理想中喜欢的播放器为中心
编辑:
因此,在我的游戏状态中,我有以下几点:
@Override
public void update() {
x += xMove;
y += yMove;
Store.Camera.Camera.position.set(Store.Entity.player.getXPos() + Store.Entity.player.getWidth() / 2, Store.Entity.player.getYPos() + Store.Entity.player.getHeight() / 2, 0);
Store.Camera.Camera.update();
}
package com.imjoshscott.dataria.states;
import com.imjoshscott.dataria.Game;
import com.imjoshscott.dataria.Store;
public class GameState extends State {
public GameState(Game game) {
super(game);
Store.isGameState = true;
Store.Entity.getPlayer(game, Store.Entity.getSprite());
Store.Graphics.getSpriteBatch();
Store.Graphics.getTiledMap();
Store.Graphics.getTiledMapRenderer();
Store.Camera.getCamera();
Store.Camera.getHudCamera();
Store.Camera.Camera.setToOrtho(false, Game.GAME_WIDTH, Game.GAME_HEIGHT);
Store.Camera.HudCamera.setToOrtho(false, Game.GAME_WIDTH, Game.GAME_HEIGHT);
Store.Camera.Camera.viewportHeight = Game.GAME_HEIGHT / 2.5f;
Store.Camera.Camera.viewportWidth = Game.GAME_WIDTH / 2.5f;
}
@Override
public void update() {
Store.Graphics.tiledMapRenderer.setView(Store.Camera.Camera);
Store.Entity.player.update();
}
@Override
public void render() {
Store.Graphics.tiledMapRenderer.render();
Store.Entity.player.render(Store.Graphics.SB);
}
}
商店类中的相机材料:
public static class Camera {
public static OrthographicCamera Camera;
public static OrthographicCamera HudCamera;
public static OrthographicCamera getCamera() {
if(Camera == null)
Camera = new OrthographicCamera();
return Camera;
}
public static OrthographicCamera getHudCamera() {
if(HudCamera == null)
HudCamera = new OrthographicCamera();
return HudCamera;
}
}
编辑:显示更新和渲染方法
public void update() {
moveCreature();
Store.Entity.sprite.setPosition(Store.Entity.player.getXPos(), Store.Entity.player.getYPos());
Store.Camera.Camera.position.set(Store.Entity.player.getXPos(), Store.Entity.player.getYPos(), 0);
Store.Camera.Camera.update();
xMove = 0f;
yMove = 0f;
}
public void render(SpriteBatch SB) {
SB.begin();
Store.Entity.sprite.draw(SB);
SB.end();
}
更新我之前的答案不正确,在查看和检查项目后,我看到了
游戏状态
类的render()
方法(在环顾了几个地方但没有骰子后,如果再次发现这个非常奇怪的问题,我会指向这个)
为了解决这个奇怪的问题,我们需要添加以下代码
Store.Graphics.SB.setProjectionMatrix(Store.Camera.Camera.combined);
所以我们会
public void render() {
Store.Graphics.SB.setProjectionMatrix(Store.Camera.Camera.combined);
Store.Graphics.tiledMapRenderer.render();
Store.Entity.player.render(Store.Graphics.SB);
}
这意味着我们需要将投影矩阵设置为当前活动的
SpriteBatch
,以正确渲染内容。在渲染平铺之前设置它也是安全的,因为它使用与播放器相同的摄影机。您的问题中存在不一致之处。标题说相机的移动速度是播放器的两倍,但在文本中你说精灵的移动速度是相机的两倍?我的错,编辑正确。精灵的移动速度是相机的两倍。您使用的是什么类型的相机?LibGDX的正交相机
您可以在初始化相机的地方添加代码吗?这可能与此有关。非常感谢您的回复,它的工作原理是将播放器摄像头连接到播放器上,不再以不同的速度移动。然而,播放器被卡在屏幕的左下角,并且没有在摄像机内居中。实际上,我们甚至不需要像我提供的代码一样的半视口大小偏移。我测试了代码,它工作正常。你用精灵类来代表玩家吗?你说相机不是你想要的中心,你得到了什么样的效果?是的,我用精灵来渲染玩家的图像。角色精灵位于设备的左下角。@您的原始代码应按预期工作,无需再次偏移视口的一半。如果你使用原始的解决方案,你说它不居中,你能详细说明一下吗?我在问题中提供的初始代码使相机分别移动到精灵上。相机在一定程度上跟随精灵的移动,但精灵的移动速度大约是相机的两倍,并且在某种程度上看起来它们位于不同的层/视差上。