2011-10-02 53 views
0

嘿傢伙即時製作一個java遊戲,黃色塊在遊戲屏幕上隨機出現,你必須收集它們。這些對象是從一個類創建的,我想知道是否有方法來繪製所有這些對象?在java中繪製多個對象?

這是滋生它們的代碼:

package OurGame; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.*; 

public class coins extends JPanel implements ActionListener { 
Timer t; 
coin c; 

    public coins() { 
     t = new Timer(1000,this); 
     t.start(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("1 Second"); 

     Random rx = new Random(); 
     Random ry = new Random(); 

     c = new coin(rx.nextInt(640),ry.nextInt(480)); 
    } 

} 

,這是硬幣本身的代碼。

package OurGame; 

import java.awt.Image; 

import javax.swing.ImageIcon; 

public class coin { 
Image coin; 

int x,y; 
     public coin(int x1, int y1) { 

      ImageIcon i = new ImageIcon("C:/coin.png"); 
      coin = i.getImage(); 

      x = x1; 
      y = y1; 
     } 

     public Image getImage(){ 
      return coin; 
     } 

     public int getX(){ 
      return x; 
     } 

     public int getY() { 
      return y; 
     } 
} 

如果你可以幫忙,會很棒。

+0

難道你只是把你現在的代碼在'for'循環? – Andy

+0

nitpick:不要爲x和y創建一個Random對象,也不要在actionPerformed中不必要地重新創建。爲該類創建一個Random對象,並在需要時爲x和y使用它。 –

回答

1

你有兩個選擇:

1)保存所有硬幣的列表,並覆蓋paintComponent()方法,爲您的JPanel並調用添加了COINT後重繪()。

2)Coin可以擴展一些提供paintComponent方法的JComponent;那麼你可以在你的JPanel中調用this.add(...);和this.rePaint()。

一些側面說明:

1)你的形象應該是靜態的;否則每個硬幣都有一個圖像;雖然它是相同的圖像。

示例代碼:

package OurGame; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.Random; 

import javax.swing.*; 

public class coins extends JPanel implements ActionListener { 
    private Timer t; 
    private ArrayList<Coin> coins = new ArrayList<Coin>(); 

    public coins() { 
     t = new Timer(1000,this); 
     t.start(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("1 Second"); 

     Random rx = new Random(); 
     Random ry = new Random(); 

     this.coins.add(new Coin(rx.nextInt(640),ry.nextInt(480))); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     for(Coin coin : this.coins) { 
      g.drawImage(coint.getImage(), coin.getX(), coint.getY(), observer); 
     } 
    } 
} 
+0

只要不產生一堆新圖像,就不需要靜態圖像。他所有的代碼必須做的就是接受一個圖像引用作爲構造函數參數,以便將相同的圖像傳遞給每個構造函數。 –

+0

我會如何去做選擇1?你能舉個例子嗎? –

+0

我添加了一個簡單的例子。 – MasterCassim

3

爲什麼不創建硬幣的ArrayList(類名應爲大寫)或ArrayList中。然後,如果您需要在顯示屏上添加或刪除硬幣,您可以將其從ArrayList中添加或刪除。然後,paintComponent方法可以循環遍歷循環中的每個硬幣的for循環中的數組列表。

此外,顯示硬幣的最簡單方法是將其放入ImageIcon中,然後使用它來設置JLabel的圖標。

例如與圖像縮放,使硬幣更小,並與圖像過濾器,以改變白色背景透明:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.AffineTransform; 
import java.awt.image.AffineTransformOp; 
import java.awt.image.BufferedImage; 
import java.awt.image.FilteredImageSource; 
import java.awt.image.ImageFilter; 
import java.awt.image.ImageProducer; 
import java.awt.image.RGBImageFilter; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.Random; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

public class Coins extends JPanel implements ActionListener { 
    private static final String COIN_URL_PATH = "http://cdn.dailyclipart.net/wp-content/uploads/medium/clipart0273.jpg"; 
    private static final String COIN_URL_PATH2 = "http://content.scholastic.com/content/media/products/71/0439510171_rgb15_xlg.jpg"; 
    private static final String COIN_URL_PATH3 = "http://uscoinstoday.com/images/e/130580876887_0.jpg"; 
    private static final int PAN_WIDTH = 900; 
    private static final int PAN_HT = 700; 
    protected static final int TRANSPARENT = new Color(255, 255, 255, 0) 
     .getRGB(); 
    private Timer t; 
    private BufferedImage coinImage; 
    private ImageIcon coinIcon; 
    private Random random = new Random(); 

    public Coins() { 
     setLayout(null); 
     try { 
     coinImage = ImageIO.read(new URL(COIN_URL_PATH)); 
     double scaleFactor = 0.35; 
     BufferedImage destImg = new BufferedImage((int)(coinImage.getWidth() * scaleFactor), 
       (int) (coinImage.getHeight() * scaleFactor), BufferedImage.TYPE_INT_ARGB); 
     AffineTransform at = AffineTransform.getScaleInstance(scaleFactor, scaleFactor); 
     AffineTransformOp ato = new AffineTransformOp(at, 
       AffineTransformOp.TYPE_BICUBIC); 
     ato.filter(coinImage, destImg); 

     ImageFilter whiteToTranspFilter = new RGBImageFilter() { 

      @Override 
      public int filterRGB(int x, int y, int rgb) { 
       Color color = new Color(rgb); 
       int colorSum = color.getBlue() + color.getRed() + color.getGreen(); 
       int maxColorSum = 600; 
       if (colorSum > maxColorSum) { 
        return TRANSPARENT; 
       } 
       return rgb; 
      } 
     }; 
     ImageProducer ip = new FilteredImageSource(destImg.getSource(), whiteToTranspFilter); 
     Image destImg2 = Toolkit.getDefaultToolkit().createImage(ip); 


     coinIcon = new ImageIcon(destImg2); 
     t = new Timer(1000, this); 
     t.start(); 

     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PAN_WIDTH, PAN_HT); 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("1 Second"); 

     Coin c = new Coin(random.nextInt(640), random.nextInt(480), coinIcon); 
     add(c.getCoinLabel()); 
     revalidate(); 
     repaint(); 
    } 

    public static void main(String[] args) { 
     Coins coins = new Coins(); 
     JFrame frame = new JFrame("Coins"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(coins); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 

class Coin { 
    JLabel coinLabel = new JLabel(); 

    public Coin(int x1, int y1, ImageIcon coinIcon) { 
     coinLabel.setIcon(coinIcon); 
     coinLabel.setLocation(x1, y1); 
     coinLabel.setSize(coinLabel.getPreferredSize()); 
    } 

    public JLabel getCoinLabel() { 
     return coinLabel; 
    } 

} 
+0

+1真的,使我的簡單理論在實踐中的工作(我認爲)= P – Andy

+0

你能給我一個這個如何工作的例子嗎?我是新來的java:L –

+0

@DuncanPalmer:發佈示例。 –