Android:减慢递归算法

时间:2014-11-14 17:35:30

标签: android recursion

我目前正在开发一款游戏。这是一个简单的,不需要,因此不使用任何类型的框架。现在,代码在对象之间的移动和碰撞方面工作得很好;但是,我相信我的递归功能太“快”,只显示对象的最后一个动作,而不是显示它们采取的步骤。

简而言之: 水平边界,这些边界内部是可移动的物体,可以在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();
}

我知道我的代码中有些奇怪,我需要在某些时候清理它,但这是一个描述:

- 根据飞行方向,使用不同的循环来精确计算碰撞

-movables是当前级别中所有可移动对象的“GameObject”向量

- 初始碰撞检查后,另一个for循环(我可以将其转换为for-each循环,我知道)用于查看是否存在任何未崩溃的对象。

- 基于此最终循环,'allCollided'布尔值设置为false。

- 游戏然后检查哪些匹配对象已经碰撞并将其从屏幕上移除,然后相应地更新屏幕。

- 使用最后的'if'语句关闭,看看是否需要再次调用'MoveObjects()'函数(递归)

现在提问: 如何手动减慢此循环,这样做是否明智?这个问题可能有不同的解决方案吗? Thread.sleep()不起作用,这也是不明智的,但值得一试。

1 个答案:

答案 0 :(得分:0)

我已经设法通过将我的MoveObjects()函数放在CountDownTimer中来解决这个问题。这样,每个tick都调用一次MoveObjects()函数和updateDraw()方法,而不是在一个帧中递归调用。