2013-10-18 79 views
1

我開始在LibGDX中編寫遊戲,僅僅是開始。我已經加載了一個基本的瓷磚地圖,一個玩家精靈,並且可以移動角色並且屏幕(相機)滾動 - 完美。LibGDX And​​roid遊戲 - 在滾動屏幕上顯示固定文本(即分數)

我在屏幕右下角有一個左右兩個覆蓋的紋理,左右箭頭用作控制角色的遊戲手柄。我將這些與玩家位置相關聯,這些位置始終固定在屏幕中央。目前很酷....如下:

///////////////////////////////////////////////////////////////// 
private void renderJoypad(float deltaTime) 
{ 
    batch.draw(Assets.leftJoypad, blockman.position.x-14, 1, 3, 3); 
    batch.draw(Assets.rightJoypad, blockman.position.x-9, 1, 3, 3); 
} 

我現在試圖把玩家的分數放在屏幕的左上角。得分由Bitmap字體組成,如下所示。

font = new BitmapFont(Gdx.files.internal("fonts/minecrafter.fnt"),Gdx.files.internal("fonts/minecrafter.png"),false); 
    font.setScale(0.02f); 

在我的render()方法我CAM調用一些其他的方法來更新,像 leftJoypad等的位置,如renderJoypad()。我也打電話給我的繪製字體方法來更新分數的位置,但是,當我滾動它時,它全是生澀的,有時它顯示的字符少於應該有的字符。

public void drawScore(float deltaTime) 
{ 
    font.draw(batch, "00000", blockman.position.x, 10); 
} 

我相信,我需要把比分(以及任何其他屏幕上的文字,HUD等)到一個階段,但我不知道如何得到它與我現有的代碼工作。

我的表演方法如下:

public void show() 
{ 
    //load assets class to get images etc 
    Assets Assets = new Assets(); 

    //start logging Framerate 
    Gdx.app.log(GameScreen.LOG, "Creating game"); 
    fpsLogger = new FPSLogger(); 

    //set the stage - bazinga 

    Gdx.input.setInputProcessor(stage); 

    //stage.setCamera(camera); 
    //stage.setViewport(480, 360, false); 

    batch = new SpriteBatch(); 

    //load the Joypad buttons 
    loadJoypad(); 

    //background image 
    loadBackground(); 

    //sounds 
    jumpSound = Gdx.audio.newSound(Gdx.files.internal("sounds/slime_jump.mp3")); 
    //LOAD block man here 

    // load the map, set the unit scale to 1/16 (1 unit == 16 pixels) 
    loadMap(); 

    //draw the score 
    font = new BitmapFont(Gdx.files.internal("fonts/minecrafter.fnt"),Gdx.files.internal("fonts/minecrafter.png"),false); 
    font.setScale(0.02f); 


    // create an orthographic camera, shows us 30x20 units of the world 
    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, 30, 20); 
    camera.update(); 

    // create the Blockman we want to move around the world 
    blockman = new Blockman(); 
    blockman.position.set(25, 8); 
} 

和我的渲染()方法如下:

public void render(float delta) 
{ 
    // get the delta time 
    float deltaTime = Gdx.graphics.getDeltaTime(); 

    stage.act(deltaTime); 
    stage.draw(); 

    // clear the screen 
    Gdx.gl.glClearColor(0.3f, 0.3f, 0.3f, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    renderBackground(deltaTime); 

    batch = renderer.getSpriteBatch(); 

    //updateBlockman(deltaTime); 
    blockman.update(deltaTime); 

    // let the camera follow the blockMan, x-axis only 
    camera.position.x = blockman.position.x; 
    camera.update(); 

    // set the tile map rendere view based on what the 
    // camera sees and render the map 
    renderer.setView(camera); 
    renderer.render(); 

    //start the main sprite batch 
    batch.begin(); 


     // render the blockMan 
     renderBlockman(deltaTime); 
     renderJoypad(deltaTime); 
     drawScore(deltaTime); 

    batch.end(); 
    fpsLogger.log(); 

} 

我試圖改變的事情,用相對於Spritebatch等工作方式並且似乎無法按照我的要求工作。

任何人都可以建議我怎樣才能獲得舞臺和演員的工作,或第二個相機或東西,以幫助我在角落實現固定的比分顯示。

我是否需要使用場景2D或其他內容 - aahhh!我的頭正在爆炸....

我期待着,並提前謝謝你。

問候

詹姆斯

回答

5

我有幾個建議:

  1. 檢查,以查看是否有setUseIntegerPositions設置爲true (默認值)當你畫你的字體。如果你這樣做,並且你縮放 它,那麼它可能會導致一些奇怪的效果,類似於你描述的效果。將其設置爲false,看看它是否解決了問題。

  2. 在繪製文本之前重置您的spritebatch的矩陣,這樣您就不需要爲滾動而調整它。

我甚至會推薦不縮放字體,如果你可以幫助它,因爲字體經過縮放後通常看起來有點奇怪。

+0

哇,謝謝你。我將它設置爲font.setUseIntegerPositions(false);正如你所建議的那樣,它完美運作。我無法相信。你是否知道它在設置爲真時的實際情況,導致它出錯 - 只是爲了進一步理解。我非常感謝,非常感謝。 James –

+0

當它設置爲true時,它強制字體被繪製爲整數座標。如果你正在繪製像素,這很好,但是如果你的視口縮放到30x20那麼結果可能會有點奇怪。 –

+0

發揮得很好。我一天都沒有看到任何東西。 setuseIntegerPositions至少起作用:我的世界比例爲0-3,這使得字體非常難看...... – RichieHH

相關問題