2014-01-17 2 views
0

나는 자바에있는 튀는 공 신청을 창조했다. 목표는 mousePressed()에 볼을 표시하고 프레임을 벗어나지 않고 벽에서 튀어 오르게하는 것입니다. 오직 하나의 공 하나의 스레드가 쉽게해야합니다. 내 문제는 볼을 만들기 위해 클릭 할 때마다 속도가 빨라지고 그 이유는 모르겠다는 것입니다. 누군가 제발 나를 도울 수 있어요. 추신 : 나는 스레드에 처음이다.자바 간단한 튀는 공, SingleThread, 쥐 청취자, JFrame

import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MyFrame extends JPanel { 
public int xPos, yPos, xDir = 3, yDir = 4; 
public int diameter = 50; 

public MyFrame(){ 
    final JFrame thisFrame = new JFrame(); 
    thisFrame.add(this); 
    thisFrame.setTitle("Bouncing Ball"); 
    thisFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    thisFrame.setLocationRelativeTo(null); 
    thisFrame.setSize(500, 500); 

    this.addMouseListener(new MouseListener() { 
     @Override 
     public void mouseReleased(MouseEvent e) {} 
     @Override 
     public void mousePressed(MouseEvent e) { 
      xPos = e.getX(); 
      yPos = e.getY(); 
      Thread t = new Thread() { 
       @Override 
       public void run() { 
        while(true){ 
         try{ 
          Thread.sleep(10); 
         }catch(Exception e){}; 
         xPos += xDir; 
         yPos += yDir; 

         if(xPos + diameter >= thisFrame.getWidth() - 25 || xPos <= 0) xDir = -xDir; 
         if(yPos + diameter >= thisFrame.getHeight() - diameter || yPos <= 0) yDir = -yDir; 
         repaint(); 
        } 
       } 
      }; 
      t.start(); 
     } 
     @Override 
     public void mouseExited(MouseEvent e) {} 
     @Override 
     public void mouseEntered(MouseEvent e) {} 
     @Override 
     public void mouseClicked(MouseEvent e) {} 
     }); 

    thisFrame.setVisible(true); 

    } 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.fillOval(xPos, yPos, diameter, diameter); 
    } 
} 
public class MyMain{ 

    public static void main(String[] args) { 
     new MyFrame(); 
    } 

} 
+0

모든 마우스 이벤트 메서드를 재정의 할 필요가 없을 때 미래에'MouseAdapter'를 사용하십시오. –

답변

1

클릭 할 때마다, 당신은 X/Y 위치를 업데이트하는 다른 스레드를 의미 새로운 스레드를 시작하고있다. 동기 당 2 당신은 사이클 당 두 번 X/Y 위치 적어도을 업데이트하고 의미 일단 예를 들어

1 개 스레드는 갱신은 x/P를 의미하고, 이것은 단지 새로운 스레드를 추가 할 때마다 혼합됩니다 .

보다 나은 해결책은 Thread을 좀 더 일찍 시작한 다음 List을 사용하여 공의 위치와 방향을 유지하는 것입니다.

16 밀리 초는 대략 60 FPS이며, 참고로 40 밀리 초 지연이 대략 초당 25 프레임입니다 조금하지만 동기화가

안전한 물건을 유지하기 위해 필요합니다. IMHO, 10 밀리 초가 과도한 것처럼 보입니다 ...

+0

정확하게 이해하면 클릭 할 때마다 이전 스레드가 죽지 않습니다. 다중 스레드 결과 ...? 미안하지만 좀 혼란스러워. 내가 마우스를 누른 상태에서 초기화 된 스레드를 마우스로 누른 상태에서 초기화해야한다고 말하는거야? 그렇다면 다시 시작하기 전에 종료해야할까요? 당신의 도움을 주셔서 감사합니다. – Matz0rz

+0

첫 번째 부분은 그렇습니다. 두 번째 부분은 당신이하고 싶은 일에 달려 있습니다. 그렇다면 단지 하나의 공을 원한다면. 단순히 x/y 위치를 재설정하고 다른 것에 대해 걱정하지 않아도됩니다. 더 많은 공을 원한다면 각 공을 관리하는 데 필요한 정보를 유지하기 위해 일종의 목록을 사용해야합니다. – MadProgrammer

+0

javax.swing.Timer는 업데이트 지점에서 관리하고 안전해질 것이라는 점도 지적해야합니다 보기의 – MadProgrammer