Java初心者の競技プログラミング日記

Dvorak配列でjavaを書いてます

【JavaFx入門】002.キーボード入力を取得する

キーボード入力を受け取って動作するJavaFxプログラムを書いてみたいと思います。

ここでは、上下左右のキーでウィンドウ内の画像を操作する、RPG風のサンプルプログラムを紹介します。

package Blog;

import java.io.File;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;


public class Sample extends Application {
	
	//変数
	int[][] map = {
			{1,1,1,1,1},
			{1,2,0,0,1},
			{1,0,0,0,1},
			{1,0,0,0,1},
			{1,1,1,1,1},
	};
	int heroX = 1;
	int heroY = 1;
	Group root = new Group();
	Image wall = new Image(new File("C:\\roguelike\\image\\wall.gif").toURI().toString());
	Image floor = new Image(new File("C:\\roguelike\\image\\floor.gif").toURI().toString());
	Image hero = new Image(new File("C:\\roguelike\\image\\hero.gif").toURI().toString());
	
	
	//ステージ、シーンなどの設定
	@Override
	public void start(Stage stg) {
		stg.setTitle("title");
		Scene scene = new Scene(root, 300, 300, Color.BLACK);
		stg.setScene(scene);
		printMap();
		
		//sceceにキー受け取りメソッドをセットする
		scene.setOnKeyPressed(e -> press(e));
		
		stg.show();
	}
	

	//キーイベントを受け取って処理するメソッド
	void press(KeyEvent event) {
		map[heroY][heroX] = 0;

		//switchで分岐させると分かりやすく記述できる
		switch (event.getCode()) {
		case UP:
			heroY = Math.max(1,heroY-=1);
			map[heroY][heroX] = 2;
			break;
		case DOWN:
			heroY = Math.min(3,heroY+=1);
			map[heroY][heroX] = 2;
			break;
		case LEFT:
			heroX = Math.max(1,heroX-=1);
			map[heroY][heroX] = 2;
			break;
		case RIGHT:
			heroX = Math.min(3,heroX+=1);
			map[heroY][heroX] = 2;
			break;
		}
		
		//キー入力を受け取ったあと、描画する
		printMap();
	}
	
	
	//画面を描画する
	void printMap() {
		root.getChildren().clear();
		for (int i=0; i<5; i++) {
			for (int j=0; j<5; j++) {
				ImageView imv = new ImageView();
				if (map[i][j] == 1) imv = new ImageView(wall);
				else if (map[i][j] == 0) imv = new ImageView(floor);
				else if (map[i][j] == 2) imv = new ImageView(hero);
				
				//描画間隔は、画像の大きさによって調整
				imv.setX(1+j*16);
				imv.setY(1+i*16);
				root.getChildren().add(imv);
			}
		}
	}

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

今回のプログラムでは3つの画像(hero.gif, wall.gif, floor.gif)を使用していますが、これについては、パソコンに標準で入っているものではありませんので、もしこのプログラムを起動してみたい場合は、各自で用意してください。大きさはそれぞれ16*16で、透過処理を施してあります。

画像を指定したフォルダに配置し起動すると、下のようなウィンドウが出現します。

f:id:tsukasa_d:20180329180531j:plain

上下左右のキーで、白い丸(主人公)を操作できます。茶色の点は床で、床の上には移動可能です。茶色の四角は壁で、壁の上には移動できません。

僕もまだ手探りの状態なので、拙いプログラムになっているかもしれませんが、JavaFxRPGを作ってみたいという方の参考になれば幸いです。