2014-12-19 72 views
0

我正在与Libgdx一起使用WASD移动地图的基于图块的游戏。我使用scene2d功能来绘制屏幕,​​并且我正在渲染的TiledMap显示得很好。但是当我尝试并调用stage.getCamera()。translate(float x,float y,float z);方法用Gdx.Input.IsKeyPressed()方法移动视口时,视口不会转换。该方法正在调用中,因为“KEY PRESSS”正在输出到控制台上,但摄像机未翻译。有另一种移动视口的方法吗? Stage课程是否有其他方法来移动相机?Libgdx:翻译Scene2d摄像机

这里是我的屏幕来源:

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

在播放屏幕的构造函数,创建一个mapStage这将有自己的视窗和相机。然后你将相机放到平铺的地图渲染器上。

但是在show()中,您将创建一个新的mapStage,它将替换在构造函数中创建的引用。因此,当您在render()中更换相机时,它是来自新舞台的相机,而不是平铺地图渲染器仍在使用的旧相机。

你要避免在show方法使用new Stage(...)反正,因为这样你会每次创建一个新的舞台画面的变化,这会浪费时间创建一个新的精灵一批(这会占用大量的内存和每次编译着色器)。而且每次更换的旧阶段都会泄漏,因为它没有在其参考文献丢失之前调用dispose()

我不知道你的约束,但一个解决办法是你show法修订本:

public void show() { 
    mapStage.setViewport(new FitViewport(mainFrame.SCREEN_WIDTH, mainFrame.SCREEN_HEIGHT)); 
    otmr.setView((OrthographicCamera)mapStage.getCamera()); 
} 

一对夫妇的其他东西...... 你应该dispose()处置您的舞台以避免潜在的泄漏(当屏幕出现变化时,舞台上的精灵批处理会泄漏着色器)。而且你的相机移动总是需要乘以delta,所以移动速度与帧率无关。

+0

我在show方法中使用了新的Stage(),因为当我在构造函数中使用它时,加载屏幕会初始化屏幕,并且我认为加载屏幕以某种方式将舞台置于其自身上,所以我将它放入显示方法,所以它不会。但事实证明我错了,然后忘记拿出构造函数中的那个。这是关于我不应该如何放置演出方法的一个好点。我通常会考虑那些东西。这就是我没有休息一下XP的原因。再次感谢您的答复。 – 2014-12-19 19:30:13