2016-11-23 4 views
2

Извините, новичок в java. Раньше я делал квадратную сетку, для игры с шашками, однако у меня проблемы с гексагональной сеткой. Однако я придерживался той же идеи, что и квадратная сетка. У меня маленькие маленькие точки на моем JPanel, хотя я не уверен, в чем причина этого, я осмотрелся и попытался понять, что может быть неправильным.JPanel не отображает компоненты? (Hexagon Grid)

GameBoard.java; отвечает за отрисовку Шестигранники

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; компоненты шестигранные быть обращено на борту

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; ответственный за рисование шестиугольников Этот код я получил от программиста в stackoverflow с небольшими изменениями, и я пробовал его сам, и он работал, однако, я просмотрел его и не уверен, что не так, или почему он не совместим с тем, что я делает.

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; тестовые файлы, чтобы добавить плату на 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); 
    } 
} 

Я мог бы использовать квадратную сетку выложить шестигранные иконки, но это поражение цели, потому что я хочу, чтобы сетка для выравнивания друг с другом

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

или нечто подобное

Используется размер 2 в этом ![Only used the size of 2 in this one1]

+0

Это полный код? Вот и весь код, который я использовал –

+0

, у вас много серьезных недостатков: bkgnd.draw (g2, x, y, 2, true); x y не имеет никакого отношения к этому методу ... если вы полностью начинаете, что делаете со сложным монстром? – gpasch

+0

Не уверен, я думал, что попробую это как проект. И я предположил, что x и y будут установлены после создания GameHexagon (строка, col, x, y, true). И внутри компонента он будет рисовать с помощью bkgnd.draw (g2, x, y, 2, true). –

ответ

0

Итак, я заметил, что вы не используете р oggons и метод .fill(), который входит в класс java.awt.*. Я бы рекомендовал использовать это вместо этого. Вот несколько ссылок на сайты, которые могут помочь в использовании метода многоугольника.

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

Надежда это было полезно!

+0

добавил 'g2.fill (bkgnd)', но то же самое, и Hexagon.java является дочерним из Polygon, не следует ли наследовать? –

+0

Правда, я не думал об этом, я более внимательно прочитаю ваш код. –

+0

Этот вопрос уже задан. Вот ссылка на ответ: http://stackoverflow.com/questions/20734438/algorithm-to-generate-a-hexagonal-grid-with-coordinate-system –

Смежные вопросы