2014-07-16 97 views
0

我想呈現圖像,但是當我運行遊戲作爲桌面啓動器時,無法看到圖像,但是我相信圖像正在呈現,因爲它與另一個精靈重疊給出一個輸出。渲染的圖像不顯示Java Libgdx

if (chicken.overlaps(farmer)){ 
       System.out.print("GameOver"); 
       gameOver(); 

我沒有得到任何錯誤。

相機

OrthographicCamera camera; 
camera = new OrthographicCamera(); 
camera.setToOrtho(false, 1920, 1080); 
camera.update(); 
inputUpdate(touch, camera); 
batch.setProjectionMatrix(camera.combined); 

enter image description here

驗證碼:

public void render(float delta) { 


    camera.update(); 
    inputUpdate(touch, camera); 
    batch.setProjectionMatrix(camera.combined); 



    Iterator<Rectangle> iter = chickens.iterator(); 
    while(iter.hasNext()){  
     Rectangle chicken = iter.next(); 
     if(farmerX < (chicken.x - 85/2)) chicken.x -= 2.5; 
     if(farmerX > (chicken.x - 85/2))chicken.x += 2.5; 
     if (farmerY < (chicken.y - 66/2))chicken.y -= 2.5; 
     if(farmerY > (chicken.y - 66/2))chicken.y += 2.5; 

     float diffYchick; 
     float diffXchick; 
     float angleDegreeschick; 

     diffYchick = (float) (farmerY - chicken.y); 
     diffXchick = (float) (farmerX - chicken.x); 

     angleDegreeschick = (float) Math.toDegrees(Math.atan2(diffYchick, diffXchick)); 


     game.batch.begin(); 
      game.batch.draw(chickenImage, (float)chicken.x, (float)chicken.y, (float)42.5, (float)33, (float)85, (float)66, (float)1, (float)1, (float)angleDegreeschick); 

     game.batch.end(); 


     int stop; 
     stop = 0; 
     switch(stop){ 
     case 0: 
      if (chicken.overlaps(farmer)){ 
      System.out.print("GameOver"); 
      gameOver(); 

      stop +=1; 
       break; 
      } 
     } 



    } 

    float diffY; 
    float diffX; 
    diffY = (float) (touch.y - farmerY); 
    diffX = (float) (touch.x - farmerX); 

    float angleDegrees; 

    angleDegrees = (float) Math.toDegrees(Math.atan2(diffY, diffX)); 

    if(TimeUtils.nanoTime() - lastSpawnTime > 1000000000) spawnChicken();  

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

    camera.update(); 
    inputUpdate(touch, camera); 
    batch.setProjectionMatrix(camera.combined); 





    FarmerAsset.stateTime += Gdx.graphics.getDeltaTime(); 
    FarmerAsset.currentFrame = FarmerAsset.walkAnimation.getKeyFrame(FarmerAsset.stateTime, true); 

    game.batch.begin(); 
    game.batch.draw(FarmerAsset.currentFrame, farmerX, farmerY, (float)85, (float)85, (float)170, (float)170, (float)1, (float)1, (float)angleDegrees + 270); 
    game.font.draw(game.batch, "Chickens Running: " + runningChickens, 0, 1080); 
    game.batch.end(); 

    if(Gdx.input.isTouched()){ 
     touch.set(Gdx.input.getX(), Gdx.input.getY(), 0); 
     camera.unproject(touch); 


     if(farmerY <= touch.y && touch.y<= farmerY + 170 && 
       farmerX <= touch.x && touch. x <= farmerX + 170){ 
     }else{ 
      if (touch.x - 85 > farmerX){ 
       farmerX +=5; 
      } 
      if (touch.x - 85 < farmerX){ 
       farmerX -=5; 
      } 
      if (touch.y - 85 > farmerY){ 
       farmerY +=5; 
      } 
      if (touch.y - 85 < farmerY){ 
       farmerY -=5; 
      } 
     } 


    } 

    if(Gdx.input.isKeyPressed(Keys.A)||Gdx.input.isKeyPressed(Keys.LEFT)){ 
     farmerX -= 10; 
    } 
    else if(Gdx.input.isKeyPressed(Keys.D)||Gdx.input.isKeyPressed(Keys.RIGHT)){ 
     farmerX += 10; 
    } 
    else if(Gdx.input.isKeyPressed(Keys.W)||Gdx.input.isKeyPressed(Keys.UP)){ 
     farmerY += 10; 
    } 
    else if(Gdx.input.isKeyPressed(Keys.S)||Gdx.input.isKeyPressed(Keys.DOWN)){ 
     farmerY -= 10; 
    } 

    if(farmerX < 0) farmerX = 0; 
    if(farmerX > 1920-170) farmerX = 1920-170; 
    if(farmerY < 0) farmerY = 0; 
    if(farmerY > 1080-170) farmerY = 1080-170; 
    farmer.x = farmerX; 
    farmer.y = farmerY; 



} 

農民

game.batch.draw(FarmerAsset.currentFrame, farmerX, farmerY, (float)85, (float)85, (float)170, (float)170, (float)1, (float)1, (float)angleDegrees + 270); 
+0

任何人都可以幫忙?? !! – user3165683

+0

不確定你的意思是「它與另一個精靈重疊以提供輸出」。你的意思是它模糊了其他精靈的一部分?你能鏈接到屏幕截圖嗎?沒有看到你如何設置你的相機,這不能真正被調試。 – Tenfour04

+0

另請注意,由於您在while循環中繪製文本,因此多次繪製文本。您也多次更新您的相機。通常你會想要更新你的相機,並在繪製任何東西之前得到輸入。 – Tenfour04

回答

1

我看到的渲染方法的若干問題:

  • 更新相機和冗餘觸摸多次。您的render方法中的前三行將進一步重複。他們只應該被調用一次。如果你沒有移動你的相機,沒有理由更新它,但通常如果你正在移動它,你會想要在處理任何可能導致它移動的觸摸邏輯之後移動和更新它。
  • 在繪製雞之前不清除屏幕。在使用Sprite批處理之前,您必須先致電Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
  • 不把所有的雞一起批量。如果每隻雞都是CPU密集型的,並且很快就會成爲你遊戲性能的瓶頸,那麼你可以撥打batch.beginbatch.end。您應該將batch.begin移至while循環之前,並將batch.end移至while循環之後。
  • 混合更新遊戲狀態和繪圖的順序。在繪製這些對象之前,您應該處理所有觸摸邏輯和更新對象位置。 (這是不是造成你的問題,但它是導致從用戶輸入一幀的滯後性。)

最有可能的,在這些雞不能正確渲染,由於更新之前與精靈批量繪製它們相機並致電glClear

這大概是我如何重新排列它。但如果這是我的項目,我會做更多的分離邏輯和渲染。例如,我會使用Sprite對象來代表雞而不是僅僅是矩形。然後,我會在渲染方法的開始處適當地移動所有的精靈,然後在所有精靈中再做一次循環,最後將它們提交給SpriteBatch。這會讓你的代碼更容易出錯。

public void render(float delta) { 

    inputUpdate(touch, camera); 

    if(TimeUtils.nanoTime() - lastSpawnTime > 1000000000) spawnChicken(); 

    if(Gdx.input.isTouched()){ 
     touch.set(Gdx.input.getX(), Gdx.input.getY(), 0); 
     camera.unproject(touch); 


     if(farmerY <= touch.y && touch.y<= farmerY + 170 && 
      farmerX <= touch.x && touch. x <= farmerX + 170){ 
     }else{ 
     if (touch.x - 85 > farmerX){ 
      farmerX +=5; 
     } 
     if (touch.x - 85 < farmerX){ 
      farmerX -=5; 
     } 
     if (touch.y - 85 > farmerY){ 
      farmerY +=5; 
     } 
     if (touch.y - 85 < farmerY){ 
      farmerY -=5; 
     } 
     } 


    } 

    if(Gdx.input.isKeyPressed(Keys.A)||Gdx.input.isKeyPressed(Keys.LEFT)){ 
     farmerX -= 10; 
    } 
    else if(Gdx.input.isKeyPressed(Keys.D)||Gdx.input.isKeyPressed(Keys.RIGHT)){ 
     farmerX += 10; 
    } 
    else if(Gdx.input.isKeyPressed(Keys.W)||Gdx.input.isKeyPressed(Keys.UP)){ 
     farmerY += 10; 
    } 
    else if(Gdx.input.isKeyPressed(Keys.S)||Gdx.input.isKeyPressed(Keys.DOWN)){ 
     farmerY -= 10; 
    } 

    if(farmerX < 0) farmerX = 0; 
    if(farmerX > 1920-170) farmerX = 1920-170; 
    if(farmerY < 0) farmerY = 0; 
    if(farmerY > 1080-170) farmerY = 1080-170; 
    farmer.x = farmerX; 
    farmer.y = farmerY; 

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

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

    game.batch.begin(); 

    Iterator<Rectangle> iter = chickens.iterator(); 
    while(iter.hasNext()){ 
     Rectangle chicken = iter.next(); 
     if(farmerX < (chicken.x - 85/2)) chicken.x -= 2.5; 
     if(farmerX > (chicken.x - 85/2))chicken.x += 2.5; 
     if (farmerY < (chicken.y - 66/2))chicken.y -= 2.5; 
     if(farmerY > (chicken.y - 66/2))chicken.y += 2.5; 

     float diffYchick; 
     float diffXchick; 
     float angleDegreeschick; 

     diffYchick = (float) (farmerY - chicken.y); 
     diffXchick = (float) (farmerX - chicken.x); 

     angleDegreeschick = (float) Math.toDegrees(Math.atan2(diffYchick, diffXchick)); 

     game.batch.draw(chickenImage, (float)chicken.x, (float)chicken.y, (float)42.5, (float)33, (float)85, (float)66, (float)1, (float)1, (float)angleDegreeschick); 

     int stop; 
     stop = 0; 
     switch(stop){ 
     case 0: 
     if (chicken.overlaps(farmer)){ 
      System.out.print("GameOver"); 
      gameOver(); 

      stop +=1; 
      break; 
     } 
     } 

    } 

    game.batch.end(); 

    float diffY = (float) (touch.y - farmerY); 
    float diffX = (float) (touch.x - farmerX); 

    float angleDegrees = (float) Math.toDegrees(Math.atan2(diffY, diffX)); 

    FarmerAsset.stateTime += Gdx.graphics.getDeltaTime(); 
    FarmerAsset.currentFrame = FarmerAsset.walkAnimation.getKeyFrame(FarmerAsset.stateTime, true); 

    game.batch.begin(); 
    game.batch.draw(FarmerAsset.currentFrame, farmerX, farmerY, (float)85, (float)85, (float)170, (float)170, (float)1, (float)1, (float)angleDegrees + 270); 
    game.font.draw(game.batch, "Chickens Running: " + runningChickens, 0, 1080); 
    game.batch.end(); 

    } 

除此之外,您的switch語句有一個bug ... break應該if語句外部調用。現在不是問題,但稍後將添加到switch語句時。我沒有糾正這個問題。

而僅供參考,您不必在浮動數字前繼續輸入(float)。在他們後面輸入一個f

+0

非常感謝你提供這個非常有用和翔實的答案,如果你可以把實際的雞肉渲染問題放在黑體中,以供將來人們參考。 – user3165683