2014-11-08 52 views
0

我有一個精靈,我與相機一起在世界上前進。他們都以相同的速度移動。但是,我看到移動精靈的輕微抖動。考慮到我爲相機和精靈添加了相同的Y值,這應該是可能的嗎?相機和精靈以相似的速度移動,但出現JITTER

(注:對於子畫面的過濾器被設置爲LINEAR)

public void AdvanceWorld(){ 
    float delta = Gdx.graphics.getDeltaTime();  
    float delta_64_srsz = delta * 64f; 
    float velo = spaces.world_velocity * delta_64_srsz; 
    spaces.spaceshipAdvance(velo);  
    camera.position.y += velo; 
} 

@Override 
public void render(float delta) { 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 
    AdvanceWorld(); 
    ... 
    batch.begin();  
    .... 
      batch.end(); 
      ... 
    camera.update();  
    batch.setProjectionMatrix(camera.combined);  
} 

public void spaceshipAdvance(float velocity){ 
    sprite.setPosition(sprite.getX(), sprite.getY() + velocity); 
    thrusters.setPosition(thrusters.getX(), thrusters.getY() + velocity); 
} 

然而,幀率穩定後周圍60fps的抖動衰減和僅稍微明顯。只有當FPS有變化時纔會引起注意。另外,如果我降低速度(delta_64_srsz = delta * 16f),則抖動消失。看來,我正在使用的速度很大,導致了這一點。我可以將相機與精靈同步,這樣我就可以使用高速而沒有抖動嗎?

+0

高速度與增量時間相乘導致由於增量時間波動在一定程度上的輕微變化。如果這是一款手機遊戲,最好*不要*用增量時間動畫角色,而是假設fps始終爲60,然後確保它永遠不會因爲您在代碼中繪製或做的事情而下降。但如果是這樣,最糟糕的情況是遊戲會在很短的時間內放慢速度。 – LearnCocos2D 2014-11-08 09:26:40

+0

謝謝!我想我會停止使用delta,如果我在完成遊戲後獲得了恆定的60FPS,並將所有紋理都放入一個或兩個地圖集中。現在雖然我會把速度降到32f而不是64f。抖動很好地減少了。 – gogonapel 2014-11-08 09:30:19

+0

爲什麼你在渲染你的世界之後更新相機並設置投影矩陣? – Xoppa 2014-11-08 15:20:22

回答

2

您應該避免自己移動相機,而是讓相機跟隨精靈。

這是可以實現如下:

首先做出OrthographicCamera這樣的:

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

接下來你render()方法更新與精靈xy位置這樣的cam位置:

cam.position.set(sprite.getX(), sprite.getY(), 0);

這之後,你應該投影矩陣設置爲cam.combined這樣的:

batch.setProjectionMatrix(cam.combined);

最後更新相機:

cam.update();

你應該把這些過去三個步驟一起在render()這樣的方法:

public void render(float delta){ 
    // other stuff ... 
    cam.position.set(sprite.getX(), sprite.getY(), 0); 
    cam.update(); 
    batch.setProjectionMatrix(cam.combined); 
    // other stuff ... 
} 
0

如何用米而不是像素?不使用像素總是很好的做法。

+0

這是因爲我刪除了包含** delta * 64 **的代碼,這些代碼每次都會計算出來,所以我將其保存在變量中。上面的代碼沒有幫助,但謝謝! – gogonapel 2014-11-08 08:36:21