2014-11-02 85 views
1

我是Java编程新手,并且>我正在尝试制作2D游戏。 我在网站上搜索我的问题的答案,但我没有找到它,所以我希望我做的是正确的事情。 所以,我得到了一个名为Board的类,它扩展了JPanel并实现了ActionListener。 在这个委员会中,我画了一些“区域”,这是一个关联图像的类。 我的问题是,当我点击主板时,我想获得我点击的“区域”,但实际上我通过mouseClicked事件获得了主板。 我希望我是可以理解的,这里的板类:在JPanel上获得点击目标Netbeans

public class Board extends JPanel implements ActionListener { 
    private List<Zone> zones = new ArrayList<Zone>(); 

    public Board() { 
     addMouseListener(new TAdapter()); 
     setFocusable(true); 
     setBackground(Color.BLACK); 
     setDoubleBuffered(true); 
     Dalle[] dalle1C = new Dalle[]{new Dalle()}; 
     zones.add(new Zone(false, false, dalle1C, null, "zone1D1C.jpg", 0, 0)); 
     zones.add(new Zone(false, false, dalle1C, null, "zone2D1C.jpg", 150, 0)); 
     timer = new Timer(5, this); 
     timer.start(); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     for (Zone zone : zones) { 
      g2d.drawImage(zone.getImage(), zone.getX(), zone.getY(), this); 
     } 
     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     repaint(); 
    } 


    private class TAdapter extends MouseAdapter { 

     public void mouseClicked(MouseEvent e) { 
      //Here, instead of using x,y positions I want to get something like "e.getClickedObject()" 
      Integer x = e.getX(); 
      Integer y = e.getY(); 
      Zone zone_selected = null; 
      for (Zone zone : zones) { 
       if (x > zone.getX() && x < zone.getX_end() && y < zone.getY_end() && y > zone.getY(){ 
        zone_selected = zone; 
       } 
      } 
      zones.remove(zone_selected); 
      // And Here I want to use repaint method but this is not possible if you have a solution... 
     } 
    } 

} 

和区域类:

public class Zone { 
private String name; 
private boolean piece; 
private boolean egout; 
private List<Dalle> dalles = new ArrayList<Dalle>(); 
private List<Connexion> connexions = new ArrayList<Connexion>(); 
private List<Personnage> personnages = new ArrayList<Personnage>(); 
private Image image; 
private Integer x; 
private Integer y; 
public Integer x_end; 
public Integer y_end; 

public Zone(boolean piece, boolean egout, Dalle[] dalles, List<Connexion> connexions, String image_name, Integer x, Integer y) { 
    this.piece = piece; 
    this.egout = egout; 
    this.dalles.addAll(Arrays.asList(dalles)); 
    for(Dalle dalle : dalles) { 
     dalle.addZone(this); 
    } 
    this.name = image_name; 
    this.connexions = connexions; 
    ImageIcon ii = new ImageIcon(this.getClass().getResource(image_name)); 
    image = ii.getImage(); 
    this.x = x; 
    this.y = y; 
    this.x_end = x + image.getWidth(null); 
    this.y_end = y + image.getHeight(null); 
} 
+1

请提供'Zone'类的代码。 – afzalex 2014-11-02 13:10:43

+0

提供的代码! – user3734658 2014-11-02 13:17:50

回答

1

一个JComponentBoard看到相对鼠标事件,它的左上角,点( 0, 0)默认情况下,为了获得内部的坐标,可以

  • 使用组件的网格,如图所示here

  • 通过坐标的线性缩放来插值点,如here所示。

+0

谢谢!这正是我正在寻找的! – user3734658 2014-11-02 13:35:41

+0

不客气。 – trashgod 2014-11-02 13:40:41

+0

我解决了一个新问题,我想要一个特殊的网格,例如:line 1:Zone1 Zone2 Zone3 Zone4 Zone4 Zone5 Zone6 Zone6 Zone6 是否有可能拥有此类型的gridLayout? – user3734658 2014-11-02 14:06:57