2016-08-09 3 views
0

저는 Java와 Android를 처음 사용합니다. 나는 최근에 LibGDX를 사용하여 Android 용 게임을 만들려고 노력해 왔습니다. 이 게임의 한 측면은 화면의 한쪽에서 다른쪽으로 (수평으로) 움직이는 사람을 포함합니다. 이것은 사람을위한 코드입니다. '인스턴트 속도 변경 LibGDX

public class Man { 
    private static final int SP = 10; 
    private static final int NSP = -10; 
    private Vector3 position; 
    private Vector3 velocity; 
    private Texture man; 

    public Man(int x, int y){ 
     position = new Vector3(x, y, 0); 
     velocity = new Vector3(0, 0, 0); 
     man = new Texture ("person.png"); 

    } 

    public void update(float dt){ 
     if (position.x > 2560) { 
      velocity.add(NSP, 0, 0); 
     } 
     else { 
      velocity.add(SP, 0, 0); 
     } 
     velocity.add(SP, 0, 0); 
     velocity.scl(dt); 
     position.add(velocity.x, 0, 0); 
     velocity.scl(1/dt); 
    } 

    public Texture getTexture() { 
     return man; 
    } 

    public Vector3 getPosition() { 
     return position; 
    } 

    public void dispose(){ 
     man.dispose(); 
    } 

} 

저는 아직도 이런 문제를 파악하는 데 익숙하지 않습니다. 이 코드를 실행하면 사람이 화면의 한쪽 (왼쪽)에서 화면의 다른 쪽 (오른쪽)을지나갑니다. 한 두 번째 또는 두 번째 후, 사람이 다시 (오른쪽에서)보기로 돌아와 화면의 다른 쪽 (왼쪽으로,보기에 머물러). 이 과정이 반복됩니다. 또한, 사람이 움직이기 시작하면 최고 속도에 도달하는 데 몇 초가 걸립니다. 나는 if else 문을 제거하고 서로 다른 속도 (양수와 음수 중 하나)를 가진 2 명의 사람들을 만들어서 사람이 속도를 즉시 변경한다는 것을 알기 위해 노력했습니다 (한 사람을 제거하고 다른 사람을 산란 시킴). 이것을 할 수있다.

나는 사람을 즉시 최고 속도로 올릴 수 있었고, 화면의 반대편에서 즉시 속도를 변경하고 루프에서이 과정을 계속 진행할 수 있었으면합니다. 어떤 도움이라도 대단히 감사 할 것입니다. 감사합니다. .

답변

1

코드를 살펴보고 논리를 생각해보십시오.

항상 속도에 SP를 추가하여 if-else 문을 따르십시오. 그래서 효과적으로,이 동등한 결과, 귀하의 경우 - 다른 사람과 함께하는 수학을 결합 할 수 있습니다 : 단순히

if (position.x > 2560) { 
     velocity.add(0, 0, 0); 
    } 
    else { 
     velocity.add(2 * SP, 0, 0); 
    } 
    velocity.scl(dt); 
    position.add(velocity.x, 0, 0); 
    velocity.scl(1/dt); 

이상 :

if (position.x <= 2560) { 
     velocity.add(2 * SP, 0, 0); 
    } 
    velocity.scl(dt); 
    position.add(velocity.x, 0, 0); 
    velocity.scl(1/dt); 

그래서 당신은 항상 2 * SP에 의해 가속됩니다 모든 프레임에, 화면이 꺼져 있지 않으면 속도가 증가하지 않지만 화면에서 오른쪽으로 계속 확대됩니다.

속도를 즉시 변경하려면 속도를 변경하고 특정 값을 설정해야합니다. 또한 반올림 오류가 발생하기 시작할 수 있으므로 벡터의 크기를 조정하고 크기를 조정하지 않는 것이 좋습니다. 다음은 화면의 왼쪽과 오른쪽에서 탁구를 치는 방법입니다.

public void update(float dt){ 
    if (velocity.x == 0) 
     velocity.x = SP; //first frame setup 

    //only change the velocity if character is off screen, otherwise leave it alone 
    if (position.x > 2560) 
     velocity.x = NSP; 
    else if (position.x < 0 - texture.getWidth()) 
     velocity.x = SP; 

    position.add(velocity.x * dt, 0, 0); 
} 

주, 나는 당신의 캐릭터의 폭이 무엇이든을위한 자리로 texture.getWidth()을 사용했다. 실제로, 플레이어 클래스 내에서 텍스처와 같은 에셋을로드하는 것은 나쁜 습관입니다. 버그가 발생하기 쉽고 유지 보수하기 어려운 코드를위한 방법 인 자산 논리를 게임의 논리와 혼합합니다. 자산 관리자 클래스를 사용하여 모든 자산을로드하고 저장하는 것이 가장 좋습니다. 캐릭터의 묘화 메소드는 자산 관리자를 매개 변수로 가져 와서 거기에서 자산 참조를 선택할 수 있습니다. 예 :

public void draw (SpriteBatch batch, MyAssets assets){ 
    TextureRegion region = assets.getRegion("man"); //imaginary assets class--implementation up to you 
    batch.draw(region, x, y); 
} 
+0

감사합니다 !!!!!! –