2015-06-09 82 views
0
@Override 
protected void onDraw(Canvas canvas) { 
    //Drawing the background and sprites as it is a blackboard. 
    canvas.drawBitmap(scaledbmp, 0, 0, null); 
    sprite.onDraw(canvas); 
    boolean new_missle = true; 
    missileStartTime = System.nanoTime(); 

    for (int i = missleslist.size() - 1; i >= 0; i--) { 
     if (new_missle) { 
      missleslist.get(i).onDraw(canvas); 
      new_missle = false; 
     } 
     if (!new_missle && (missileStartTime - System.nanoTime()) == 1000000){ 
      new_missle = true; 
      missileStartTime = System.nanoTime(); 
     } 
    } 
} 

你好,我先發布我的代碼。我在這裏想要做的是在板上繪製導彈,但不是同時繪製它們,並在x毫秒/微秒後分開繪製它們。無論如何這個代碼不起作用,我不明白爲什麼。如何讓代碼在java中運行一段時間後運行

基斯

+0

我從來沒有使用過這個平臺......但是你不能在x秒鐘內睡覺你的程序,並在它醒來時畫畫......然後再次睡覺,然後再次喚醒,等等...... – Rash

+5

你幾乎從來沒有會得到一個精確的1,000,000納秒的差異。每次循環迭代的運行時間總是會有一些變化,並且您將從999,999 - > 1,000,001而不會觸發if(),因爲您沒有達到那個神奇的時間差。它應該是'> =',而不是'=='。 –

+0

什麼不起作用?你能提供一些細節嗎?請檢查你的第二條if語句的條件:是==操作符是否正確使用? –

回答

1

你的條件是錯誤的,你希望你的nanotime是恰好等於爲「1000000」,當它達到這個代碼部分,這將是非常幸運地得到。你應該使用> =

你確定你的循環應該如何工作?你無法控制它會以多快的速度循環(好吧,不是那樣的,它不應該成爲你的目標),而且在每個循環中你都失去了一枚可能發射的導彈。例如可能開始是這樣的:

//as long as you have missiles, it'll try to fire 
while(missleslist.size() > 0) { 
    if (System.nanoTime() - missileStartTime >= 1000000){ 
     missleslist.get(0).onDraw(canvas); 
     missleslist.remove(0); 
     missileStartTime = System.nanoTime(); 
    } 
} 
+0

是啊我想起來一樣,循環沒有工作確實.....我會嘗試這一個:) –

+0

blergh它墜毀:( –

+0

有一個錯字,但它應該反而是 System.nanoTime() - missileStartTime 由於實際的時間會比舊的大,固定無限循環 –

1

正如其他人指出了一些存在的問題在現有的代碼,我不會在這裏老調重彈他們。

由於您在問題中標記了(錯誤地),並且因爲您使用的是View#onDraw(Canvas),所以我假定您正在談論Android。

您應該使用Handler類的Android,尤其是Handler#postDelayed(int)方法延遲代碼在以後的時間被執行:

@Override 
protected void onDraw(Canvas canvas) { 
    //Drawing the background and sprites as it is a blackboard. 
    canvas.drawBitmap(scaledbmp, 0, 0, null); 
    sprite.onDraw(canvas); 

    startDrawingMissiles(canvas, missileList, 0); 
} 

private void startDrawingMissiles(Canvas canvas, List<Missiles> missileList, 
            int currentIndex) { 

    if (currentIndex < missileList.size()) { 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
       missileList.get(currentIndex).onDraw(canvas); 
       startDrawingMissiles(canvas, missileList, ++currentIndex); 
      } 
     }, 1000000); // <- Your duration 
    } 
} 

有可能與上面的代碼中一些微妙的問題,但它說明了什麼你正在努力實現。