2009-03-04 8 views
3

이것은 아마도 기본적인 문제 일 수 있지만 다른 기사를 찾을 수없는 것 같습니다.Java에서 튀는 공

어쨌든, 나는 자바로 작은 튀김 공 프로그램을 작성하여 기본 기술을 시험하고 확장했습니다. 이 프로그램은 그냥 튀는 공을 던져 넣는 것입니다. 잘하면가 잠시 튀어 나옵니다. 원래 프로그램은 정상적으로 작동했지만 이제는 프로그램에 중력을 추가하려고 시도했습니다. 중력은 실제로는 정상적으로 작동하지만, 일단 반송이 실제로 작아지면 매우 짧은 시간 동안 애니메이션이 엉뚱 해져서 공의 위치가 계속 감소합니다. 나는 문제를 파악하려고 노력했으나 나는 그것을 볼 수 없다. 어떤 도움이 가장 환영받을 것입니다.

public final class Ball extends Rectangle { 
float xspeed = 1.0f; float yspeed = 1.0f; float gravity = 0.4f; 


public Ball(float x, float y, float width, float height) { 
    super(x, y, width, height); 
} 

public void update(){ 
    yspeed += gravity; 

    move(xspeed, yspeed); 

    if(getX() < 0){ 
     xspeed = 1; 
    } 
    if(getX() + getWidth() > 320){ 
     xspeed = -1; 
    } 
    if(getY() < 0){ 
     yspeed = 1; 
    } 
    if(getY() + getHeight() > 200 && yspeed > 0){ 
     yspeed *= -0.98f; 
    } 
    if(getY() + getHeight() > 200 && yspeed < 0){ 
     yspeed *= 0.98f; 
    } 

} 

public void move(float x, float y){ 
    this.setX(getX()+x); 
    this.setY(getY()+y); 
} 

}

편집 : 감사 보인다 불규칙적 인 움직임을 분류 한합니다. 나는 그것이 멈추었을 때 내 공이 멈추는 것을 멈출 수있는 방법을보기 위해 여전히 고심하고있다. 지금은 바운스를 멈추고 "바닥"을지나 계속 움직일 것입니다. 내 yspeed + 중력선과 관련이 있다고 생각합니다. 나는 운동을 멈추는 방법을 알 수 없다.

답변

3

당신이 때 공이 거리 DX = V_I의 *의 t + 2 (-g) t^2 공간을 통해 이동을 갖는다 가정된다

yspeed += gravity; 

. 바닥 가까이에있을 때 이것이 사실이 아닐 수도 있습니다. 당신은 충분히 가까이 당신은 매우 바닥 근처에 낮은 속도를 가지고 바닥과

  • 를 아래로 이동 (볼이 그것의 대부분을 잃은 경우처럼이 에너지)이다

    : 경우 실패

    이 버그로 인해 시뮬레이션 결과 이 에너지 보존을 중단합니다., 낮은 진폭에서 나타나는 비정상적인 동작이 발생합니다.

    작은 시간 간격을 사용하여 문제를 줄일 수 있으며, 방안에있을 때 계산 계산을 수행하고 의 안전한 시간 간격을 선택하면 완전히 제거 할 수 있습니다. 반복 즉, 문제가 발생하지 않는 한 항상 기본값을 사용하고 최적의 시간 단계를 계산하십시오.

    그러나 근본적인 근사값에는 다른 문제가 있습니다. 미분 방정식을 수치 적으로 풀기위한 토론을 위해 숫자 분석 텍스트를보십시오.

  • 1

    공이 튀었을 때 실제로는 "땅"보다 약간 아래쪽에있을 것이고 저속에서는 한 번의 눈금으로 땅 위로 올라가지 않을 것입니다. 그래서 다음 업데이트()에서 여전히 바닥 아래서 튀어 오릅니다. 그러나 이번에는 아래쪽으로 번이므로주기가 계속됩니다. 당신이 창 상단입니다에 반송 할 때 1로 설정 Y-속도 :

    if(getY() + getHeight() > 200){ 
          yspeed *= -0.981; 
          setY(200 - getHeight()); 
        } 
    
    +0

    움직임 어쩌면 뭔가를 초당 30 업데이트를하고있는 가정하면 델타, 절대하지 값을 가질 것, 당신의 공은 – paxdiablo

    +0

    ㅎ :-) 우주의 가장자리를 비행 가능성 , 죄송합니다. 결정된. – Blorgbeard

    1

    일단 가장 중요한

    당신은, 이런 식으로 뭔가를 반사 할 때 지상까지 다시 공을 이동해야 올바르지 않으면 yspeed를 -yspeed로 설정해야합니다 (테두리 안에서 시작하면 어쨌든 상단으로 튀어 나오지 않아야 함).

    둘째, -0을 곱하십시오.981 바닥에 수신 거부 괜찮습니다하지만 모든 반복에서 yspeed 추가 상수 0.4 중력 우려하고 있어요. 볼이 바닥 수준 아래로 떨어질 수 있는지 확인하기 전에 이동을 한 이후로 바닥에서 흔들리는 원인이 무엇인지 생각합니다.

    내가 함께 이동을 대체하여 지상 수준 이하로 가지 않을 수있는 y 값을 확보하려고 할 것

    :

    if (getY() + getHeight() + yspeed > 200) { 
        move(xspeed, 200 - getY() - getHeight()); 
    } else { 
        move(xspeed, yspeed); 
    } 
    
    1

    문제는 그 반송 정말 작은받을 때

    yspeed *= -0.981; 
    

    라인이 짧게 이어질 것입니다. 공은 바닥 아래로 내려 가서 다시 올라 오지만 결국 바닥 아래에있게되므로 (0.981 < 1.0이므로) 결국 퇴화 작용을합니다. 이 경계 아래에 항상 있기 때문에 당신이하지 않습니다, 위치를 고정함으로써

    if(getY() + getHeight() > 200){ 
        yspeed *= -0.981; 
        setY(400 - getY() - getHeight()); // I believe this is right. 
    } 
    

    감소하고 빠르게 증가하고 항상 감소하는 상황에 집착하지 않습니다 사이의 대체 : 여기 당신이 그것을 해결 방법 .

    +0

    200 - getY() + getHeight() - 200) = 200 - getY() - getHeight() + 200 = 400 - getY() - getHeight – qpingu

    1

    [편집 : 내가 오해 생각, 그래서 이것은 아마 많이 사용하지 않습니다 :)]

    if(getY() + getHeight() > 200){ 
        yspeed *= -0.981; 
    } 
    

    당신은 모든 업데이트에 대한 수직 속도를 부정하고 있습니다. 아마 업데이트 크기 슬라이스에서 중력을 처리하려고합니다. 당신이 (초당 30 프레임의 경우)

    // Define some constants 
    SecondsPerUpdate = (1.0f/30); 
    AccelDueToGravity = 0.981; 
    
    if(getY() + getHeight() > 200){ 
        yspeed -= (AccelDueToGravity * SecondsPerUpdate); 
    }