2014-12-19 6 views
0

WASD를 사용하여지도를 이동하는 Libgdx와 함께 타일 기반 게임을하고 있습니다. 나는 scene2d 기능을 사용하여 화면을 그리며 렌더링중인 TiledMap이 잘 보입니다. 그러나 try.getCamera()를 호출하려고하면 translate (float x, float y, float z); 메서드를 사용하여 Gdx.Input.IsKeyPressed() 메서드로 뷰포트를 이동하면 뷰포트가 변환되지 않습니다. "KEY PRESSS"가 콘솔에 출력 되었기 때문에 메서드가 호출되고 있지만 카메라가 변환되지 않습니다. 뷰포트를 이동하는 다른 방법이 있습니까? Stage 클래스에는 카메라를 이동하는 다른 방법이 있습니까?Libgdx : Scene2d 카메라 번역

가 여기에 화면 내 소스입니다 : PlayScreen의 생성자에서

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 메소드에서 새로운 스테이지()를 가졌습니다. 왜냐하면 생성자에서로드 스크린이 화면을 초기화 할 것이고 로딩 스크린이 어떻게 든 스테이지 자체를 차지할 것이기 때문에 스테이지에 넣었을 것입니다. 그것을 보여줄 방법을 보여 주라. 그러나 나는 틀렸고 생성자에서 하나를 꺼내는 것을 잊어 버렸습니다. 그것은 내가 쇼 방법을 너무 세우지 말아야 할 좋은 점이다. 나는 보통 그 물건에 대해 생각한다. 그것이 내가 XP를 깨우지 않기 위해 얻은 것입니다. 대답에 다시 한번 감사드립니다. –

관련 문제