2017-08-31 14 views
-1

私はJavaの静的なビジュアル表現を作成する方法をかなり探していますが、探しているものを達成する最も正しい方法であることがわかりません。JAVAビジュアル表現

Javaでボードの状態を表す画像を単純に作成する方法を探しています。たとえば、Javaでチェッカーの実装があるとしましょう。それぞれの移動後にゲームボードを表す方法を探しています。

私はJavaFXとSwingを見てきましたが、実際の動的GUIに適していると判断して、画像処理ではなく(誤っている可能性があります)

本当にどのオプションがありますか?または、私はこれのために任意の外部アプリ/ソフトウェアを使用する必要がありますか?

+0

おそらくあなたは、[実行カスタムペイント](https://docs.oracle.com/を見ている必要がありますjavase/tutorial/uiswing/painting /)と[グラフィックスの使い方](https://docs.oracl – MadProgrammer

+0

'私が探しているのは、個々の移動後にゲームボードを表現する方法です.' - イメージを作成したいだけなら、 [Screen Image](https://tips4java.wordpress.com/2008/10/13/screen-image/)クラスを使用することができます。 Swingコンポーネントのイメージを作成することができます。 – camickr

+0

"私が探しているのは、個々の移動の後、ゲームボードを表現する方法です" - >それは "実際の動的GUI"ではないのですか?あなたがしようとしていることをよりよく説明できますか? 「Javaの静的なビジュアル表現」とは何ですか? – jewelsea

答えて

1

あなたはPNGファイルに市松模様の画像をレンダリングします。このような何か(JavaFXのソリューションを)試みることができます。あなたの質問が私には少し不明だったので、あなたが探しているものであるかどうかは分かりませんが、おそらくそれはあなたのために役立ちます。

snapshot-0


snapshot-1


snapshot-2

import javafx.application.*; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.scene.*; 
import javafx.scene.image.WritableImage; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.nio.file.*; 
import java.util.ArrayList; 
import java.util.List; 

public class Checkout extends Application { 

    private static final double SQUARE_SIZE = 20; 
    private static final double PIECE_RADIUS = SQUARE_SIZE/2.5; 

    private static final Color WHITE = Color.BEIGE; 
    private static final Color BLACK = Color.ROSYBROWN; 

    // setupindex, player, position (1-32 index into top to bottom black squares on the board). 
    private static final int[][][] setups = 
      { 
        { 
          {31, 27, 19}, 
          {17, 12, 5} 
        }, 
        { 
          {30, 26, 18}, 
          {19, 11, 10}, 
        }, 
        { 
          {31, 24, 19}, 
          {18, 11, 10} 
        } 
      }; 
    private static final String SNAPSHOT_FILE_PREFIX = "snapshot-"; 
    private static final String SNAPSHOT_FILE_SUFFIX = ".png"; 

    private WritableImage snapshotFxImage = 
      new WritableImage((int) (SQUARE_SIZE * 8), (int) (SQUARE_SIZE * 8)); 
    private BufferedImage snapshotBufferedImage = 
      new BufferedImage((int) (SQUARE_SIZE * 8), (int) (SQUARE_SIZE * 8), BufferedImage.TYPE_INT_ARGB); 

    private static final String USER_HOME = 
      System.getProperties().getProperty("user.home"); 


    @Override 
    public void start(Stage stage) throws IOException { 
     Group layout = new Group(); 
     renderBoard(layout); 
     Scene scene = new Scene(layout); 

     int i = 0; 
     for (int[][] setup : setups) { 
      List<Node> pieces = renderSetup(setup); 
      layout.getChildren().addAll(pieces); 
      snapshot(scene, i); 
      layout.getChildren().removeAll(pieces); 

      i++; 
     } 

     Platform.setImplicitExit(false); 
     Platform.exit(); 
    } 

    private void renderBoard(Group layout) { 
     for (int r = 0; r < 8; r++) { 
      for (int c = 0; c < 8; c++) { 
       Rectangle square = new Rectangle(
         c * SQUARE_SIZE, 
         r * SQUARE_SIZE, 
         SQUARE_SIZE, 
         SQUARE_SIZE 
       ); 

       Color fill = 
         (((c + r) % 2) == 0) 
           ? Color.WHITE 
           : Color.BLACK; 
       square.setFill(fill); 

       layout.getChildren().add(square); 
      } 
     } 
    } 

    private List<Node> renderSetup(int[][] setup) { 
     List<Node> pieces = new ArrayList<>(); 
     for (int player = 0; player < 2; player++) { 
      for (int pieceIndex = 0; pieceIndex < setup[player].length; pieceIndex++) { 
       Color fill = 
         player == 0 
           ? WHITE 
           : BLACK; 
       Circle piece = new Circle(PIECE_RADIUS, fill); 

       pieces.add(piece); 
       movePieceTo(piece, setup[player][pieceIndex]); 
      } 
     } 

     return pieces; 
    } 

    private void movePieceTo(Circle circle, int p) { 
     int r = (p - 1)/4; 
     int c = ((p - 1) % 4) * 2 + (((r % 2) == 0) ? 1 : 0); 

     circle.setCenterX(c * SQUARE_SIZE + SQUARE_SIZE/2); 
     circle.setCenterY(r * SQUARE_SIZE + SQUARE_SIZE/2); 
    } 

    private void snapshot(Scene scene, int snapshotIdx) throws IOException { 
     Path path = Paths.get(
       USER_HOME, 
       SNAPSHOT_FILE_PREFIX + snapshotIdx + SNAPSHOT_FILE_SUFFIX 
     ); 
     scene.snapshot(snapshotFxImage); 
     SwingFXUtils.fromFXImage(snapshotFxImage, snapshotBufferedImage); 
     ImageIO.write(snapshotBufferedImage, "png", path.toFile()); 

     System.out.println("Saved: " + path.toString()); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
2

Graphicsクラスを使用すると、メモリイメージに描画できます。それをファイルに保存したり、何らかの方法で表示することができます。相続人は、あなたがそれをやって始めるかもしれない方法の例は:

import javax.imageio.ImageIO; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

public class SO45990731 { 

    public static void main(String [] args) throws IOException { 
     BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB); 

     Graphics g = image.getGraphics(); 

     // TODO draw your checker board 
     g.drawOval(100, 100, 300, 300); 

     // cleanup and write 
     g.dispose(); 
     ImageIO.write(image, "png", new File("board.png")); 
    } 
} 
+0

最も良い解決策ではありませんが、簡単な方法で問題を解決します。 much – eXistanCe

+2

@eXistanCeこの方法は、Javaで画像を描画するための非常に標準的な方法です。また、ボードのイメージを読み込み、peicesを描画することもできます(または 'g.drawImage()'を使って他のイメージからそれらを配置することもできます)。これにより、Javaですべてを実行することなく、きれいな出力を作成しやすくなります。 –

+0

@eXistanCeはほとんど忘れていました。 'Graphics'オブジェクトは' Graphics2D'クラスにキャストできます。 –