0

所以我一直在尝试修改我的代码,我只是很困惑为什么我的代码会从一种完全工作的方式变成完全不同的事情,而只是做了这么小的改动。我一直在调试它并更改了非常小的东西,但是当我进行更改时,路径会结块而不是保持距离。

目标:我试图弄清楚为什么一个微小的变化会阻碍小径而不是保持距离。

这是玩家在进行次要代码更改之前移动的位置,并且效果很好。

public void Move(int delta){
    float moveSpeed = playerSpeed * delta;
    if(IsMoving() && 
            (player.get(0).getX() == playerDest.get(0).getX()) &&
            (player.get(0).getY() == playerDest.get(0).getY())){
        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 if(playerDest.get(i).getY() != player.get(i-1).getY()){
                playerDest.get(i).setY(player.get(i - 1).getY());
            }
        }

        if(left){
            playerDest.get(0).setX(player.get(0).getX() - blockSize);
        }
        else if(right){
            playerDest.get(0).setX(player.get(0).getX() + blockSize);
        }
        else if(up){
            playerDest.get(0).setY(player.get(0).getY() - blockSize);
        }
        else if(down){
            playerDest.get(0).setY(player.get(0).getY() + blockSize);
        }
    }
    else{
        for(int i = 0; i < getSize(); i++){
            if(up || down){
                if(player.get(i).getX() != playerDest.get(i).getX()){
                    player.get(i).setX(player.get(i).getX() + MoveDirection(playerDest.get(i).getX(), player.get(i).getX(), moveSpeed));
                }
                else if(player.get(i).getY() != playerDest.get(i).getY()){
                    player.get(i).setY(player.get(i).getY() + MoveDirection(playerDest.get(i).getY(), player.get(i).getY(), moveSpeed));
                }
            }
            else if(right || left){
                if(player.get(i).getY() != playerDest.get(i).getY()){
                    player.get(i).setY(player.get(i).getY() + MoveDirection(playerDest.get(i).getY(), player.get(i).getY(), moveSpeed));
                }
                else if(player.get(i).getX() != playerDest.get(i).getX()){
                    player.get(i).setX(player.get(i).getX() + MoveDirection(playerDest.get(i).getX(), player.get(i).getX(), moveSpeed));
                }
            }

    private float MoveDirection(float to, float from, float moveSpeed){
        if(to - from > 0){
            return 1;
        }
        else if(to - from < 0){
            return -1;
        }
        else{
            return 0;
        }
    }

现在对此的微小变化是在 MoveDirection() 方法中并重新调整距离。这只是添加了一个移动速度的变量。

        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);
        }

private float MoveDirection(float to, float from, float moveSpeed){
    return Integer.signum((int)to - (int) from) * moveSpeed;
}

为什么我要对玩家的移动方式进行微小的改动?根据游戏刷新的速度,我需要将其用作值。因此变量deltafloat moveSpeed;

我只是不明白为什么这个微小的变化会让我的足迹结块而不遵循它的方向......我已经尝试了几个小时的不同方式。任何帮助是极大的赞赏!

谢谢!

4

1 回答 1

0

转换为 int ( (int)to - (int) from) 是您的重大改变。它四舍五入tofrom整数,然后计算它们的差值,然后才调用signum。这与您之前的代码非常不同,您之前的代码将差异计算为浮点数,然后检查> 0or < 0,而没有任何转换为​​整数。

例子:

to = 0.9
from = 0.2

这将导致

Integer.signum(0 - 0) * moveSpeed

,它总是计算为 0。

试试java.lang.Math.signum(to - from) * moveSpeed吧。这适用于花车。

于 2013-05-03T14:34:59.973 回答