2013-11-27 112 views
2

此問題已發佈之前,但我有問題閃爍在libGdx的精靈。 我看着無處不在,stackoverflow,谷歌等,但沒有任何幫助。LibGDX桌面閃爍

精靈只在移動時才閃爍。當我將它們移動得慢時,它會減少閃爍,但當速度稍快時會閃爍很多。這非常煩人,而且當然無法播放。

這是我的代碼:

package com.wouter.DuelArena; 

import com.badlogic.gdx.Game; 
import ... 

public class DuelArena extends Game { 

Sprite player; 
float playerX; 
float playerY; 

boolean fireBool; 
Sprite fireSprite; 
Texture fireText; 

OrthographicCamera cam; 

Texture playerTexture; 
SpriteBatch batch; 

@Override 
public void create() {  
    fireBool = false; 
    fireText = new Texture("data/droplet.png"); 
    fireText.setFilter(TextureFilter.Linear, TextureFilter.Linear); 
    fireSprite = new Sprite(fireText); 

    playerTexture = new Texture("data/bucket.png"); 
    playerTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); 

    player = new Sprite(playerTexture);  
    player.setSize(70, 128); 
    playerX = 0f; 
    playerY = 0f; 

    cam = new OrthographicCamera(); 
    cam.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

    batch = new SpriteBatch(); 
} 

@Override 
public void dispose() { 
    super.dispose(); 
} 

@Override 
public void render() {  

    Gdx.gl.glClearColor(1, 1, 1, 1); 
    Gdx.gl.glClear(Gdx.gl10.GL_COLOR_BUFFER_BIT); 

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

    batch.begin(); 


    player.draw(batch); 
    input(); 
    update(); 

    batch.end(); 

    super.render(); 
} 
private void update() 
{ 
    player.setPosition(playerX, playerY); 

    if (fireBool) 
    { 
     fireSprite.setX(fireSprite.getX() + 300 * Gdx.graphics.getDeltaTime()); 
     fireSprite.draw(batch); 

     if (fireSprite.getX() > 1280) 
      fireBool = false; 
    } 
} 
private void input() 
{ 
    if (Gdx.input.isKeyPressed(Keys.LEFT) && player.getX() > 0) 
    { 
     playerX -= 200f * Gdx.graphics.getDeltaTime(); 

    } 
    if (Gdx.input.isKeyPressed(Keys.RIGHT) && player.getX() < 1280) 
    { 
     playerX += 200f * Gdx.graphics.getDeltaTime(); 
    } 
    if (Gdx.input.isKeyPressed(Keys.SPACE) && !fireBool) 
    { 
     fireBool = true; 
     fireSprite.setPosition(playerX, playerY + 35f * Gdx.graphics.getDeltaTime()); 
    } 
} 

@Override 
public void resize(int width, int height) { 
    super.resize(width, height); 
} 

@Override 
public void pause() { 
    super.pause(); 
} 

@Override 
public void resume() { 
    super.resume(); 
} 

}

感謝事先!

+1

我不確定它可能會導致這種情況,但是您應該刪除'super.render();' – noone

+0

真的嗎?謝謝你的回覆,明天我會試試;) –

+0

但你最可能是對的!我在一篇教程中讀到不能刪除super.render,但那是我們的渲染函數爲空的時候!所以我做的是雙重渲染,這意味着我的屏幕被清除兩次!非常感謝!你讓我今天一整天都感覺很好 :) –

回答

2

的問題是調用到super.render位置:

super.render(); 

Game類中,super.render需要在代碼中的第一行,而不是最後,像這樣:

@Override 
public void render(){ 
    super.render(); //<----- 

    Gdx.gl.glClearColor(1, 1, 1, 1); 
    Gdx.gl.glClear(Gdx.gl10.GL_COLOR_BUFFER_BIT); 
    cam.update(); 
    batch.setProjectionMatrix(cam.combined); 

    batch.begin(); 
    player.draw(batch); 
    input(); 
    update(); 
    batch.end(); 
} 

它實際上是非常重要的把它放在那裏,如果你重寫遊戲渲染的方法,因爲這就是調用呈現當前Screen之一。在這個例子中你沒有使用屏幕,但是如果你使用的是Game,你可能應該(will:p)。