2015-05-27 3 views
1

Итак, я работаю с LiBGDX и Box2D, используя преобразование PixelsPerMeter, и у меня есть камера, которая следует за игроком, но когда я включаю режим отладки, мне нужно иметь возможность нарисовать шрифт с помощью fps на экране, поэтому я всегда вижу его в углу. Проблема в том, что когда я пытаюсь масштабировать BitmapFont, это выглядит нормально, потому что все остальное сокращается из-за Box2D. Я нашел что-то, что говорило об использовании нескольких камер, поэтому мне не нужно масштабировать шрифт вниз, но у него не было никакой документации. Я попытался понять, как это сделать, но не повезло. Как мне нарисовать шрифт на экране?Многочисленные камеры LibGDX

Вот моя игра состояние, в котором я попробовал несколько камер:

package com.platformer.gamestates; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.PerspectiveCamera; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.BitmapFont; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; 
import com.badlogic.gdx.physics.box2d.World; 
import com.platformer.Entities.Player; 
import com.platformer.game.Game; 
import com.platformer.generation.MenuTiles; 
import com.platformer.generation.TiledMaps; 
import com.platformer.managers.GameContacts; 
import com.platformer.managers.GameStateManager; 

import static com.platformer.managers.B2DVars.PPM; 

public class MenuState extends GameState { 

    World world; 
    Box2DDebugRenderer debugRenderer; 

    Texture close, far, house; 

    BitmapFont font; 
    OrthographicCamera fontCam; 

    public static Player player; 
    MenuTiles menuTiles; 

    SpriteBatch batch; 

    float camx,camy; 

    float lerp=0.1f,lerpy=0.2f; 

    GameContacts gameContacts; 


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


    public void init(){ 

     close=new Texture(Gdx.files.internal("menu_backgrounds/background_close.png")); 
     far=new Texture(Gdx.files.internal("menu_backgrounds/background_far.png")); 
     house=new Texture(Gdx.files.internal("menu_backgrounds/house_selected.png")); 

     batch=new SpriteBatch(); 

     font=new BitmapFont(); 

     fontCam=new OrthographicCamera(); 
     fontCam.setToOrtho(false,Game.WIDTH,Game.HEIGHT); 
     fontCam.position.set(Game.WIDTH/2/PPM,Game.HEIGHT/2/PPM,0); 

     world=new World(new Vector2(0,-9.81f),true); 
     world.setVelocityThreshold(0); 
     gameContacts=new GameContacts(); 
     world.setContactListener(gameContacts); 
     debugRenderer=new Box2DDebugRenderer(); 

     player=new Player(world,960/2,49+20); 
     menuTiles=new MenuTiles(world); 

    } 
    public void update(float dt){ 

     world.step(1/60f,6,2); 

     player.update(dt,gameContacts); 

     if(player.shouldPlay){gsm.setState(GameStateManager.PLAY);dispose();} 

     camx+=(player.x-camx)*lerp; 
     camy+=(player.y-camy)*lerpy; 

    } 

    public void draw(OrthographicCamera camera){ 

     camera.position.x=Math.min(Math.max(camx,Game.WIDTH/2/PPM),(MenuTiles.levelWidth/PPM)-(Game.WIDTH/2/PPM)); 
     camera.position.y=Math.min(Math.max(camy,Game.HEIGHT/2/PPM),(MenuTiles.levelHeight/PPM)-(Game.HEIGHT/2/PPM)); 

     batch.begin(); 
     batch.draw(far, 0, 0, 960/PPM, 720/PPM); 
     batch.draw(close,0,0,960/PPM,720/PPM); 
     batch.end(); 

     //draw map 
     menuTiles.draw(camera); 

     batch.begin(); 
     if(gameContacts.isOnHouse())batch.draw(house,192/PPM,48/PPM,2*MenuTiles.tileSize/PPM,2*MenuTiles.tileSize/PPM); 
     batch.end(); 

     //draw player 
     player.draw(batch); 

     if(player.DebugOn){ 
      debugRenderer.render(world, camera.combined); 
      batch.setProjectionMatrix(fontCam.combined); 
      batch.begin(); 
      font.draw(batch,"fps",0,0); 
      batch.end(); 
      System.out.println(Gdx.graphics.getFramesPerSecond()+" fps"); 
     } 

     camera.update(); 
     batch.setProjectionMatrix(camera.combined); 

    } 

    public void handleInput(){} 

    public void dispose(){ 

     menuTiles.dispose(); 
     close.dispose(); 
     far.dispose(); 
     house.dispose(); 

    } 
} 
+0

Может быть http://stackoverflow.com/questions/18345783/multiple-cameras-in-libgdx-probably-similar-in-other-frameworks помогает. – noone

ответ

1

Я не думаю, что вы хотите разделить на ЦБК в этой линии ...

fontCam.position.set(Game.WIDTH/2/PPM,Game.HEIGHT/2/PPM,0); 

Я m, предполагая, что Game.WIDHT и HEIGHT находятся в пикселях (это не ясно из вашего фрагмента кода). Если это не Дэ так, то вы должны включать в себя деление на ЦБК в этой линии ...

fontCam.setToOrtho(false,Game.WIDTH,Game.HEIGHT); 

В настоящее время он не применяется последовательно.

Кроме того, вам необходимо вызвать fontcam.update() после установки его положения.

Дополнительно: Это не относится к вашему вопросу как таковому, но я не уверен, почему у вас есть следующие строки в конце рендеринга. Я бы разместил их сразу после того, как изменил положение стандартной камеры.

camera.update(); 
batch.setProjectionMatrix(camera.combined); 
+0

Да, ШИРИНА и ВЫСОТА находятся в пикселях. Я применил это изменение, но шрифт не рисуется. –

+0

Вы должны обновить fontcam после установки его положения. Это помогает? –

+0

Да, теперь все хорошо. :) –