2013-05-03 1 views
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;

왜 사소한 변경으로 인해 내 흔적이 뭉툭 해지고 방향을 따르지 않는지 이해할 수 없습니다. 지금 여러 가지 방법을 시도해 왔습니다. 어떤 도움이라도 대단히 감사합니다!

감사합니다.

+0

자신과 (내 눈을) 부탁하고'player.get (i)'의 모든 항목을 공통 변수로 추출하십시오. 현대 IDE가 도움이 될 것입니다. –

+0

@SeanPatrickFloyd 나는 그것에 대해 생각했지만 내 버그를 고치기 때문에 그것을하지 못했습니다. =) – Twister1002

답변

0

int로 캐스트 ((int)to - (int) from)는 큰 변화입니다. tofrom을 정수로 반올림 한 다음 그 차이를 계산 한 다음 signum 만 호출합니다. 부동 소수점 수로 계산 된 차이를 계산 한 후 > 0 또는 < 0을 확인한 이전 코드와 완전히 다른 수입니다 (정수로 변환하지 않음).

예 :

to = 0.9 
from = 0.2 

이 대신 항상 0

로 평가

Integer.signum(0 - 0) * moveSpeed 

, 시도 java.lang.Math.signum(to - from) * moveSpeed 될 것입니다. 이것은 수레와 함께 작동합니다.

+0

고맙습니다. 아마 수학 수업을 들여다 보았어야했는데 생각조차하지 않았습니다. 그러나 나는 여전히 같은 문제를 겪고있다. 하지만 이제는 플레이어의 방향이 바뀌면 내 가치가 정확히 일치하지 않기 때문에 그 사실을 알고 있습니다. 그래서 그것을 보상하기위한 조정을해야 할 것입니다. – Twister1002

관련 문제