了解如何沿着更改的路径移动路径

时间:2013-04-30 14:05:28

标签: java

所以我的问题很简单......但让它像这样工作是另一回事。所以我会直接挖掘!

目标:我正在尝试制作像游戏一样的蛇,而且我在路径上遇到了跟踪问题。我已经使用过DID工作的先前方法,但是,我正在尝试消除“目标”对象,因此蛇具有自由移动感觉而不是网格感觉。

我的问题是,当我开始重写我的播放器类时,我摆脱了很多冗余的东西。我的最后一项任务是修复踪迹的移动方式。我希望通过滑入位置跟踪它的踪迹。

我之前编写的代码(Grid-feel):

public void Move(int delta){
 //        double moveSpeed = (delta * .6f) - (oreWeight * ore + armorWeight * armor);

        //Smooth animation for snake movement
        if(IsMoving() && (X.equals(destX) && Y.equals(destY)) ){
            for(int i = 1; i < getSize(); i++){
                if(destX.get(i).intValue() != X.get(i-1).intValue()){
                    destX.set(i, X.get(i-1));
                }
                else if(destY.get(i).intValue() != Y.get(i-1).intValue()){
                    destY.set(i, Y.get(i-1));
                }
            }

            if(left){
                destX.set(0, destX.get(0) - GameBoardNew.blockSize);
            }
            else if(right){
                destX.set(0, destX.get(0) + GameBoardNew.blockSize);
            }
            else if(up){
                destY.set(0, destY.get(0) - GameBoardNew.blockSize);
            }
            else if(down){
                destY.set(0, destY.get(0) + GameBoardNew.blockSize);
            }
        }
        else{
            for(int i = 0; i < getSize(); i++){
                if(up || down){
                    if(X.get(i).intValue() != destX.get(i).intValue()){
                        X.set(i, X.get(i) + Integer.signum(destX.get(i) - X.get(i)));
                    }
                    else if(Y.get(i).intValue() != destY.get(i).intValue()){
                        Y.set(i, Y.get(i) + Integer.signum(destY.get(i) - Y.get(i)));
                    }
                }
                if(right || left){
                    if(Y.get(i).intValue() != destY.get(i).intValue()){
                        Y.set(i, Y.get(i) + Integer.signum(destY.get(i) - Y.get(i)));
                    }
                    else if(X.get(i).intValue() != destX.get(i).intValue()){
                        X.set(i, X.get(i) + Integer.signum(destX.get(i) - X.get(i)));
                    }
                }
            }
        }
}

现在,由于我已经重新设计了它,我正在加快玩家与其他条件一起旅行的速度,同时试图摆脱公式的目标部分并使用其身体作为一种方式想出这个。然而,我所拥有的,有效的,直到玩家在不同的方向快速移动...然后身体只是聚集在一起。它基本上是相同的公式,但仍然非常困惑。

public void Move(int delta){
 //        float moveSpeed = (playerSpeed - (oreWeight * getSize() + armorWeight * armor)) * delta;
    float moveSpeed = 1f;

    if(IsMoving() && player.get(0).getX() == playerDest.get(0).getX()){
        for(int i = 1; i < getSize(); i++){
            if(playerDest.get(i).getX() != player.get(i - 1).getX()){
                playerDest.get(i).setX(player.get(i - 1).getX());
            }
            else{
                playerDest.get(i).setY(player.get(i - 1).getY());
            }
        }

        if(left){
            playerDest.get(0).setX(player.get(0).getX() - moveSpeed);
        }
        else if(right){
            playerDest.get(0).setX(player.get(0).getX() + moveSpeed);
        }
        else if(up){
            playerDest.get(0).setY(player.get(0).getY() - moveSpeed);
        }
        else if(down){
            playerDest.get(0).setY(player.get(0).getY() + moveSpeed);
        }
    }

    for(int i = 0; i < getSize(); i++){
        Rectangle location = player.get(i);
        Rectangle inFront = playerDest.get(i);
        int xVel = Integer.signum((int)inFront.getX() - (int)location.getX());
        int yVel = Integer.signum((int)inFront.getY() - (int)location.getY());
        if(up || down){
            if(location.getX() != inFront.getX()){
                if(xVel == 1){
                    location.setX(location.getX() + moveSpeed);
                }
                else if(xVel == -1){
                    location.setX(location.getX() - moveSpeed);
                }
            }
            else if(location.getY() != inFront.getY()){
                if(yVel == 1){
                    location.setY(location.getY() + moveSpeed);
                }
                else if(yVel == -1){
                    location.setY(location.getY() - moveSpeed);
                }
            }
        }
        else if(right || left){
            if(location.getY() != inFront.getY()){
                if(yVel == 1){
                    location.setY(location.getY() + moveSpeed);
                }
                else if(yVel == -1){
                    location.setY(location.getY() - moveSpeed);
                }
            }
            else if(location.getX() != inFront.getX()){
                if(xVel == 1){
                    location.setX(location.getX() + moveSpeed);
                }
                else if(xVel == -1){
                    location.setX(location.getX() - moveSpeed);
                }
            }
        }
    }
}

如果我确实需要澄清任何信息,我会很高兴;请问!

感谢您抽出宝贵时间阅读本文!

2 个答案:

答案 0 :(得分:0)

如果这是一条带有分段体的蛇,则每个片段都会跟随它之前的片段。唯一具有“自由意志”的部分是跟随用户输入的头部。

答案 1 :(得分:0)

在另一个帮助论坛中,人们建议使用目标对象跟踪路径中的上一个对象,以避免发现毛刺路径。