2016-12-23 7 views
0

私は単純なJavaゲームを作ろうとします。それは常に私はそのための別のクラスを書いて、私はメインでそれを呼び出すが、私はそれをJavaで背景グラフィックスを停止するには?

を動作しませんでした enter image description here

を変更する、それが正常に動作しますが、私は背景を描くが、私は、正方形の色を停止していません@ SuppressWarnings(「シリアル」)は

class BackPan extends JFrame{ 


    private JLayeredPane layers; 
    private JPanel down; 
    static int width = Board.boardWidth; 
    static int height = Board.boardHeight; 
    Random rnd = new Random(); 

    public BackPan(){ 

      layers = new JLayeredPane(); 
      rnd =new Random(); 
      down = new JPanel(){ 
      public void paintComponent(Graphics g){ 
      Graphics2D g2d = (Graphics2D)g; 
      //*************************************************************** 
      int low = 50; 
      int high = 255; 
      for(int i = 0; i<= width; i+=50){ 
       g2d.setColor(new Color(rnd.nextInt(high-low)+low,rnd.nextInt(high-low)+low,rnd.nextInt(high-low)+low));    
       g2d.fillRect(i, 50, 50, 50); 
       for(int j = 0; j<= height; j += 50){ 
        g2d.setColor(new Color(rnd.nextInt(high-low)+low,rnd.nextInt(high-low)+low,rnd.nextInt(high-low)+low)); 
        g2d.fillRect(i, j, 50, 50);     
       } 
      } 
      } 
      }; 
      //**************************************************************** 
      down.setBounds(0, 0, width, height); 
      layers.add(down, new Integer(1)); 
      getContentPane().add(layers, BorderLayout.CENTER); 


    } 

} 
+1

GUIがリフレッシュする必要があるときはいつでも、 'paintComponent'が呼び出されるので、毎回ランダムな色が得られます。あなたは配列/行列の中にランダムな値を保存し、 'paintComponent'の中に色を生成するのではなくペイントすることができます – BackSlash

+0

@BackSlash:Calculatorが提供する答えよりも確かに優れています。バックスラッシュが示すように、元のポスター - あなたがコントロールできないメソッド内でpaintComponentメソッドをランダム化しないでください。他の場所でランダム化する代わりに、結果をフィールドに保存してから、paintComponent内のそのフィールドを使用して描画します。 –

答えて

3

あなたのランダム化のために、設定された種子を使用するよりも良い、単に2つの方法のいずれかによってランダムに画像を修正:

  1. あなたが必要なときにランダム化してから使用する色の配列を作成します。背景を描画するときのこの配列
  2. さらに、ランダムな色をBufferedImageに描画し、paintComponentメソッドで描画します。これを再ランダム化する必要がある場合は、イメージを再作成します。後者の例

は、画像ボタンが(createBackground()メソッドを呼び出して)押された場合にのみ再ランダム化注意:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ColorSquares extends JPanel { 
    public static final int SQR_SIDE = 50; 
    public static final int COLUMNS = 20; 
    public static final int ROWS = 16; 
    private int columns; 
    private int rows; 
    private int sqrSide; 
    private Image backgroundImg;  

    public ColorSquares(int columns, int rows, int sqrSide) { 
     this.columns = columns; 
     this.rows = rows; 
     this.sqrSide = sqrSide; 
     backgroundImg = createBackground(); 
     add(new JButton(new AbstractAction("New Background") { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       backgroundImg = createBackground(); 
       repaint(); 
      } 
     })); 
    } 

    public Image createBackground() { 
     int w = columns * sqrSide; 
     int h = rows * sqrSide; 
     BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
     Graphics g = img.getGraphics(); 
     for (int r = 0; r < rows; r++) { 
      for (int c = 0; c < columns; c++) { 
       float hue = (float) Math.random(); 
       float saturation = (float) (Math.random() * 0.5 + 0.5); 
       float brightness = (float) (Math.random() * 0.5 + 0.5); 
       Color randColor = Color.getHSBColor(hue, saturation, brightness); 
       g.setColor(randColor); 
       int x = c * sqrSide; 
       int y = r * sqrSide; 
       g.fillRect(x, y, sqrSide, sqrSide); 
      } 
     } 
     g.dispose(); 
     return img; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (backgroundImg != null) { 
      g.drawImage(backgroundImg, 0, 0, this); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(columns * sqrSide, rows * sqrSide); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Colors"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new ColorSquares(COLUMNS, ROWS, SQR_SIDE)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

BufferedImageを使用することの追加の利点は、ありますあなたがそれをやっているときよりも、これを描く方が速いです。

+0

+1 - 今日の私のコメントにあなたの返信を読んだ。私は背景全体を一度生成し、それを画像に保存して、 'paintComponent'メソッドの中の他の不要な配列やループを避けることを考えなかったことを認めなければなりません。確かにすべてを配列に保存することは、ランダム化のための種を設定するよりもうまくいくが、一度イメージを作成してバックグラウンドで使用するのは間違いない。いいです! – BackSlash

+0

@BackSlash:ありがとう! –

0

最も簡単な解決策は、一定のランダムシードを記憶しrnd.setSeed()paintComponentが呼び出されるたびを介して設定することであろう。たとえば、次のように

private final static int SEED = 1000; 
rnd.setSeed(SEED); 
+1

いいえ、申し訳ありませんが、これは控えめな解決策です。 –

関連する問題