2017-06-10 38 views
3

我正在爲libGDX開發Android版手機遊戲。我注意到當我點擊主頁按鈕然後回到遊戲時,玩家已經消失了。所有其他演員都附在舞臺上,當我移除移動播放器的代碼時,它也會被繪製。它只在移動時消失。我已經做了很多調試,有時候這個位置似乎會更新一些,但玩家是看不見的,但有時它只是NaN。例如,我曾嘗試在暫停功能中保存位置和速度,並向玩家提供恢復功能,但沒有任何幫助。libGDX在點擊主頁按鈕時紋理消失

這是我在播放器更新功能正在做的:

// When these lines are removed, the app works perfectly 
velocity.add(0.0f, GRAVITY); 
velocity.scl(deltaTime); 
position.add(velocity); 
velocity.scl(1/deltaTime); 

,它甚至沒有幫助,如果我重新創建恢復功能的播放器

player2 = new Player(resourceManager.getRegion("player"), new Vector2(320.0f, 350.0f), 300.0f); 

最後我試着創建完全不同的播放器對象,該對象在單擊主頁按鈕後繪製。這是可見的,但不動:

player2 = new Player(resourceManager.getRegion("player"), new Vector2(320.0f, 350.0f), 300.0f); 

回答

2

Intrestingly夠我今天用同樣的問題處理,質地每次(演員)保持在屏幕的簡歷後,但不是主要演員這是誰在動的一個(主要演員在我的情況)。經過幾個小時調試運行,我發現,當暫停之間的博弈狀態變化,並恢復渲染方式(礦井),這樣,會得到0的DeltaTime:

@Override public void render(float deltaTime) { 
     update(delta); 
     spriteBatch.setProjectionMatrix(cam.combined); 
     spriteBatch.begin(); 
     spriteBatch.draw(background, cam.position.x - (WIDTH/2), 0, WIDTH, HEIGHT); 
.... 
    spriteBatch.end();} 

的DeltaTime是時候從上渲染經過。 顯然沒有從暫停經過時間恢復,因此0 下來的演員更新的鏈條,我更新我的主要演員像這樣

velocity.scl(deltaTime); 
position.add(MOVEMENT * deltaTime, velocity.y); 

這是在第二天通過0簡歷因此NaN的渲染後(不是數字)。

反正不知道是否有更好的方法去了解這個或沒有,但我這是怎麼做,一個簡單的檢查零的DeltaTime在我的主要演員更新方法,並用極少量.001f取代: (請在後續更新的DeltaTime注意不會是零,這是否statment只得到恢復後,調用一次,準確)

 public void update(float deltaTime) { 
      if (deltaTime <= 0) { 
       deltaTime=.001f; 
      } 
     velocity.scl(deltaTime); 
     position.add(MOVEMENT * deltaTime, velocity.y); 
... 
} 
0

噢,我以前有同樣的問題。
我所做的是在onPause()中,當您按下home按鈕時會調用它,我銷燬了所有資產引用。
然後,在您回來時調用onResume()時,我再次重新分配了資產。

+1

謝謝,我一定要試試。唯一奇怪的是爲什麼home按鈕不會影響沒有移動的actor(或紋理)。 –

+0

遏制主頁按鈕做一些東西,回到遊戲中,你會看到它們消失,重複這一切,消失,這是與內存有關,你可以跟蹤在Android工作室,有一個內存監視器,我忘了實際的名字 – Wadaane

0

render()當您按下Android上的主頁按鈕時繼續調用方法,因此似乎您的玩家位置會隨着重力繼續更新,因此當您恢復遊戲時,您無法在屏幕上看到您的玩家,因此請在位置更新代碼上使用標誌,在pause()resume()方法ApplicationListener接口更改標誌。

enum GameState{ 
    PAUSED, RESUMED 
} 

GameState gameState; 

@Override 
public void create() { 

    gameState=GameState.RESUMED; 
    ... 
} 

@Override 
public void render() { 

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

    if(gameState==GameState.RESUMED) { 
     velocity.add(0.0f, GRAVITY); 
     velocity.scl(deltaTime); 
     position.add(velocity); 
     velocity.scl(1/deltaTime); 
    } 
} 

@Override 
public void pause() { 
    gameState=GameState.PAUSED; 
} 

@Override 
public void resume() { 
    gameState=GameState.RESUMED; 
} 
+0

我試過了,但它似乎沒有工作。重力不是原因,因爲當我在調試過程中記錄位置值時,按下主屏幕後它們是正常的(或NaN)。 –