2016-09-14 7 views
0

JPanelを作成する必要があります。マウスをクリックすると、新しいスプライトが新しいスレッドに表示されます。これは私が持っているものです。Java:一度に複数のスプライトを異なるスレッドで描画する

public class BouncingSprites { 

    private JFrame frame; 
    private SpritePanel panel = new SpritePanel(); 
    private Sprite ball; 

    public BouncingSprites() { 
     frame = new JFrame("Bouncing Sprite"); 
     frame.setSize(400, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setVisible(true); 
    } 
    public void start(){ 
     panel.animate(); // never returns due to infinite loop in animate method 
    } 

    public static void main(String[] args) { 
     new BouncingSprites().start(); 
    } 
} 

クラスSpritePanel:

public class SpritePanel extends JPanel 
{ 
    Sprite sprite; 

    public SpritePanel() 
    { 
     addMouseListener(new Mouse()); 
    } 

    //method for creating a new ball 
    private void newSprite (MouseEvent event) 
    { 
     sprite = new Sprite(this); 
    } 

    public void animate() 
    { 
    } 

    private class Mouse extends MouseAdapter 
    { 
     @Override 
     public void mousePressed(final MouseEvent event) 
     { 
      newSprite(event); 
     } 
    } 


    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     if (sprite != null) 
     { 
      sprite.draw(g); 
     } 
    } 
} 

クラススプライト:

public class Sprite implements Runnable 
{ 
    public final static Random random = new Random(); 
    final static int SIZE = 10; 
    final static int MAX_SPEED = 5; 
    SpritePanel panel; 
    private int x; 
    private int y; 
    private int dx; 
    private int dy; 
    private Color color = Color.BLUE; 
    private Thread animation; 

    public Sprite (SpritePanel panel) 
    { 
     this.panel = panel; 
     x = random.nextInt(panel.getWidth()); 
     y = random.nextInt(panel.getHeight()); 
     dx = random.nextInt(2*MAX_SPEED) - MAX_SPEED; 
     dy = random.nextInt(2*MAX_SPEED) - MAX_SPEED; 

     animation = new Thread(this); 
     animation.start(); 
    } 

    public void draw(Graphics g) 
    { 
     g.setColor(color); 
     g.fillOval(x, y, SIZE, SIZE); 
    } 

    public void move() 
    { 

     // check for bounce and make the ball bounce if necessary 
     // 
     if (x < 0 && dx < 0){ 
      //bounce off the left wall 
      x = 0; 
      dx = -dx; 
     } 
     if (y < 0 && dy < 0){ 
      //bounce off the top wall 
      y = 0; 
      dy = -dy; 
     } 
     if (x > panel.getWidth() - SIZE && dx > 0){ 
      //bounce off the right wall 
      x = panel.getWidth() - SIZE; 
      dx = - dx; 
     }  
     if (y > panel.getHeight() - SIZE && dy > 0){ 
      //bounce off the bottom wall 
      y = panel.getHeight() - SIZE; 
      dy = -dy; 
     } 

     //make the ball move 
     x += dx; 
     y += dy; 
    } 

    @Override 
    public void run() 
    { 
     while (Thread.currentThread() == animation) 
     { 
      move(); 
      panel.repaint(); 

      try 
      { 
       Thread.sleep(40); 
      } 
      catch (InterruptedException exception) 
      { 
       exception.printStackTrace(); 
      } 
     } 
    } 
} 

このコードは、新しい移動スプライトを作成します。しかし、以前のスプライトはパネルから削除されます。私がする必要があるのは、新しいスプライトをマウスクリックで追加して、前のスプライトが削除されないようにすることです。私が3回クリックすると、3つのスプライトが描かれます。

これを実装するためにコードを変更するにはどうすればよいですか?

多くの感謝!

答えて

1

SpritePanelクラスのSprite sprite;List<Sprite> sprites = new ArrayList<>();に置き換えることができます。次に、新しいSpriteを作成したら、それをリストに追加します。次に、paintComponentメソッドでは、すべてのスプライトを描画してリストを反復することができます。

+0

素晴らしい!どうもありがとうございます! –

関連する問題