2017-04-13 6 views
0

뷰포트를 스테이지로 설정하려고 할 때마다 장면에 넣는 액터는 blured하고 매우 커집니다. 내 게임 세계 크기를 50x100 단위의 사각형으로 설정 한 다음 해당 단위에 따라 모든 항목 (스프라이트, 액터, 레이블, 글꼴)을 조정하려고합니다. 모든 상태 등LibGdx 뷰포트 이해 및 Scene2D와의 결합

public abstract class State { 
    public static final float GAME_SIZE_WIDTH = 50 ; 
    public static final float GAME_SIZE_HEIGHT = 100 ; 
    protected OrthographicCamera camera; 

    protected GameStateManager gsm; 
    protected Viewport viewport; 

    public State(GameStateManager gsm) { 
     this.gsm = gsm; 
     camera = new OrthographicCamera(); 
     viewport = new ExtendViewport(GAME_SIZE_WIDTH, GAME_SIZE_HEIGHT, camera); 
     viewport.apply(); 
     camera.position.set(GAME_SIZE_WIDTH/2, GAME_SIZE_HEIGHT/2, 0); 
    } 

    public abstract void handleInput(); 
    public abstract void update(float dt); 
    public abstract void render (SpriteBatch sb); 
    public abstract void dispose(); 
    public abstract void resize(int width, int height) ; 
    } 
나는 GAME_SIZE_WIDTH /GAME_SIZE_HEIGHT 차원을 유지하기 위해 Stage을 추가하고 내 주 클래스있어서의 viewPort을 전달하려는 모든 State에서

하지만, 필자가 조정되지 않은 배경을 가지고 (기능을 렌더링 제공하는 클래스 상태를 형성 inharitate 그것의 풀 HD 그림 왼쪽에 흰색 테두리) 및 버튼 조정되지 않은 텍스트와 함께 blured 경우에도.

public class MenuState extends State implements InputProcessor { 

private Skin skin; 
private Stage stage; 

private Sprite background; 
private Table table; 
private TextButton startButton,quitButton; 
private Sprite flappyButton; 
private Sprite chodzenieButton; 
private Sprite memoryButton; 
private Sprite rememberSquare; 
private static final String TAG = "kamil"; 
private Vector3 touchPoint; 

public MenuState(GameStateManager gsm) { 
    super(gsm); 

    skin = new Skin(Gdx.files.internal("button/uiskin.json")); 
    stage = new Stage(viewport); 
    table = new Table(); 
    table.setWidth(stage.getWidth()); 
    table.align(Align.center | Align.top); 

    table.setPosition(0,GAME_SIZE_HEIGHT); 
    startButton = new TextButton("New Game",skin); 
    quitButton = new TextButton("Quit Game",skin); 
    startButton.addListener(new ClickListener() { 
     @Override 
     public void clicked(InputEvent event, float x, float y) { 
      Gdx.app.log("Clicked button","Yep, you did"); 
      event.stop(); 
     } 
    }); 

    table.padTop(5); 
    table.add(startButton).padBottom(5).size(20,10); 
    table.row(); 
    table.add(quitButton).size(20,10); 

    stage.addActor(table); 

    background =new Sprite(new Texture(Gdx.files.internal("backgrounds/bg.jpg"))); 
    background.setSize(GAME_SIZE_WIDTH,GAME_SIZE_HEIGHT); 
    background.setPosition(0,0); 
    touchPoint= new Vector3(); 

    InputMultiplexer im = new InputMultiplexer(stage,this); 
    Gdx.input.setInputProcessor(im); 
    flappyButton=new Sprite(new Texture("menuButton/floopyBirdButtonTexture.png")); 
    chodzenieButton =new Sprite(new Texture("menuButton/swipeMovementsButtonTexture.png")); 
    memoryButton =new Sprite(new Texture("menuButton/memory.png")); 
    rememberSquare = new Sprite(new Texture("menuButton/rememberSquare.png")); 
    rememberSquare.setSize(20,10); 
    flappyButton.setSize(20,10); 
    chodzenieButton.setSize(20,10); 
    memoryButton.setSize(20,10); 
    flappyButton.setPosition(GAME_SIZE_WIDTH/2-flappyButton.getWidth()/2,GAME_SIZE_HEIGHT/2-flappyButton.getHeight()/2); 
    chodzenieButton.setPosition(GAME_SIZE_WIDTH/2-flappyButton.getWidth()/2,flappyButton.getY()- chodzenieButton.getHeight() -2); 
    memoryButton.setPosition(chodzenieButton.getX(),chodzenieButton.getY()- flappyButton.getHeight() -2); 
    rememberSquare.setPosition(flappyButton.getX(),flappyButton.getY()+flappyButton.getHeight()+2); 
} 



@Override 
public void render(SpriteBatch sb) { 
    sb.setProjectionMatrix(camera.combined); 
    sb.begin(); 
    background.draw(sb); 
    flappyButton.draw(sb); 
    chodzenieButton.draw(sb); 
    memoryButton.draw(sb); 
    rememberSquare.draw(sb); 
    sb.end(); 
    stage.act(Gdx.graphics.getDeltaTime()); 
    stage.draw(); 
} 

@Override 
public void dispose() { 
    flappyButton.getTexture().dispose(); 
    chodzenieButton.getTexture().dispose(); 
    background.getTexture().dispose(); 
} 

@Override 
public void resize(int width, int height) { 
    Gdx.app.log("kamil","Resize"); 

    viewport.update(width,height); 
} 
@Override 
public void handleInput() { 
    if(Gdx.input.justTouched()) 
    { 
     // 

    viewport.unproject(touchPoint.set(Gdx.input.getX(),Gdx.input.getY(),0)); 
    if(flappyButton.getBoundingRectangle().contains(touchPoint.x,touchPoint.y)) { 
     gsm.set(new FlopyBirdState(gsm)); 
    } 
     else if (chodzenieButton.getBoundingRectangle().contains(touchPoint.x,touchPoint.y)){ 
     gsm.set(new ChodzenieState(gsm)); 
    } 
    else if (memoryButton.getBoundingRectangle().contains(touchPoint.x,touchPoint.y)){ 
     gsm.set(new MemoryState(gsm)); 
    } 
    else if (rememberSquare.getBoundingRectangle().contains(touchPoint.x,touchPoint.y)){ 
     gsm.set(new FoodEaterState(gsm)); 
    }} 
} 

enter image description here

enter image description here

답변

1

Blured 등 매우 큰 : 이것은 당신이 사용하고있는 글꼴 크기 때문이다.

일부 글꼴이 적절한 방식으로 확장되었을 때 Blured가 영향을 미치지 않습니다. 이는 사용자 또는 뷰포트가 상관 없습니다.

세계 너비와 뷰포트의 높이를 50과 100으로 사용하고 있고, 50과 100에 비해 크기가 큰 스킨의 BitmapFont를 사용하고 있습니다. 따라서 화면 너비와 높이별로 뷰포트를 업데이트하면 BitmapFont 규모가 커지므로 너무 커 보이고 흐리게 보입니다.

솔루션 :

