我一直在尝试为我的Roguelike游戏添加一个JLabel。不幸的是,它似乎不起作用。到目前为止,这是我的代码:
public void updateDraw(int direction){ int[] pos = Dungeon.getPos(); for(int i=pos[1]-(DISPLAY_Y_SIZE/2) ; i<pos[1]+(DISPLAY_Y_SIZE/2) ; i++){ for(int j=pos[0]-(DISPLAY_X_SIZE/2) ; j<pos[0]+(DISPLAY_X_SIZE/2) ; j++){ labelGrid[i-(pos[1]-(DISPLAY_Y_SIZE/2))][j-(pos[0]-(DISPLAY_X_SIZE/2))].setIcon(tiles[Dungeon.getMapTile(i,j)].getIcon()); } } labelGrid[DISPLAY_Y_SIZE/2][DISPLAY_X_SIZE/2].add(character); this.repaint(); }
我已经阅读了一些其他问题的解决方案,并且只需将JLabel添加到另一个解决方案中就可以完成。它不按这里的预期工作,为什么?
PS:我不想为我的JPanel使用JLayeredPane。
不要使用组件(即JLabels)创建游戏环境。相反,您可以绘制所有游戏对象。
例如,如果您正在执行以下操作:
JLabel[][] labelGrid = JLabel[][]; ... ImageIcon icon = new ImageIcon(...); JLabel label = new JLabel(icon); ... for(... ; ... ; ...) { container.add(label); }
相反,您可以一起去除所有标签,也可以使用Images代替ImageIcons,然后可以将所有图像绘制到单个组件表面上。也许像这样:
Images
ImageIcons
public class GamePanel extends JPanel { Image[][] images = new Image[size][size]; // init images @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image,/* Crap! How do we know what location? Look Below */); } }
Grapchics.drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
因此,要解决位置问题(即x和y,哦以及大小),我们可以使用一些好的旧的OOP抽象。创建一个包装图像,位置和尺寸的类。例如
class LocatedImage { private Image image; private int x, y, width, height; private ImageObserver observer; public LocatedImage(Image image, int x, int y, int width, int height, ImageObserver observer) { this.image = image; ... } public void draw(Graphics2D g2d) { g2d.drawImage(image, x, y, width, height, observer); } }
然后,您可以在面板中使用一堆此类的实例。就像是
public class GamePanel extends JPanel { List<LocatedImage> imagesToDraw; // init images // e.g. imagesToDraw.add(new LocatedImage(img, 20, 20, 100, 100, this)); @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D)g.create(); for (LocatedImage image: imagesToDraw) { image.draw(g2d); } g2d.dispose(); } }
一旦有了这个概念,就有很多不同的可能性。