所以我一直在尝试修改我的代码,而我对于为什么我的代码从完全工作从一种方式转变为完全不同于这种微小变化的东西感到困惑。我一直在调试这个并改变非常小的东西,但是当我做出改变时,这条线索会抬起而不是保持距离。
目标:我正在试图弄清楚为什么一个微小的变化会聚集在一起,而不是保持距离。
这是玩家在次要代码更改之前移动的位置,这非常有效。
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;
}
为什么我对玩家的移动方式做了一些小改动?根据游戏刷新的速度,我需要将其用作值。因此变量delta
和float moveSpeed;
我只是不明白为什么那个微小的改变让我的踪迹变得笨拙而不遵循它的指示......我现在已经尝试了几个小时的不同方式。非常感谢任何帮助!
谢谢!
答案 0 :(得分:0)
转换为int((int)to - (int) from
)是你的重大变化。它将to
和from
舍入为整数,然后计算它们的差异,然后才调用signum。
这与您之前的代码非常不同,您之前将差异计算为浮点数,然后检查> 0
或< 0
,而不会转换为整数。
示例:
to = 0.9
from = 0.2
这会导致
Integer.signum(0 - 0) * moveSpeed
,总是评估为0。
请尝试使用java.lang.Math.signum(to - from) * moveSpeed
。这适用于花车。