Libgdx:翻译Scene2d相机

时间:2014-12-19 06:27:22

标签: java libgdx scene2d

我正在使用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();
    }

1 个答案:

答案 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,因此移动速度与帧速率无关。