JavaFX でゲームプログラミング超入門 その1
JavaFX でRPGのアプリケーションを作る
前回T Umezawa
T Umezawa - YouTube
さんの動画を紹介しましたが、僕もそのゲームプログラミングをやりたいと思います。
動画では、Swingを使って進められていますが、勉強のためにJavaFXで書きたいと思います。
動画にて、Swingを使っているところから僕もJavaFXで書いているのですが、それ以前のプログラムも書かなければいけません。
実際には、Part30までのモンスターの表示画面まで作成しました。
www.youtube.com
モンスターの画像は、"ぴぽや"というゲーム素材を公開しているサイトから利用させて頂きました。
blog.pipoya.net
Part1はここから見ることができます。
【Java】ゲームプログラミング超入門 Part01 - YouTube
参考にしたサイト
javafx.scene.image.Imageをトリミングする - 路地裏牧場
【JavaFX】オブジェクトの拡大、縮小、反転、回転 | のんぽぐ
JavaFX 画像表示・画像処理(ピクセル操作)|軽Lab
コード
package application; import java.nio.file.Path; import java.nio.file.Paths; import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.layout.Background; import javafx.scene.layout.BackgroundFill; import javafx.scene.layout.CornerRadii; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.stage.Stage; public class RPG extends Application{ public static void main(String[] args) { launch(args); } // ステータスのラベル Label stLabel = new Label(); // モンスターの画面の配置 HBox mbox = new HBox(); @Override public void start(Stage stage) throws Exception{ // 画面の設定 stage.setTitle("RPG"); stage.setWidth(750); stage.setHeight(400); // ステータスラベルの設定 stLabel = new Label("主人公"); stLabel.setPrefHeight(100); stLabel.setPrefWidth(750); stLabel.setAlignment(Pos.TOP_CENTER); // ラベルの設定 Label label = new Label("魔王が世界を滅ぼそうとしています。"); label.setFont(new Font(30)); label.setTextFill(Color.BLACK); label.setPrefHeight(100); label.setPrefWidth(750); label.setAlignment(Pos.CENTER); // キャラクタ―の絵をトリミングし、イメージビューにセットし、mboxに追加する putCharacter(1, 0, 0, 32, 32, 100, 100); putCharacter(2, 0, 0, 32, 32, 100, 100); mbox.setAlignment(Pos.CENTER); // 背景の設定 mbox.setBackground(new Background(new BackgroundFill(Color.AQUAMARINE, CornerRadii.EMPTY, Insets.EMPTY))); mbox.setPrefHeight(150); mbox.setPrefWidth(750); // ラベル、モンスターを垂直に配置 VBox root = new VBox(); root.getChildren().addAll(stLabel, mbox, label); root.setAlignment(Pos.CENTER); //画面を表示する 画面の色は白 stage.setScene(new Scene(root, Color.WHITE)); stage.show(); } /* キャラクタの画像をmboxにセットする * @param n キャラクタの番号 1: ゴースト, 2: ガイコツ * @param x 元の画像のx座標 * @param y 元の画像のy座標 * @param cW セルの幅 * @param cH セルの高さ * @param sW 表示する画像の幅 * @param sH 表示する画像の高さ */ public void putCharacter(int n, int x, int y, int cW, int cH, int sW, int sH) { // キャラクターのイメージを作成 Path chaPath =null; switch(n) { case 1: chaPath = Paths.get("CharaChip/sample041.png"); break; case 2: chaPath = Paths.get("CharaChip/sample046.png"); break; } Image chaImg = new Image(chaPath.toUri().toString()); // 画像をトリミングする WritableImage reChaImg = new WritableImage(chaImg.getPixelReader(),x*cW, y*cH, cW,cH); ImageView chaImgView = new ImageView(reChaImg); // 画像を拡大 //chaImgView.setScaleX(2); //chaImgView.setScaleY(2); chaImgView.setFitHeight(sW); chaImgView.setFitWidth(sH); mbox.getChildren().add(chaImgView); } }