所以我刚刚学习了Java的基础知识,并准备尝试创建一个类似于Civ风格的原型游戏。 所以一个平铺和回合制的游戏。
我为不同的瓷砖创建了一个枚举:
public enum TerrainTile{ WATER(1), GRASSLAND(1), HILL(2), FORREST(2), BLANK(99); private final int id; private final int moveCost; private boolean hidden = true; private TerrainTile(int moveCost) { this.id = this.ordinal(); this.moveCost = moveCost; }
我做了一个JFrame:
public class MainFrame extends JFrame { private MapPanel pnlMap; public MainFrame(Terrain map) { setTitle("MyGame"); setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().setPreferredSize(new Dimension(500, 500)); pnlMap = new MapPanel(map); pnlMap.setPreferredSize(new Dimension(500, 500)); add(pnlMap); pack(); setLocationRelativeTo(null); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { BufferedImage mapImg = null; try { mapImg = ImageIO.read(MainFrame.class.getClassLoader().getResourceAsStream("frames/resources/map2.png")); } catch (IOException e) { e.printStackTrace(); } Terrain map = new Terrain(mapImg); System.out.println("Terrain created:"); map.printTerrain(); JFrame frame = new MainFrame(map); frame.setVisible(true); }
和一个JPanel的地图:
public class MapPanel extends JPanel { private final Terrain map; public MapPanel(Terrain map) { this.map = map; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); }
当我不知道在哪里保存瓷砖的纹理。 我应该只读出地图数组,并做一个switch语句来在MapPanel类中定义要绘制的纹理,还是应该在枚举中更好地实现纹理?
看看这个 。
对于所有的瓷砖都有一个单一的图像,并在渲染时绘制不同的部分。
然后你可以像这样绘制你的瓷砖:
int mx = tileId % numberOfTileCols; int my = tileId / numberOfTileRows; graphics.drawImage(image, x, y, x + tileWidth, y + tileHeight, mx * tileWidth, my * tileHeight, mx * tileWidth + tileWidth, my * tileHeight + tileHeight, this);
这样你就可以在MapPanel中存储一个纹理,但是却不需要巨大的switch语句。