我目前正在研究一款遊戲。這是一個簡單的,不需要的,因此不使用任何類型的框架。目前代碼在物體之間的移動和碰撞方面工作正常;然而,我相信我的遞歸功能太「快」,只顯示對象的最後一次移動,而不是顯示他們所採取的步驟。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()不起作用,也是不明智的,但它值得一試。
這裏不是什麼問題。我沒有遞歸測試,每次調用'MoveObjects()'只需一步。所以,無論我把它放在任何一個循環中(這會顯着降低功能)或將它放在最後,每次調用應該只有一個步驟,而不是整個「道路」,可以這麼說。我將繼續研究這個問題,並希望我能儘快解決它。 – Zubaja 2014-11-17 10:49:23