简体   繁体   English

轻微改变轨迹的移动物体

[英]Issues moving objects with a trail with slight change

So I've been trying to modify my code a bit, and I'm just so confused about why my code is going from completely working from one way to doing something completely different with such a minor change. 因此,我一直在尝试修改我的代码,而我对为什么我的代码从完全从一种工作方式转变为通过这么小的更改而完全不同的事情感到困惑。 I've been debugging this and changing very minor things, but yet when I make the change, the trail clumps up instead of keeping its distance. 我一直在调试此功能并更改了非常小的内容,但是当我进行更改时,路径变得拥挤而不是保持距离。

Objective: I'm trying to figure out why a minor change is clumping up the trail instead of keeping its distance. 目标:我试图弄清楚为什么微小的变化会拖累步道而不是保持距离。

Here is where the player is moving before the minor code change and this works perfectly. 在次要代码更改之前,玩家就是在这里移动的,这很正常。

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

Now the minor change to this is within the MoveDirection() method and readjusting the distance. 现在,对它的微小更改在MoveDirection()方法中,并且重新调整了距离。 This is just to add in a variable of movement speeds. 这只是增加了运动速度的变量。

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

Why am I making a minor change to the way the player moves? 为什么我要对播放器的移动方式进行微小的更改? Depending on how fast the game is refreshing, I need to use that as a value. 根据游戏刷新的速度,我需要将其用作值。 Hence the variable delta and float moveSpeed; 因此,变量deltafloat moveSpeed;

I just don't understand why that minor change is making my trail clump up and not following its directions... I've been trying different ways for hours now. 我只是不明白为什么这个小小的变化会使我的足迹变得簇拥而没有遵循它的方向……我已经尝试了好几个小时了。 Any help is greatly appreciated! 任何帮助是极大的赞赏!

Thank you! 谢谢!

The cast to int ( (int)to - (int) from ) is your big change. 将int( (int)to - (int) from )是您的重大更改。 It rounds to and from down to integral numbers, then calculates their difference and only then calls signum. 这轮tofrom下到整体的数字,然后计算它们的区别,然后才调用正负号。 This is very different from your previous code where you calculated differences as floating point numbers and then checked for > 0 or < 0 , without any cast to integral numbers. 这与之前的代码非常不同,在先前的代码中,您将差值计算为浮点数,然后检查> 0< 0 ,而没有任何强制转换为整数。

Example: 例:

to = 0.9
from = 0.2

This would result in 这将导致

Integer.signum(0 - 0) * moveSpeed

, which always evaluates to 0. ,其总值为0。

Try java.lang.Math.signum(to - from) * moveSpeed instead. 尝试java.lang.Math.signum(to - from) * moveSpeed This works with floats. 这适用于浮点数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM