2013-03-26 3 views
0

나는 창을 끝낼 때까지 그래픽 창 아래쪽과 위쪽에서 GOval 공을 다시 위아래로 튀기는 간단한 애니메이션을 만들려고합니다. 문제는 공을 그래픽 창 하단을 인식하고 다른 방향으로 튀어 나오게하는 방법을 이해하지 못한다는 것입니다. 즉, 공은 바닥에서 튀어 나오지 않고 계속 떨어지고 결국 스크린 하단에서 사라집니다.
이 문제에 대해 생각할 때 올바른 방법은 무엇입니까? < 공이 아래로 내려 가야한다는 단계입니다. 나는 공이 위로 튀어 오르고 다시 떨어지는 상태가 무엇인지 이해하지 못한다.기본 튀는 공

import acm.program.*; 
import acm.graphics.*; 

public class BouncingBall extends GraphicsWindow{ 
    public void run(){ 
     GOval ball = new GOval(0, 0, OVAL_SIZE, OVAL_SIZE); 
     ball.setFilled(true); 
     add(ball); 

     int dx = 0; 
     int dy = 1; 

     while(true) { 
      int i = 0; 
      if (i < STEPS) { 
       ball.move(dx, dy); 
       pause(PAUSE_TIME); 
      } 
      if (??) { 
       ball.move(dx, - dy); 
       pause(PAUSE_TIME); 
      } 
      i++; 
     } 
    } 

    private static final STEPS = 1000; 
    private static final OVAL_SIZE = 25; 
    private static final PAUSE_TIME = 7; 
} 

답변

2

GraphicsWindow 대신 GraphicsProgram을 의미 했습니까?

GraphicsProgram에는 getHeight() 방법이 있습니다.이 방법은 귀하의 창 크기를 알려줍니다. 그래서이 경우에 :

if (ball.getY() + ball.getHeight() >= getHeight()) { 
    dy = -dy; 
} 

이것은 공이 화면의 맨 아래를 지나갈 때 y- 속도를 반전시킵니다. 앞뒤로 튀어 오르기를 원하면 화면 상단에 비슷한 코드를 쓸 수 있습니다.

+0

예, oops 저는 GraphicsWindow가 아니라 GraphicsProgram을 의미합니다. –

+0

좋아, 코드에 해당 조건을 사용하고 속도를 반전하고 작동하는지 확인하십시오. –

+0

감사합니다. –

0

여기에 기본 알고리즘은 객체가 표시 영역의 가장자리와 충돌 할 때 결정하기 위해 개체에 표시 영역의 크기와 범위의 크기를 사용하는 것입니다. 이 경우 속도 벡터의 해당 요소를 무효화하십시오.

0

는이 같은 부울 방향을 저장해야 : 볼이 윈도우의 끝에 도달

boolean up=true; 
    while(true){ 

    if (up){ 
    ball.move(dx, dy); 
    pause(PAUSE_TIME); 
    } 
    else 
    { 
    ball.move(dx, - dy); 
    pause(PAUSE_TIME); 
    } 
    if(getHeight()<=ball.getHeight+ball.getY()||ball.getHeight()<=ball.getY){ 
    up=!up;  
    } 
    } 

이제 경우, 그것의 방향과 반대 방향으로 이동을 변경합니다.

+0

이를 위해 부울을 만드는 것은 꼭 필요한 것은 아닙니다. y- 속도를 부정하면 (dy = -dy) 코드가 약간 더 필요합니다. –