山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

JavaFX でゲームプログラミング超入門 その1

JavaFXRPGのアプリケーションを作る

前回T Umezawa
T Umezawa - YouTube
さんの動画を紹介しましたが、僕もそのゲームプログラミングをやりたいと思います。


動画では、Swingを使って進められていますが、勉強のためにJavaFXで書きたいと思います。
動画にて、Swingを使っているところから僕もJavaFXで書いているのですが、それ以前のプログラムも書かなければいけません。
実際には、Part30までのモンスターの表示画面まで作成しました。
www.youtube.com
f:id:yamakasa3:20180308002603p:plain

モンスターの画像は、"ぴぽや"というゲーム素材を公開しているサイトから利用させて頂きました。
blog.pipoya.net

Part1はここから見ることができます。
【Java】ゲームプログラミング超入門 Part01 - YouTube

コード

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