Coding Risk (игра): придание кнопкам формы территорий - PullRequest
2 голосов
/ 15 марта 2012

Я пишу настольную игру Risk in java для проекта в школе.Мне нужно сделать каждую из территорий отдельной кнопкой.У меня каждая территория разделена на разные картинки с прозрачным фоном.Я понимаю, что двумерные Java-кнопки ориентированы на прямоугольники, поэтому мне, возможно, придется использовать альфа-значения, поскольку фон каждой территории получил прозрачный фон.

Если я это сделаю, возникнут две проблемы:

  1. Я не знаю, нажимается ли прозрачная область кнопки.
  2. Кнопки перекрываютсяиз-за их врожденной прямоугольной формы, и мне нужна только кнопка, содержащая непрозрачный пиксель, который был нажат для инициации.

Или есть ли вообще более эффективный способ кодирования игры?Любая помощь приветствуется, так как она очень нужна.Я нашел java-версию настольной игры онлайн, но не могу ее понять.(Это обозначено как доминирование, но на самом деле это риск. Ссылка на карту || Ссылка на игру, которую я нашел в сети

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Вот кое-что, что я сделал, что вы можете пойти дальше и использовать, который ощущает движение только в областях без прозрачности.

IMAGEBUTTON.java работает так же, как JButton, за исключением того, что вы присваиваете ему imageIcon и чувствует, что альфа предоставляет класс,

Используйте setMinimumDetectionAlpha () на случай, если у вас появятся тени, png.

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

3 голосов
/ 15 марта 2012

Можете ли вы избежать использования нескольких кнопок и просто добавить MouseListener на нарисованную пользователем панель?

Мое сомнение в том, что я сомневаюсь, что даже с прозрачными кнопками вы получите поведение, которое вы хотите, когда они перекрываются.Может оказаться полезным какой-нибудь причудливый алгоритм точка-многоугольник при обработке клика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...