  1. 당신이 사용하고있는 당신의 BitmapFont를 비교하여 뷰포트의 일부 큰 세계의 폭과 높이를 사용합니다.

  2. 작은 크기의 BitmapFont를 사용하거나 크기를 조절하여 너무 크게하지 않고보기 흉한 수 있습니다. 당신이 Table을 사용하고

    skin.get("font-name",BitmapFont.class).getData().setScale(.25f); 
    

그래서 당신은 당신의 배우 셀/표입니다 확인해야 할 수도 있습니다. 이 플래그가 디버깅을 활성화 할 수 있습니다 stage.setDebugAll(true);

을 편집 ExtendViewport 가 한 방향으로 세계를 확장하여 세계 화면 비율 블랙 바없이 유지 wiki

에서 당신은 ExtendViewport을 사용하고

, . 뷰포트 내에 세계가 먼저 축척 된 다음 짧은 치수가 길어 져 뷰포트를 채 웁니다.

장치 너비와 높이가 400 및 640이라고 가정 해 봅시다. 뷰포트를 400 및 640으로 업데이트하면 어떤 일이 발생합니까? 먼저 뷰포트 월드 높이가 높이와 같고 높이가 640으로 조정 된 배경 스프라이트를 배경 높이) 완료, 이제는 배경 너비에 대한 시간이야 너비가 너비의 절반이므로 크기를 조정하고 크기를 640/2 = 320으로 설정했기 때문에 스프라이트가 완료 됨

내 장치 너비는 400이지만 내 배경 스프라이트 크기는 320 나머지 (40 * 2 단위는 양쪽에서 백색이다)이다.

사용 48 * 80 (장치의 대부분은이 비율에) 대신 50 * 100

+0

좋아요 당신의 힌트를 주셔서 감사합니다,하지만 어떻게 내 게임 화면의 왼쪽과 오른쪽의 배경 마진 (흰색에 대한 하나)? 내가 사용하는 그림의 해상도가 어떻든, 나는 항상 화면의 왼쪽과 오른쪽 마진을 얻는다. 내 배경 이미지 크기가 (GAMZE_SIZE_WIDTH, GAME_SIZE_HEIGHT)에 의해 설정되어 있으므로 왜 화면이 작은 화면보다 작은 지 이해할 수 없습니다. – Expiredmind

+0

내 업데이트 된 답변 확인 – Aryan

+0

마침내이 사실을 이해합니다.이 모든 고통은 세계에서 말하는 하나의 지침서가되었습니다. 감사합니다. – Expiredmind