JavaFXでの画面解像度の変更

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぽげ

JavaFXでの画面解像度の変更

#1

投稿記事 by ぽげ » 8年前

こんにちは、C言語でなく恐縮ですが質問させていただきます。
現在、EclipseとJDK1.8.0_92のJavaFXで何かゲームを作ろうと考え、骨組みを構築しているところです。
ウィンドウの解像度が高すぎるせいか、キャラの画像(32x32)を表示した際に小さすぎて困っています。

現状のソースコードは以下になります。
GameAppクラスをMainクラスで継承し、main()内でcreate()メソッドとlaunch()メソッドを呼び出します。
また_init()メソッド内で画像読み込み、_loop()メソッド内でgcに画像表示処理を行おうと考えています。

コード:

public abstract class GameApp extends Application{
	/* 定数 */
	final static double DEFAULT_FPS = 60.0f;// 既定のfps値
	final static int DEFAULT_WIDTH = 640;	// 既定の画面横サイズ
	final static int DEFAULT_HEIGHT= 480;	// 既定の画面縦サイズ

	/* FPS変数(省略) */

	/* システム変数 */
	public static ArrayList<String> input; // キー入力用リスト
	public static String title; // 画面タイトル
	public static int window_width, window_height; // ウィンドウサイズ
	public static int scene_width, scene_height; // 解像度サイズ(として使う予定)

	/* システムインスタンス */
	Group root;			// ルート
	Scene scene;			// シーン
	Canvas canvas;			// キャンバス
	GraphicsContext gc;		// グラフィックコンテキスト
	
	/* 変数初期化メソッド(省略) */
	public static void create(String title);

	/* 変数初期化メソッド(省略) */
	public static void create(String title, double fps);

	/* 変数初期化メソッド(省略) */
	public static void create(String title, int width, int height);

	/* 変数初期化メソッド(省略) */
	public static void create(String title, int width, int height, double fps);

	/* 変数初期化メソッド(省略) */
	public static void create(String t, int window_w, int window_h, int scene_w, int scene_h, double fps){
		input = new ArrayList<String>();

		title = t;
		window_width  = window_w;
		window_height = window_h;
		scene_width  = scene_w;
		scene_height = scene_h;
	}

	/* ループメソッド */
	private void _rean(Stage s){
		Timeline gameLoop = new Timeline();
        gameLoop.setCycleCount( Timeline.INDEFINITE );
        KeyFrame kf = new KeyFrame( Duration.seconds(fps), new EventHandler<ActionEvent>(){
        	public void handle(ActionEvent ae){
        		_clear();        // 画面クリア
        		_loop(s, gc);        // 主処理
        		_fps();        // FPS計算
        	}
        });
        gameLoop.getKeyFrames().add( kf );
        gameLoop.play();

	}

	/* 画面クリアメソッド */
	private void _clear(){
		gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
	}

	/* システム初期化メソッド */
	private void _system(Stage s){
		s.sizeToScene(); // シーンのサイズを画面に合わせる?
		s.setWidth(window_width); // 画面サイズをwindow_widthに設定
		s.setHeight(window_height); // 画面サイズをwindow_heightに設定
	    s.setTitle( title ); // タイトル設定
		s.setResizable(false); // リサイズ禁止

   /* 定型的な初期設定処理 */
	    canvas = new Canvas( window_width, window_height );
		root = new Group();
		root.getChildren().add( canvas );

		scene = new Scene( root );
	    s.setScene( scene );

	    gc = canvas.getGraphicsContext2D();

	    initKeyBoard(); // キー入力準備

	}

	/* FPS計算メソッド(省略) */
	private void _fps();

	/* キー入力受付メソッド(省略) */
	private void initKeyBoard();

	/* 起動メソッド */
	public void start(Stage s){
		_system(s); // システムの初期化
		_init(s);  // 任意の初期化(オーバーライド)
		_rean(s);   // ループ処理
		s.show();   // 表示処理
	}

	/* 抽象メソッド */
	public abstract void _init(Stage s);

	/* 抽象メソッド */
	public abstract void _loop(Stage s, GraphicsContext gc);
}

DXライブラリのようにImageインスタンスによる裏画面処理を行い、
ウィンドウサイズまで引き伸ばして表画面に反映させようとも考えたのですが、
JavaFXのImageクラスがComponentクラスを継承していないため
createImage()メソッドを利用することが出来ず断念。

そもそも解像度なんて簡単に変更出来るのではないかと
色々調べてみたのですが、なかなか理解出来る記事が見当たらず
トピックを立てるに至りました。

長くなりましたが、質問としては
① JavaFXで裏画面処理は必要無いのでしょうか?(方法自体ない?)
② 画面解像度の設定はどうすればいいでしょうか?
の二点です

Javaは何年か触っているので基本的な知識はあると思います。
JavaFXについては一週間ほどの初心者です。
まだ理解に苦しむ点が多いですが、何卒アドバイスお願いします。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: JavaFXでの画面解像度の変更

#2

投稿記事 by ISLe » 8年前

裏画面処理については
1. java.awt.BufferedImageでイメージを生成
2. 1.で生成したイメージからjava.awt.Graphicsコンテキストを取得して描画
3. 1.で生成したイメージをjavafx.embed.swing.SwingFXUtilsを利用してjavafx.scene.image.Imageに変換
4. 3.で生成したイメージをjavafx.scene.canvas.GraphicsContext.drawImageで任意の大きさで描画
という方法になるようです。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: JavaFXでの画面解像度の変更

#3

投稿記事 by ISLe » 8年前

画面解像度の設定というのはこういうことですかね。

コード:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.Group;
import javafx.scene.canvas.Canvas;

public class Test extends Application
{
	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage stage) throws Exception {
		stage.setTitle("タイトル");
		stage.setResizable(false);

		Canvas canvas = new Canvas(640, 400);
		Group root = new Group();
		root.getChildren().add(canvas);

		Scene scene = new Scene(root);
		stage.setScene(scene);

		stage.sizeToScene();
		stage.show();
	}
}
Canvasのサイズを指定して、あとはJavaFXが計算した最適なサイズに合わせます。

8u60からデスクトップのスケーリングへの対応が入りました。
実際に描画されるサイズは指定したサイズにスケーリング倍率を掛けたものになります。

閉鎖

“C言語何でも質問掲示板” へ戻る