2015-09-01 99 views
0

我用Java編寫我的第一個遊戲。所以我有Board類擴展JPanel,並且在這個類中我有paintComponent方法。卡片圖像是BufferedImages。如何將顏色層添加到paintComponent方法中的圖像?

現在...我剛剛完成了方法,計算可能的球員移動。爲了說明一下,我有敵人卡場,並且每當敵方卡場在玩家移動範圍內時,我想爲敵人卡場圖添加一些圖層。

我在的paintComponent方法的代碼是這樣的:

if(!field.isWithinMove()){ 
//draw normal state card 
    g.drawImage(field.getLoadedCard().getCardImage(), 
    field.getX(), field.getY(), Card.cardWidth, Card.cardHeight, null); 
} 
else{ 
//there should be a card picture with layer of color 
} 

我的目標是:

正常:

Normal

突出顯示:

enter image description here

我將不勝感激您的幫助:)

乾杯!

回答

4

您正在尋找alpha組件。顏色可以表示爲RGB或RGBA。區別在於RGBA增加了一個額外的透明通道。

... 

Color overlay = new Color(0 , 0 , 200 , 
     150//alpha component 
); 

g.setColor(overlay); 
g.fillRectangle(...);//fill in position of the image here 

越高阿爾法複合材料中,顏色的不透明度越高,其中,255是像傳統的RGB彩色畫沒有阿爾法分量和:因此,基本上可以使用這種附加的信道油漆過的圖像的矩形0就像根本不繪畫(完全透明)。

+0

非常感謝您! :) –

5

你可以讓使用AlphaComposite來改變其中的圖形渲染,例如方式...

Normal and highlighted

import java.awt.AlphaComposite; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private BufferedImage img; 

     public TestPane() { 
      try { 
       img = ImageIO.read(source of your image here); 
      } catch (IOException ex) { 
       Logger.getLogger(JavaApplication393.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(189 * 2, 270); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      // Normal 
      g2d.drawImage(img, 0, 0, this); 
      // Highlighted 
      g2d.drawImage(img, img.getWidth(), 0, this); 
      g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f)); 
      g2d.setColor(UIManager.getColor("List.selectionBackground")); 
      g2d.fillRect(img.getWidth(), 0, img.getWidth(), img.getHeight()); 
      g2d.dispose(); 
     } 

    } 

} 

現在,你實際上可以預渲染這個(有「正常」和「突出」的形象),但歸結到您的需求

注:我從當前外觀使用的顏色List.selectionBackground和感覺填充顏色,可以用什麼前夕更換R顏色你想

看一看Trail: 2D GraphicsCompositing Graphics更多細節

相關問題