• atwiki
  • Javaでゲームを作る入門 @ うぃき

Javaでゲームを作る入門 @ うぃき

最終更新:

takejava

- view
管理者のみ編集可
Javaでゲームをつくりたいと思ったが吉日!
動くもの!
ソースをまるのせ!
とりあえず、ソースをカンニングしたい!
動作を確認したい!
このクラスはどうやって使うのかをつかみたい!
という人にオススメのサイトになるように鋭意製作中です。

主に、Javaでゲームをつくりはじめようかなって考えている人にはオススメかなと思います。
逆にある程度作ったことがある人にとっては物足りないかな・・というサイトになると思います。

ですが、結局はネットで得た情報を寄せ集めて作ったりしたものや、わかったことを我が物顔で書いた記事で構築されたサイトになっています(^ω^)

package main.framework;

public class Main {
        /**
         * @param args
         */
        public static void main(String[] args) {
                MainGame mainGame = new MainGame();
                System.out.println("①");
                mainGame.createAndShowGUI();
                System.out.println("②");
                mainGame.doLoad();
                System.out.println("③");
                mainGame.doLoop();
                System.exit(0);
        }
}


package Utilities;

import java.text.DecimalFormat;

public class FPSKeeper {
        // 期待するFPS(1秒間に描画するフレーム数)
        private int FPS; // ★値を変えてみよう

        // 1フレームで使える持ち時間
        private long PERIOD = (long) (1.0 / FPS * 1000000000); // 単位: ns

        // FPSを計算する間隔(1s = 10^9ns)
        private static long MAX_STATS_INTERVAL = 1000000000L; // 単位: ns

        // FPS計算用
        private long calcInterval = 0L; // in ns
        private long prevCalcTime;

        // フレーム数
        private long frameCount = 0;

        // 実際のFPS
        private double actualFPS = 0.0;
        private DecimalFormat df = new DecimalFormat("0.0");

        private long beforeTime, afterTime, timeDiff, sleepTime;
        private long overSleepTime = 0L;
        private int noDelays = 0;

        public FPSKeeper() {
                this(60);
        }

        public FPSKeeper(int FPS) {
                prevCalcTime = beforeTime = System.nanoTime();
                setFPS(FPS);
        }

        /**
         * 途中でFPSを変更したい際に呼ぶ
         *
         * @param fps
         */
        public void setFPS(int fps)
        {
                FPS = fps;
                PERIOD = (long) (1.0 / FPS * 1000000000); // 単位: ns
        }

        /**
         * FPSを00.0の形の文字列で返す
         * @return
         */
        public String getFPS() {
                return df.format(actualFPS);
        }

