-3
public class circleGame extends JApplet{
private boolean animationDone;
private ArrayList<Circle> circles = new ArrayList<Circle>();

public void init(){
    createCircles(10);

    new Thread(){

        @Override
        public void run(){
            while(!animationDone){
                updateAnimation();
                repaint();
                delayAnimation();
            }
        }
    }.start();
}

public void createCircles(int amount){
    for(int i=0; i<amount; ++i){
        circles.add(new Circle());
    }
}

public void delayAnimation(){
    try {
        Thread.sleep(30);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void updateAnimation(){
    for(Circle circle: circles){
        circle.x+= circle.deltaX/20.0;
        circle.y+= circle.deltaY/20.0;
    }
}

public void paint(Graphics g){
    Graphics2D g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    for(Circle circle: circles){
        g2d.setColor(circle.color);
        int xPosition = (int) (circle.x-circle.radius);
        int yPosition = (int) (circle.y-circle.radius);
        int diameter = circle.radius*2;

        g2d.fillOval(xPosition, yPosition,
                   diameter, diameter);

    }
}

現在のコードのように、特定の量の円を作成し、ドラッグや色の末尾なしでアニメーション化できるようにしようとしています。円は、色をドラッグすることなく、JApplet を滑らかに移動する必要があります。

4

1 に答える 1

3

これを行う簡単な方法の 1 つは、前に描画されたものをすべてクリアすることです。

g2d.clearRect(0, 0, getWidth(), getHeight());

メソッドの最初にpaint。ただし、円を描画する専用の を使用し、の代わりにそのメソッドJComponentをオーバーライドすることをお勧めします。これにより、これが自動的に処理され、アプレットがちらつくのを防ぐこともできます。paintComponentpaint

class CirclesComponent extends JComponent {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // insert content of your paint method here
    }
}

this.getContentPane().add(new CirclesComponent());これをメソッドの先頭に追加してアプレットに追加しinit、元のメソッドを削除しますpaint

于 2013-09-09T08:44:04.837 に答える