public MapPanel(ClientGameBoard gl) { super(); _dismiss = false; gameLogic = gl; gameLogic._mapPanel = this; _hexes = new ArrayList<Hex>(); vertexContents = new Hashtable<CoordPair, Pair>(); roadContents = new Hashtable<Pair, Integer>(); portContents = new Hashtable<Pair, BoardObject.type>(); diceImage = new BufferedImage(582, 98, BufferedImage.TYPE_INT_ARGB); Graphics2D g = diceImage.createGraphics(); g.drawImage(BoardObject.images.get(BoardObject.type.DICE), null, null); g.dispose(); rings = gameLogic.getNumRings(); hexleft = 100 - (int) (radius + (Math.floor(rings / 2) * radius + Math.floor((rings - 1) / 2) * radius * 2)); if (rings % 2 == 0) { hexleft -= radius / 2; } hextop = 300 - (int) (radius * 0.866 + (rings - 1) * 2 * (radius * 0.866)); double border = 0.4; HashMap<Pair, Pair> hexData = gameLogic.getHexInfo(); // call the gamelogic Pair currCoord = gameLogic.getStartPoint(); Pair topCoord = currCoord; int ring = 0; int currentDir = 5; int current = 0; int[][] directions = {{1, 1}, {0, 2}, {-1, 1}, {-1, -1}, {0, -2}, {1, -1}}; int[][] HexCoordDirections = {{2, 1}, {0, 2}, {-2, 1}, {-2, -1}, {0, -2}, {2, -1}}; Hex top = new Hex( 100, 300, radius, (BoardObject.type) (hexData.get(currCoord).getA()), (Integer) (hexData.get(currCoord).getB())); Hex curr = top; _hexes.add(top); while (true) { if (current == ring) { currentDir++; current = 0; } if (currentDir > 5) { currentDir = 0; current = 0; ring++; if (ring < rings) { topCoord = new Pair(currCoord.getA(), (Double) (currCoord.getB()) - 2); currCoord = topCoord; top = new Hex( curr.getX(), (curr.getY() - 2 * (Math.cos(Math.PI / 6) * (curr.getRadius() + border))), curr.getRadius(), (BoardObject.type) (hexData.get(currCoord).getA()), (Integer) (hexData.get(currCoord).getB())); curr = top; } else { break; } } currCoord.setA((Object) ((Double) (currCoord.getA()) + HexCoordDirections[currentDir][0])); currCoord.setB((Object) ((Double) (currCoord.getB()) + HexCoordDirections[currentDir][1])); curr = new Hex( (curr.getX() + directions[currentDir][0] * (curr.getRadius() + border) * 3 / 2), (curr.getY() + directions[currentDir][1] * (Math.cos(Math.PI / 6) * (curr.getRadius() + border))), curr.getRadius(), (BoardObject.type) (hexData.get(currCoord).getA()), (Integer) (hexData.get(currCoord).getB())); _hexes.add(curr); current++; } addMouseListener(this); addMouseMotionListener(this); }
public synchronized void paint(Graphics graphics) { Graphics2D g = (Graphics2D) graphics; Image water = Toolkit.getDefaultToolkit().getImage("catanui/water.jpg"); g.drawImage(water, 0, 0, this); for (Hex o : _hexes) { o.paint(g, _display_offset[0], _display_offset[1]); } g.translate(_display_offset[0] + 2, _display_offset[1] - 1); synchronized (portContents) { for (Pair c : portContents.keySet()) { int lowx = hexleft + (((CoordPair) c.getA()).getX() - (((CoordPair) c.getA()).getX() % 2)) / 2 * intervalSide[0] + (((CoordPair) c.getA()).getX() - (((CoordPair) c.getA()).getX() % 2)) / 2 * intervalSide[1] + (((CoordPair) c.getA()).getX() % 2) * intervalSide[0]; int lowy = hextop + ((CoordPair) c.getA()).getY() * intervalUp; int highx = hexleft + (((CoordPair) c.getB()).getX() - (((CoordPair) c.getB()).getX() % 2)) / 2 * intervalSide[0] + (((CoordPair) c.getB()).getX() - (((CoordPair) c.getB()).getX() % 2)) / 2 * intervalSide[1] + (((CoordPair) c.getB()).getX() % 2) * intervalSide[0]; int highy = hextop + ((CoordPair) c.getB()).getY() * intervalUp; int dx = highx - lowx; int dy = highy - lowy; double rad = Math.atan((1.0) * dy / dx); if (dx < 0) rad += Math.PI; g.translate(lowx, lowy); g.rotate(rad); g.drawImage( BoardObject.images.get(BoardObject.type2port.get(portContents.get(c))), 0, -75, null); g.rotate(-rad); g.translate((-1) * lowx, (-1) * lowy); } } g.translate((-1) * _display_offset[0], (-1) * _display_offset[1]); synchronized (roadContents) { for (Pair c : roadContents.keySet()) { Road r = new Road( hexleft + (((CoordPair) c.getA()).getX() - (((CoordPair) c.getA()).getX() % 2)) / 2 * intervalSide[0] + (((CoordPair) c.getA()).getX() - (((CoordPair) c.getA()).getX() % 2)) / 2 * intervalSide[1] + (((CoordPair) c.getA()).getX() % 2) * intervalSide[0], hextop + ((CoordPair) c.getA()).getY() * intervalUp); r.setX2( hexleft + (((CoordPair) c.getB()).getX() - (((CoordPair) c.getB()).getX() % 2)) / 2 * intervalSide[0] + (((CoordPair) c.getB()).getX() - (((CoordPair) c.getB()).getX() % 2)) / 2 * intervalSide[1] + (((CoordPair) c.getB()).getX() % 2) * intervalSide[0]); r.setY2(hextop + ((CoordPair) c.getB()).getY() * intervalUp); r.setColor(roadContents.get(c)); r.paint(g, _display_offset[0], _display_offset[1]); } } synchronized (vertexContents) { for (CoordPair c : vertexContents.keySet()) { int newx = hexleft + ((c._x - (c._x % 2)) / 2 * intervalSide[0] + (c._x - (c._x % 2)) / 2 * intervalSide[1] + (c._x % 2) * intervalSide[0]) - 20; int newy = hextop + c._y * intervalUp - 20; if ((BoardObject.type) (vertexContents.get(c).getA()) == BoardObject.type.SETTLEMENT) { Settlement s = new Settlement(newx, newy, (Integer) (vertexContents.get(c).getB())); s.paint(g, _display_offset[0], _display_offset[1]); } else if ((BoardObject.type) (vertexContents.get(c).getA()) == BoardObject.type.CITY) { City s = new City(newx, newy, (Integer) (vertexContents.get(c).getB())); s.paint(g, _display_offset[0], _display_offset[1]); } else System.out.println("neither -_-"); } } g.setColor(Color.GRAY); g.fill(new Rectangle(0, 0, 110, 60)); g.setColor(Color.LIGHT_GRAY); g.fill(new Rectangle(3, 3, 104, 56)); if (_dieRoll > 0) { BufferedImage r1img = diceImage.getSubimage((int) (Math.floor((twoDice[0] - 1) * 94.7)), 0, 94, 93); g.drawImage(r1img, 5, 7, 48, 47, null); BufferedImage r2img = diceImage.getSubimage((int) (Math.floor((twoDice[1] - 1) * 94.7)), 0, 94, 93); g.drawImage(r2img, 55, 7, 48, 47, null); } if (_up != null) _up.paint(g); if (!_gameOver.equals("") && !_dismiss) { _currAlpha += 0.007; } g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, _currAlpha)); g.setColor(Color.GRAY); g.fill(new Rectangle(-20, 0, 1020, 650)); g.setColor(Color.BLACK); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) 1.0)); if (!_gameOver.equals("")) { if (_currAlpha >= 0.8) { if (_gameOver.equals(gameLogic._name)) { g.drawString("Congratulations, you won!", 350, 200); } else { g.drawString(_gameOver + " has won!", 350, 200); } _dismiss = true; } else repaint(); } }