2012-03-15 4 views
2

학교 프로젝트에서 Java의 보드 게임 위험 요소를 코딩하고 있습니다. 각 지역을 별도의 버튼으로 만들어야합니다. 나는 각각의 영토를 투명한 배경을 지닌 다른 그림으로 분리했다. 2D 자바 버튼은 사각형 지향이므로 알파 값을 사용해야 할 수도 있습니다. 각 영토의 배경에 투명 배경이 주어 졌기 때문입니다. 내가 그렇게 할 경우리스크 코딩 (게임) : 지역의 버튼 모양 만들기

는 두 가지 문제가 존재하게 : 버튼의 투명 영역을 누르면되는 경우

  1. 나도 몰라.
  2. 본래의 직사각형 모양 때문에 단추가 겹치고 시작하기 위해 클릭 한 불투명 한 픽셀이 포함 된 단추 만 있으면됩니다.

아니면 게임 코딩에 접근하는 데 더 효율적인 방법이 있습니까? 도움이 필요하시면 언제든지 환영합니다. 온라인 보드 게임의 자바 버전을 발견했지만 이해할 수는 없습니다. (그것은 지배를 표시하지만, 실제로 위험이 있습니다. Link to the map || The link to the game I found online

+0

도움이 될 수 있습니다. http://stackoverflow.com/questions/6735891/creating-custom-jbutton-from-images-cont aining-transparent-pixels –

답변

3

여기에 나와 있지 않은 영역에서만 동작을 사용할 수 있습니다. 투명성.

당신이 그것을 이미지 아이콘을 제공하고 알파 당신은 어떤 그림자가 당신을 오는 경우 경우

사용 setMinimumDetectionAlpha()는 PNG로 클래스를 제공 감지를 제외하고 단지의 JButton처럼 작동

IMAGEBUTTON.java.

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.image.BufferedImage; 
import javax.swing.ImageIcon; 

@SuppressWarnings("serial") 
public class ImageButton extends javax.swing.JButton implements MouseListener{ 

private MouseListener mouseListener = null; 
private BufferedImage bufferedImage; 
private int minAlpha = 0x0; 
private boolean userMouseListener = false; 

public ImageButton(ImageIcon ic){ 
    super(); 
    setPreferredSize(new Dimension(ic.getIconWidth(), ic.getIconHeight())); 
    setImage(ic); 
    addMouseListener(this); 
} 
protected BufferedImage imageIconToBufferedImage(ImageIcon a){ 
    BufferedImage bi = new BufferedImage(a.getIconWidth(), a.getIconHeight(), BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2d = (Graphics2D) bi.getGraphics(); 
    g2d.drawImage(a.getImage(), 0,0,null); 
    g2d.dispose(); 
    return bi; 
} 
public void setImage(ImageIcon ic){ 
    bufferedImage = imageIconToBufferedImage(ic); 
    repaint(); 
} 
protected void paintComponent(Graphics g){ 
    Graphics2D g2d = (Graphics2D) g; 
    RenderingHints _rh = g2d.getRenderingHints(); 
    g2d.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2d.drawImage(bufferedImage, 0, 0, null); 
    g2d.setRenderingHints(_rh); 
} 
protected void setMinimumDetectionAlpha(int alpha){ 
    minAlpha = alpha == 0 ? 1 : alpha; 
    minAlpha = minAlpha % 0x000000FF << 0x00000010; 
} 
protected void processMouseEvent(MouseEvent e) { 
    if(checkInBounds(e.getX(), e.getY())){ 
     switch(e.getID()){ 
      case MouseEvent.MOUSE_CLICKED: mouseListener.mouseClicked(e);  break; 
      case MouseEvent.MOUSE_ENTERED: mouseListener.mouseEntered(e);  break; 
      case MouseEvent.MOUSE_EXITED: mouseListener.mouseExited(e);  break; 
      case MouseEvent.MOUSE_PRESSED: mouseListener.mousePressed(e);  break; 
      case MouseEvent.MOUSE_RELEASED: mouseListener.mouseReleased(e);  break; 
     }   
     e.consume();    
    } 
} 
public void addMouseListener(MouseListener a){ 
    if(!userMouseListener) 
     super.addMouseListener(a); 
    else 
     mouseListener = a; 
    userMouseListener = true;  
} 
protected boolean checkInBounds(int x, int y){ 
    try{   
     if((bufferedImage.getRGB(x, y) & 0xFF000000)>>>4 >= (minAlpha > 0 ? minAlpha : 0x08800000)) 
      return true; 
     else 
      throw new Exception(); 
    }catch(Exception e){ 
     return false; 
    } 
} 
@Override 
public void mouseClicked(MouseEvent e) {  processMouseEvent(e);  } 
@Override 
public void mouseEntered(MouseEvent e) {  processMouseEvent(e);  } 
@Override 
public void mouseExited(MouseEvent e) {  processMouseEvent(e);  } 
@Override 
public void mousePressed(MouseEvent e) {  processMouseEvent(e);  } 
@Override 
public void mouseReleased(MouseEvent e) {  processMouseEvent(e); } 
} 
그냥 가서 사용이

import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 


public class Test { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    JFrame jmb = new JFrame(); 
    ImageButton ib = new ImageButton(new ImageIcon("res/buttonImage.png")); 
    ib.setMinimumDetectionAlpha(0); 
    ib.addMouseListener(new MouseListener(){ 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      System.out.println("eventFired");  

     } 

    }); 
    jmb.add(ib); 
    jmb.pack(); 
    jmb.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jmb.show(); 
} 

} 

이미지처럼 사용할 수 있습니다

이었다 나는이 당신을 도움이되기를 바랍니다이

buttonImage.png

같은 : D

+1

좋은 답변 +1 – mKorbel

3

여러 버튼을 사용하지 마십시오 단지 지정으로 그린 ​​패널에 MouseListener를 추가?

나의 주저 내가조차 의심한다는 것입니다 수 투명 버튼을 사용하면 겹쳐 졌을 때 원하는 동작을 얻을 수 있습니다. 클릭을 처리 할 때 약간의 고급스러운 point-in-polygon 알고리즘이 도움이 될 수 있습니다.

+1

['Polygon'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Polygon.html)에는 적절한'contains()'구현이 있습니다. – trashgod

+0

Rob, 맞춤형 패널을 만들려면 어떻게해야합니까? 바보 같이 들리면 미안해.하지만 이걸 아주 신기 하네. 도와 줘서 고마워. – user1272300

+0

'JPanel'을 확장하는 새로운 클래스를 만들고'paintComponent (Graphics)'메소드에 대한 오버라이드를 추가하십시오. –