        /**
         * 設定した(デフォルトは60)FPSの値になるようにスレッドのsleep時間を制御する
         */
        public void sleep() {
                getSleepTime();
                if (sleepTime > 0) {
                        /*
                         * 休止時間がとれる場合
                         */
                        try {
                                Thread.sleep(sleepTime / 1000000L); // nano->ms
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                notifyOverSleepTimeAndCalcFPS(); // sleep()の誤差を通知 ※getSleepTime()に反映させる必要があるため
        }

        private long getSleepTime() {
                afterTime = System.nanoTime();
                timeDiff = afterTime - beforeTime;
                // 前回のフレームの休止時間誤差も引いておく
                sleepTime = (PERIOD - timeDiff) - overSleepTime;

                return sleepTime;
        }

        private void notifyOverSleepTimeAndCalcFPS() {
                if (sleepTime > 0) {
                        overSleepTime = (System.nanoTime() - afterTime) - sleepTime;
                } else {
                        // 状態更新・レンダリングで時間を使い切ってしまい休止時間がとれない場合
                        overSleepTime = 0L;
                        // 休止なしが16回以上続いたら
                        if (++noDelays >= 16) {
                                Thread.yield(); // 他のスレッドを強制実行
                                noDelays = 0;
                        }
                }
                beforeTime = System.nanoTime();

                // FPSを計算
                calcFPS();
        }

        /**
         * FPSの計算
         */
        private void calcFPS() {
                frameCount++;
                calcInterval += PERIOD;

                // 1秒おきにFPSを再計算するようにする
                if (calcInterval >= MAX_STATS_INTERVAL) {
                        long timeNow = System.nanoTime();
                        // 実際の経過時間を測定
                        long realElapsedTime = timeNow - prevCalcTime; // 単位: ns

                        // 実際のFPSを計算
                        // realElapsedTimeの単位はnsなのでsに変換する
                        actualFPS = ((double) frameCount / realElapsedTime) * 1000000000L;
                        frameCount = 0L;
                        calcInterval = 0L;
                        prevCalcTime = timeNow;
                }
        }

}

divstyleでやってみたバージョン↓

package Utilities;
 
import java.text.DecimalFormat;
 
public class FPSKeeper {
	// 期待するFPS(1秒間に描画するフレーム数)
	private int FPS; // ★値を変えてみよう
 
	// 1フレームで使える持ち時間
	private long PERIOD = (long) (1.0 / FPS * 1000000000); // 単位: ns
 
	// FPSを計算する間隔(1s = 10^9ns)
	private static long MAX_STATS_INTERVAL = 1000000000L; // 単位: ns
 
	// FPS計算用
	private long calcInterval = 0L; // in ns
	private long prevCalcTime;
 
	// フレーム数
	private long frameCount = 0;
 
	// 実際のFPS
	private double actualFPS = 0.0;
	private DecimalFormat df = new DecimalFormat("0.0");
 
	private long beforeTime, afterTime, timeDiff, sleepTime;
	private long overSleepTime = 0L;
	private int noDelays = 0;
 
	public FPSKeeper() {
		this(60);
	}
 
	public FPSKeeper(int FPS) {
		prevCalcTime = beforeTime = System.nanoTime();
		setFPS(FPS);
	}
 
	/**
	 * 途中でFPSを変更したい際に呼ぶ
	 *
	 * @param fps
	 */
	public void setFPS(int fps)
	{
		FPS = fps;
		PERIOD = (long) (1.0 / FPS * 1000000000); // 単位: ns
	}
 
	/**
	 * FPSを00.0の形の文字列で返す
	 * @return
	 */
	public String getFPS() {
		return df.format(actualFPS);
	}
 
	/**
	 * 設定した(デフォルトは60)FPSの値になるようにスレッドのsleep時間を制御する
	 */
	public void sleep() {
		getSleepTime();
		if (sleepTime > 0) {
			/*
			 * 休止時間がとれる場合
			 */
			try {
				Thread.sleep(sleepTime / 1000000L); // nano->ms
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		notifyOverSleepTimeAndCalcFPS(); // sleep()の誤差を通知 ※getSleepTime()に反映させる必要があるため
	}
 
	private long getSleepTime() {
		afterTime = System.nanoTime();
		timeDiff = afterTime - beforeTime;
		// 前回のフレームの休止時間誤差も引いておく
		sleepTime = (PERIOD - timeDiff) - overSleepTime;
 
		return sleepTime;
	}
 
	private void notifyOverSleepTimeAndCalcFPS() {
		if (sleepTime > 0) {
			overSleepTime = (System.nanoTime() - afterTime) - sleepTime;
		} else {
			// 状態更新・レンダリングで時間を使い切ってしまい休止時間がとれない場合
			overSleepTime = 0L;
			// 休止なしが16回以上続いたら
			if (++noDelays >= 16) {
				Thread.yield(); // 他のスレッドを強制実行
				noDelays = 0;
			}
		}
		beforeTime = System.nanoTime();
 
		// FPSを計算
		calcFPS();
	}
 
	/**
	 * FPSの計算
	 */
	private void calcFPS() {
		frameCount++;
		calcInterval += PERIOD;
 
		// 1秒おきにFPSを再計算するようにする
		if (calcInterval >= MAX_STATS_INTERVAL) {
			long timeNow = System.nanoTime();
			// 実際の経過時間を測定
			long realElapsedTime = timeNow - prevCalcTime; // 単位: ns
 
			// 実際のFPSを計算
			// realElapsedTimeの単位はnsなのでsに変換する
			actualFPS = ((double) frameCount / realElapsedTime) * 1000000000L;
			frameCount = 0L;
			calcInterval = 0L;
			prevCalcTime = timeNow;
		}
	}
 
}
 


AWTについて

Swingと喧嘩

FPSの安定方法

jBOX2Dについてメモ


添付ファイル
記事メニュー
ウィキ募集バナー