2016-11-23 16 views
2

申し訳ありませんが、完全なJava初心者です。私はチェッカーゲームのために正方形の格子を前にしましたが、六角形の格子に問題があります。私は正方形のグリッドで同じアイデアをたどりましたが、私はJPanel上に小さな小さな点を持っていますが、私はこれの理由が分からないが、私は周りを見回し、何が間違っているかを見てみました。JPanelにコンポーネントが表示されていませんか? (ヘキサゴングリッド)

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); 
    } 
} 

上にボードを追加するためのテストファイルは、私は、六角アイコンをレイアウトするために正方形の格子を使用することができますが、私は、グリッドがお互い

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

かに整列するので、それが目的に反し

似たようなだからこの ![Only used the size of 2 in this one] 1

+0

これは完全なコードですか?それは私が使用したすべてのコードです。 –

+0

多くの重大な欠陥があります:bkgnd.draw(g2、x、y、2、true);その方法の中にx yは関連性がありません...あなたが完全な初心者であれば、複雑なモンスターで何をやっていますか? – gpasch

+0

自分は確信していませんが、プロジェクトとして試してみると思いました。そして、GameHexagon(行、col、x、y、true)を作成すると、xとyが設定されると仮定しました。コンポーネント内では、bkgnd.draw(g2、x、y、2、true)で描画されます。 –

答えて

0

中2のサイズを使用し、私はあなたがpを使用していないことに気づきましたoglgonsとjava.awt.*クラスに付属の.fill()メソッドを使用してください。代わりにそれを使用することをお勧めしたいと思います。ここでは、ポリゴンメソッドに役立つウェブサイトへのリンクがいくつかあります。

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は子です多角形の、それを継承すべきではないのですか? –

+0

真実、私はそれを考えなかった、私はあなたのコードをより慎重に読むでしょう –

+0

この質問は既に尋ねられています。ここに答えへのリンクがあります:http://stackoverflow.com/questions/20734438/algorithm-to-generate-a-hexagonal-grid-with-coordinate-system –

関連する問題