我正在使用Libgdx开发基于磁贴的游戏,使用WASD移动地图。我正在使用scene2d功能绘制屏幕,我正在渲染的TiledMap显示得很好。但是当我尝试调用stage.getCamera()。translate(float x,float y,float z);使用Gdx.Input.IsKeyPressed()方法移动视口的方法,视口不会翻译。该方法被调用,因为“KEY PRESSS”正在输出到控制台上,但摄像机没有进行翻译。还有另一种移动视口的方法吗? Stage类是否有其他方法来移动相机?
这是我的屏幕来源:
package com.BurntToast.SolidDiamond;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TmxMapLoader;
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Pool;
import com.badlogic.gdx.utils.viewport.FitViewport;
public class PlayScreen implements Screen {
private MainFrame mainFrame;
private OrthographicCamera camera;
private Vector3 touchCoord;
private TiledMap currentMap;
private OrthogonalTiledMapRenderer otmr;
private ConveyorActor convActor;
private Stage mapStage;
public PlayScreen(MainFrame passedGame){
mainFrame = passedGame;
convActor = new ConveyorActor(mainFrame.conveyorFrames, 1, 0, 0);
mapStage = new Stage();
mapStage.addActor(convActor);
currentMap = new TmxMapLoader().load("maps/MenuMap2.tmx");
otmr = new OrthogonalTiledMapRenderer(currentMap);
otmr.setView((OrthographicCamera)mapStage.getCamera());
}
@Override
public void render(float delta) {
// TODO Auto-generated method stub
//ERIC (erase, redraw, input, calculate)
//ERASE
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
//camera.update();
//REDRAW
otmr.render();
mapStage.draw();
//INPUT/CALCULATE
mapStage.act();
if(Gdx.input.isTouched()){
}//end if touched
//MAP TRANSLATION INPUT HERE:
if(Gdx.input.isKeyPressed(Keys.W)){
//heres the line of code but it won't translate.
mapStage.getCamera().translate(0, 10, 0);
mapStage.getCamera().update();
System.out.println("KEY PRESSS");
}
if(Gdx.input.isKeyPressed(Keys.A)){
mapStage.getCamera().translate(-10, 0, 0);
mapStage.getCamera().update();
}
if(Gdx.input.isKeyPressed(Keys.S)){
mapStage.getCamera().translate(0, -10, 0);
mapStage.getCamera().update();
}
if(Gdx.input.isKeyPressed(Keys.D)){
mapStage.getCamera().translate(10, 0, 0);
mapStage.getCamera().update();
}
}
@Override
public void resize(int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void show() {
// TODO Auto-generated method stub
mapStage = new Stage(new FitViewport(mainFrame.SCREEN_WIDTH, mainFrame.SCREEN_HEIGHT));
}
@Override
public void hide() {
// TODO Auto-generated method stub
}
@Override
public void pause() {
// TODO Auto-generated method stub
}
@Override
public void resume() {
// TODO Auto-generated method stub
}
@Override
public void dispose() {
// TODO Auto-generated method stub
currentMap.dispose();
}
答案 0 :(得分:1)
在PlayScreen的构造函数中,您创建一个mapStage
,它将拥有自己的视口和摄像头。然后将该相机提供给平铺地图渲染器。
但是在show()
中,您创建了一个新的mapStage
,它将替换在构造函数中创建的引用。因此,当您在render()
中更换相机时,它是来自新舞台的相机,而不是平铺地图渲染器仍在使用的旧相机。
您仍然希望避免在new Stage(...)
方法中使用show
,因为每次屏幕更改时您都会创建一个新的舞台,这会浪费时间创建一个新的sprite批处理(每次占用大量内存并编译着色器)。你每次更换的旧舞台都会泄漏,因为它在参考丢失之前没有dispose()
调用它。
我不确定您的约束,但一种解决方案是修改您的show
方法:
public void show() {
mapStage.setViewport(new FitViewport(mainFrame.SCREEN_WIDTH, mainFrame.SCREEN_HEIGHT));
otmr.setView((OrthographicCamera)mapStage.getCamera());
}
其他一些事情......
你应该在dispose()
处理你的舞台,以避免潜在的泄漏(如果你没有,当屏幕改变时,舞台上的精灵批次会泄漏着色器)。并且您的相机移动应始终涉及乘以delta
,因此移动速度与帧速率无关。