2011-10-23 59 views
2

我正在寫一個小遊戲作爲編程任務的一部分。我有我的精靈/圖像移動我想要的方式,除非他們非常生澀。下面是我如何加載了圖片:我該如何讓我的動畫變得不那麼生澀?

//missile and paint are private members of the animation thread 
missile = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.missile)); 
paint = new Paint(); 
paint.setAntiAlias(true); 
startTime = new Date().getTime(); 

我線程的run方法是這樣的:

@Override 
public void run() { 
    while(running) { 
     Canvas canvas = null; 

     try { 
      canvas = surfaceHolder.lockCanvas(null); 

      synchronized (surfaceHolder) { 
       updatePhysics(); 
       doDraw(canvas); 
      } 
     } finally { 
      if(canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

updatePhysics簡單地進行計算和存儲調用線程的私有成員內部的價值projectilePosition

function updatePhysics() { 
    projectilePosition = interceptionCalculationService.positionAtTime((startTime - new Date().getTime())/1000); 
} 

然後,在我的doDraw方法,我做的:

private void doDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 

    ... 

    //I update the position of the missile 
    canvas.drawBitmap(missile, (int) projectilePosition.getDistance() * 2, (int) (getHeight() - (95 + projectilePosition.getHeight())), paint); 
    canvas.restore(); 
} 

問題是,動畫是非常生澀。導彈遵循正確的道路,但並不平坦。我認爲這是因爲當線程的run方法被調用時,我並不真正控制時間間隔。我如何讓動畫更流暢?我在看TranslateAnimation,但我無法弄清楚如何使用它。

這是我第一次寫遊戲和做圖形/動畫,所以我不太瞭解最佳實踐甚至工具。我通過查找大量教程獲得了這一點。

+0

您的視圖是從視圖還是SurfaceView派生的? – Goz

+0

它來自'SurfaceView'。 –

+0

然後,我猜你只是試圖做太多每幀...可能值得提高後臺線程的優先級... – Goz

回答

0

我的解決辦法是停止依賴系統時間,並使用一個變量(即線程的私有成員)稱爲currentTime是被在任doDrawupdatePhysics遞增。所以updatePhysics變爲:

function updatePhysics() { 
    projectilePosition = interceptionCalculationService.positionAtTime(currentTime); 
    currentTime++; 
} 

currentTime在線程的構造函數初始化爲0。這使我的動畫變得流暢。

0

是的doDraw方法的調用速度與處理器可以處理的和操作系統允許的一樣快,這意味着它受其他進程的影響,也意味着它使用大量的處理器時間。作爲一個相當簡單但不推薦的解決方案,請在while循環中添加Thread.Sleep(50)。查看如何使用計時器進行動畫。

+0

我認爲問題是我使用系統時間來計算我的位置彈丸。我將在這裏添加一個答案,描述我是如何做到的。 –