2014-11-14 100 views
-1

我目前正在研究一款遊戲。這是一個簡單的,不需要的,因此不使用任何類型的框架。目前代碼在物體之間的移動和碰撞方面工作正常;然而,我相信我的遞歸功能太「快」,只顯示對象的最後一次移動,而不是顯示他們所採取的步驟。Android:放慢遞歸算法

簡而言之: 水平是有邊界的,並且這些邊界內部是可移動的物體,這些物體可以沿着4個方向滑動,這取決於你的'一扔'動作。但不是物體​​明顯滑動,而是「傳送」到最終目的地。

這是我的函數:

public void MoveObjects(){ 
    boolean allCollided = true; 
    int moveSpeed = 8; 

    //Up and Left movement    
    if(upMotion || leftMotion){ 
     for(int i = 0; i < movables.size(); i++){ 
      int oldX = movables.get(i).position.x; 
      int oldY = movables.get(i).position.y; 
      int newX = 0; 
      int newY = 0; 

      if(leftMotion) 
       newX = oldX-moveSpeed; 
      if(upMotion) 
       newY = oldY-moveSpeed; 

      //Make sure neither newX or newY is 0 
      if(newX == 0) 
       newX = oldX; 
      if(newY == 0) 
       newY = oldY; 

      movables.get(i).Position(newX, newY); 

      for(GameObject go : level){ 
       if(movables.get(i).Collision(go) && go.spriteID != R.drawable.nothing){ 
        if(leftMotion) 
         newX=oldX; 
        if(upMotion) 
         newY=oldY; 

        movables.get(i).collided = true; 
       } 
      } 
      for(GameObject go : movables){ 
       if(movables.get(i).Collision(go) && go.spriteID != R.drawable.nothing && go != movables.get(i)){ 
        if(leftMotion) 
         newX=oldX; 
        if(upMotion) 
         newY=oldY; 

        movables.get(i).collided = true; 
       } 
      } 

      movables.get(i).Position(newX, newY); 
     } 
    } 
    //Down and Right movement 
    if(downMotion || rightMotion){ 
     for(int i = movables.size()-1; i > -1 ; i--){ 
      int oldX = movables.get(i).position.x; 
      int oldY = movables.get(i).position.y; 
      int newX = 0; 
      int newY = 0; 

      if(rightMotion) 
       newX = oldX+moveSpeed; 
      if(downMotion) 
       newY = oldY+moveSpeed; 

      //Make sure neither newX or newY is 0 
      if(newX == 0) 
       newX = oldX; 
      if(newY == 0) 
       newY = oldY; 

      movables.get(i).Position(newX, newY); 

      for(GameObject go : level){ 
       if(movables.get(i).Collision(go) && go.spriteID != R.drawable.nothing){ 
        if(rightMotion) 
         newX=oldX; 
        if(downMotion) 
         newY=oldY; 

        movables.get(i).collided = true; 
       } 
      } 
      for(GameObject go : movables){ 
       if(movables.get(i).Collision(go) && go.spriteID != R.drawable.nothing && go != movables.get(i)){ 
        if(rightMotion) 
         newX=oldX; 
        if(downMotion) 
         newY=oldY; 

        movables.get(i).collided = true; 
       } 
      } 

      movables.get(i).Position(newX, newY); 
     } 
    } 

    //Check all objects for collision 
    for(int i = 0; i < movables.size(); i++){ 
     if(!movables.get(i).collided) 
      allCollided = false; 
    } 

    checkShapes(); 
    updateDraw(); 

    if(!allCollided) 
     MoveObjects(); 
} 

我知道在我的代碼奇怪的現象,我需要把它清理乾淨,在某些時候,但這裏有一個說明:

-Depending上摜方向,不同的循環用於精確地計算碰撞

-movables是在當前級別中的所有可移動對象的「遊戲物體」矢量

- 在初始衝突檢查後,另一個for循環(我可以將其轉換爲for-each循環,我知道)用於查看是否存在任何未碰撞的對象。

- 基於此最終循環,'allCollided'布爾值設置爲false。

- 遊戲然後檢查哪些匹配對象已經碰撞並將它們從屏幕上移除,然後相應地更新屏幕。

-close了最後的「if'語句,看是否‘MoveObjects()’函數需要(遞歸)

所以,現在再次呼籲的問題: 如何手動減緩這種循環,這樣做是明智的嗎?這件事可能有不同的解決方案嗎? Thread.sleep()不起作用,也是不明智的,但它值得一試。

+0

這裏不是什麼問題。我沒有遞歸測試,每次調用'MoveObjects()'只需一步。所以,無論我把它放在任何一個循環中(這會顯着降低功能)或將它放在最後,每次調用應該只有一個步驟,而不是整個「道路」,可以這麼說。我將繼續研究這個問題,並希望我能儘快解決它。 – Zubaja 2014-11-17 10:49:23

回答

0

我已經設法通過將我的MoveObjects()函數放在CountDownTimer中來解決這個問題;這樣,MoveObjects()函數和updateDraw()方法每隔一個tick被調用一次,而不是在單個幀中遞歸地調用。