2

Sorry, a complete beginner to java. I have done a square grid before, for a checkers game, however I am having trouble for a hexagonal grid. I followed the same idea of with the square grid however, I have small little dots on my JPanel, although I am not sure what is the reason for this, I have looked around and tried to see what could be wrong.

GameBoard.java ; responsible for drawing the Hexagons

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collections;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

//import CheckerBoard.GameSquareMouseListener;


public class GameBoard extends JPanel {
    protected final static int size = 8;
    protected final static int radius = 50;
    protected final static int padding = 5;
    private Position oldPosition = null;


    public GameBoard(){
        super ();
        int numPieceSpots = 0;
        int x = 0; int y = 0;
        int xOff = (int) Math.cos(Math.toRadians(30)) * (radius + padding);
        int yOff = (int) Math.sin(Math.toRadians(30)) * (radius + padding);
        int half = size / 2;
        GameHexagon hex = null;

        for (int r = 0; r < size; r++){
            for (int c = 0; c < size; c++)
            {
                if (((r + c) % 2 == 0) && (r % 2 == 1)){
                    hex = new GameHexagon(r, c, x, y);
                }
                else if (((r + c) % 2 == 0) && (r % 2 == 0))
                {
                    hex = new GameHexagon(r, c, x, y);
                }
                else {
                    hex = new GameHexagon(r, c, x, y);
                }
                if (c == (size - 1)){
                    x = 0;
                    y += yOff;
                }
                add (hex);
                x += xOff*c;
            }
        }
        repaint();
    }
}

GameHexagon.java ; the hexagon components to be drawn onto the board

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JComponent;

public class GameHexagon extends JComponent
{
    private int x;
    private int y;

    private Position pos = null;

    //private GamePiece piece = null;

    public GameHexagon (int row, int col, int xp, int yp)
    {
        super ();

        pos = new Position (row, col);
        x = xp;
        y = yp;
    }

    public void paintComponent (Graphics g)
    {
        super.paintComponents (g);

        Graphics2D g2 = (Graphics2D) g;

        int height = getHeight();
        int width = getWidth();

        //Rectangle2D.Double bkgnd = new Rectangle2D.Double (x, y, width, height);
        Hexagon bkgnd = new Hexagon(x, y, pos.r, pos.c, 50);
        bkgnd.draw(g2, x, y, 2, true);

        g.setColor(new Color(0xFFFFFF));
        g.drawString("TEST", x - 25, y + 25);

    }   
}

Hexagon.java ; responsible for drawing the hexagons This code I got from a programmer on stackoverflow with minor edits, and I tried it myself and it worked, however, I skimmed through it and not sure what is wrong, or why it isnt compatible with what I am doing.

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Hexagon extends Polygon {

    private static final long serialVersionUID = 1L;

    public static final int SIDES = 6;

    private Point[] points = new Point[SIDES];
    private Point center = new Point(0, 0);
    private int radius;
    private int rotation = 90;


    public Hexagon(Point center, int xlabel, int ylabel, int radius) {
        npoints = SIDES;
        xpoints = new int[SIDES];
        ypoints = new int[SIDES];

        this.center = center;
        this.radius = radius;

        updatePoints();
    }

    public Hexagon(int x, int y, int xlabel, int ylabel, int radius) {
        this(new Point(x, y), xlabel, ylabel, radius);
    }


    public int getRadius() {
        return radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;

        updatePoints();
    }

    public int getRotation() {
        return rotation;
    }

    public void setRotation(int rotation) {
        this.rotation = rotation;

        updatePoints();
    }

    public void setCenter(Point center) {
        this.center = center;

        updatePoints();
    }

    public void setCenter(int x, int y) {
        setCenter(new Point(x, y));
    }

    private double findAngle(double fraction) {
        return fraction * Math.PI * 2 + Math.toRadians((rotation + 180) % 360);
    }

    private Point findPoint(double angle) {
        int x = (int) (center.x + Math.cos(angle) * radius);
        int y = (int) (center.y + Math.sin(angle) * radius);

        return new Point(x, y);
    }

    protected void updatePoints() {
        for (int p = 0; p < SIDES; p++) {
            double angle = findAngle((double) p / SIDES);
            Point point = findPoint(angle);
            xpoints[p] = point.x;
            ypoints[p] = point.y;
            points[p] = point;
        }
    }

    public void draw(Graphics2D g, int x, int y, int lineThickness, boolean border) {
        // Store before changing.
        Stroke tmpS = g.getStroke();
        Color tmpC = g.getColor();

        g.setStroke(new BasicStroke(lineThickness, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER));

        if (border)
            g.fillPolygon(xpoints, ypoints, npoints);
        else
            g.drawPolygon(xpoints, ypoints, npoints);

        // Set values to previous when done.

        g.setColor(tmpC);
        g.setStroke(tmpS);

    }



}

GameTest.java ; test files to add board onto JFrame

import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;

/**
   A program that allows users to edit a scene composed
   of items.
*/
public class GameTest
{

    public static void main(String[] args) {
        JFrame f = new JFrame();
        GameBoard p = new GameBoard();

        f.add (p, BorderLayout.CENTER);

        f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        f.setSize (600, 600);
        f.setVisible (true);
   }
}

I could use a Square Grid to lay out the hex icons, but that defeats the purpose because I want the grid to align to each other

*-*-*-*-*
-*-*-*-*-
*-*-*-*-*

or something similar

Used a size of 2 in this ![Only used the size of 2 in this one]1

Bao Thai
  • 533
  • 1
  • 6
  • 25
  • that is the full code? That's all the code I used – Bao Thai Nov 23 '16 at 20:11
  • you have many serious flaws: bkgnd.draw(g2, x, y, 2, true); the x y has no relevance inside that method... if you a re a complete beginer what are you doing with a complicated monster? – gpasch Nov 23 '16 at 20:39
  • Not sure myself, I thought I would try it as a project. And I assumed x and y will be set once I construct a GameHexagon(row,col,x,y,true). And within the component, it will draw with bkgnd.draw(g2,x,y,2,true). – Bao Thai Nov 23 '16 at 20:56
  • I guess I was assuming that drawing based on x and y axis would be easier to draw component since I do not want to use a grid – Bao Thai Nov 23 '16 at 21:29

1 Answers1

0

So, I noticed that you aren't using polygons and the .fill() method that comes in the java.awt.* class. I'd recommend using that instead. Here is a couple of links to websites that can help with the polygon method.

http://mathbits.com/MathBits/Java/Graphics/GraphingMethods.htm http://www.java2s.com/Code/Java/2D-Graphics-GUI/DrawaPolygon.htm

Hope this was useful!

Josh Heaps
  • 335
  • 1
  • 8
  • added `g2.fill(bkgnd)` but same dots, and Hexagon.java is a child of Polygon, shouldn't it inherit? – Bao Thai Nov 23 '16 at 05:38
  • True, I didn't think of that, I'll read through your code more carefully – Josh Heaps Nov 23 '16 at 05:44
  • This question has already been asked. Here is a link to the answer: http://stackoverflow.com/questions/20734438/algorithm-to-generate-a-hexagonal-grid-with-coordinate-system – Josh Heaps Nov 23 '16 at 05:45
  • I have looked at that. That is where I got the hexagon.java file from, however, I am trying to use a JComponent so I can use the hexagonal grid for a game. It is much harder to introduce a MouseEvent with shapes considering I must have to set the border, and I am still new so I am still trying to get the basics. – Bao Thai Nov 23 '16 at 05:53