2017-04-25 2 views
-1

私はJavaで新しい。私は自分のプロジェクトに簡単なagarioゲームを作りたい。しかし、私は問題があります。 Panel上でランダムな停止サークルを作成したいが、私のサークルは停止したり変更されたりしない。Panel上でランダムな停止サークルを作成したいが、私のサークルが停止して変更されない

問題はタイマーだと思います。

class TestPanel extends JPanel implements ActionListener{ 
TestPanel(){ 
    Timer t = new Timer(50,this); 
    t.start(); 
} 

Random rnd = new Random(); 


int r = rnd.nextInt(256); 
int b = rnd.nextInt(256); 
int gr = rnd.nextInt(256); 

Color randomColor = new Color(r,b,gr); 

Ellipse2D.Double ball = new Ellipse2D.Double(0, 0, 40, 40); 
double v = 10; 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 

    Graphics2D g2 =(Graphics2D)g; 


    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 


    g2.setColor(Color.RED); 
    g2.fill(ball);  

    int NumOfCircles = 70; 
    int diameter; 
    int x, y; 


    Graphics2D g3 =(Graphics2D)g; 



    for(int count = 0; count < NumOfCircles; count++){ 
     diameter = rnd.nextInt(10); 
     x = rnd.nextInt(600); 
     y = rnd.nextInt(620); 
     g3.setColor(randomColor); 
     g3.fillOval(x, y, diameter, diameter); 
    } 

    } 


@Override 
public void actionPerformed(ActionEvent arg0) { 
    Point p = getMousePosition(); 
    if(p==null) return; 
    double dx = p.x - ball.x - 20; 
    double dy = p.y - ball.y - 20; 
    if(dx*dx+dy*dy >12){ 
    double a=Math.atan2(dy, dx); 
    ball.x += v * Math.cos(a); 
    ball.y += v * Math.sin(a);} 
    repaint(); 
} 

}

答えて

0

問題は、あなたの絵のコードです。 Swingがペイントロジックを呼び出すタイミングを制御することはできません。したがって、ペイントコードはパネルのプロパティに基づいてオブジェクトをペイントするだけで、プロパティを変更しないでください。

これが意味:

  1. ランダムな値を生成しませんが、塗装方法です。

  2. クラスのコンストラクタでは、サークルを生成し、各サークルにデフォルトのサイズ/位置を割り当てます。この情報は、ArrayListに格納されます。次にpaintComponent()メソッドで、Listを繰り返して各サークルをペイントします。

  3. TimerActionListenerでは、ArrayListを介して各サークルの位置を更新します。次に、パネル上でrepaint()を呼び出して、すべてのサークルを再描画します。

たとえば、チェックアウト:How to move two circles together in a JFrame from two different classes

関連する問題