さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
リフレッシュレートが異なっても自分の飛行機が同じ速度で移動するようにしてみましょう 果たしてそんなことができるのでしょうか?
リフレッシュレートが異なっても自分の飛行機が同じ速度で移動するようにしてみましょう 果たしてそんなことができるのでしょうか?
マックス 「リフレッシュレートが144Hzのとき
ScreenFlip();
の前に
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;
if (key 移動することになります& PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x +
を実行していて
右のキーを押し続けている場合
ScreenFlip();
が1回実行されるごとに
右に自分の飛行機が4ドットずつ移動して表示されることになる
ScreenFlip();
は1秒間に144回実行されるので
自分の飛行機は
1秒間に144×4ドット=576ドット移動することになるのか
リフレッシュレートが60Hzのときも
ScreenFlip();
の前に
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;
if (key 移動することになります& PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x +
を実行していて
右のキーを押し続けている場合
ScreenFlip();
が1回実行されるごとに
右に自分の飛行機が4ドットずつ移動して表示されることになる
ScreenFlip();
が1回実行されるごとの自分の飛行機の移動量は
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x +
の4てわけだ
リフレッシュレートが60Hzのとき
ScreenFlip();
は
1秒間に60回
16.7ミリ秒に1回の割合で
裏画面に描かれた画像を
表画面に描くことになる
だから
自分の飛行機は
1秒間に60×
まあ つまり
リフレッシュレートが
144Hzと60Hzでは
自分の飛行機(や自分の弾や敵の飛行機)の移動スピードが変わってくるってわけだ
だとすると
ユーザーのパソコンのリフレッシュレートの設定によっては
自分の飛行機(や自分の弾や敵の飛行機)の移動スピードが変わってくることになるな
だが移動スピードが変わっても
それは仕方がないよなあ
リフレッシュレートはユーザーの持っているパソコンの設定しだいだからな
どうしようもないか」
ソーラー「それが上手にプログラムを構成すれば
ユーザーの持っているパソコンの
リフレッシュレートの設定が144Hzでも60Hzでも
同じスピードで自分の飛行機が飛んで行くようにすることができるんです」
solarplexuss「さすがにそれは無理じゃない?
リフレッシュレートが高ければ高いほど
どうやっても
ScreenFlip();
が実行される回数が多くなるから
どうしても
自分の飛行機が移動する距離
(ScreenFlip();が実行される回数×4ドット)
は長くなるよね」
ソーラー「それが
リフレッシュレートが何ヘルツの場合でも
例えば
リフレッシュレートが144Hzのときの自分の飛行機の移動量と
等しくなるようにする方法があるんだ」
solarplexuss「えぇ〜本当〜?」
ソーラー「
リフレッシュレートが 144Hzのとき
ScreenFlip();
は
1秒間に144回実行されます
ScreenFlip();
が1回実行されるときの時間間隔は
1÷144=0.0069444・・・秒(6.9ミリ秒)です
(自分の飛行機の移動量は(1回の移動量)4×144=576ドットになるね)
もしリフレッシュレートが72Hzで
ScreenFlip();
が1回実行されるときの時間が
1/72=0.013888・・・
の
13.8ミリ秒で
144Hzのときの6.9ミリ秒の2倍かかっているとき
(ScreenFlip();が1秒間に実行される回数は逆に2分の1の72回になります)
自分の飛行機の移動量を4×144=576ドットにしたいなら
4ではなく
4×2ドットを
ScreenFlip();
が1回実行されるときの自分の飛行機の1回の移動量にすればよいわけです
そうすれば自分の飛行機の1秒間の移動量は
4×2(ドット)×72(ScreenFlip();が1秒間に実行される回数)= 576ドットになります
以下の命令文を
👇
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x +
を
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x +
にすればいいんだね
そうしておけば
1秒間に(同じ時間に)自分の飛行機の移動する量は
リフレッシュレートが144Hzのときの自分の飛行機の移動量576ドットと等しくなります
自分の飛行機の移動量は
4×2ドット×72=576ドットになります
もしリフレッシュレートが
60Hzのときは
1秒間に60回ScreenFlip();が実行されます
ScreenFlip();
が1回実行されるときの時間間隔は16.7ミリ秒=1/60秒です
16.7ミリ秒=1/60秒
は
144Hzのときの 0.0069秒(6.9ミリ秒)=1/144秒の2.402倍です
1/60÷1/144は144/60=2.402というわけです
(ScreenFlip();が1秒間に実行される回数は60回です
144Hzのときの60/144=2.402分の1
つまり
144×1/2.402回
144×60/144回
になっています
リフレッシュレートが低ければ低いほど
すなわち
ScreenFlip();
が1回実行されるときの時間間隔が長ければ長いほど
ScreenFlip();
が1秒間に実行される回数はへることになります)
自分の飛行機の移動量は4×60ドット=240ドットになります
やはり60Hzのときは144Hzのときの576ドットより1秒間の自分の飛行機の移動量が減っています
ということは
リフレッシュレートが60Hzのときでも
自分の飛行機の移動量を144Hzの時と同じ576ドットにしたければ
4× 2.402ドット
つまり
4× 144/60ドット
を
ScreenFlip();
が1回実行されるときの自分の飛行機の1回の移動量にすればよいわけです
そうすれば
4× 2.402(1回の移動量)× 144×1/2.402(ScreenFlip();が実行される回数)
=576ドットになります
すなわち
4× 144/60(1回の移動量)× 144×60/144(ScreenFlip();が実行される回数)
=576ドットになります
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x +
を
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x +
にすればいいんだね
そうすれば
ScreenFlip();
が実行される回数が60/144=2.402分の1になっても
自分の飛行機の1回の移動量が144/60=2.402倍になったので
1秒間に(同じ時間に)自分の飛行機の移動する量は
自分の飛行機の1回の移動量×1秒間の移動回数
=
4× 2.402ドット×60回= 4× 2.402ドット× 144回×1/2.402=4×144=576ドットになります
すなわち
4× 144/60ドット×60回= 4× 144/60ドット× 144回×60/144
= 4× 144× 144/60× 60/144=576ドットになります
つまり
1秒間に(同じ時間に)自分の飛行機の移動する量は
144Hzでも60Hzでも同じ576ドットになります
もっといえば
リフレッシュレートがわからなくても何Hzであっても
自分の飛行機の1秒間の移動量は
自分の飛行機の1回の移動量×1秒間の移動回数(1秒間に(ScreenFlip();が実行される回数)
なので
自分の飛行機の1回の移動量
を
4×144× 1/(1秒間に(ScreenFlip();が実行される回数)
にすれば
自分の飛行機の1秒間の移動量は
4×144× 1/(1秒間に(ScreenFlip();が実行される回数) ×1秒間の移動回数(1秒間に(ScreenFlip();が実行される回数)
=576(ドット)
になります
つまり
リフレッシュレートが144Hzのときの
自分の飛行機の1秒間の移動量と🌞必ず🌞等しくなります
1/(1秒間に(ScreenFlip();が実行される回数) は(ScreenFlip();が1回実行されるのにかかる時間)なので
4×144× 1/(1秒間に(ScreenFlip();が実行される回数) ×1秒間の移動回数(1秒間に(ScreenFlip();が実行される回数)
は
4×144× (ScreenFlip();が1回実行されるのにかかる時間) ×1秒間の移動回数(1秒間に(ScreenFlip();が実行される回数)
で表されます
ですので
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4* 144*(ScreenFlip();が1回実行されるのにかかる時間);
のように
4×144× (ScreenFlip();が1回実行されるのにかかる時間) を
ScreenFlip();
が1回実行されるときの自分の飛行機の1回の移動量に設定しておけば
ScreenFlip();
が1秒間に実行される回数は
1/(ScreenFlip();が1回実行されるのにかかる時間)
なので
1秒間に(同じ時間に)自分の飛行機の移動する量は
1回の移動量×移動回数
=
4×144× (ScreenFlip();が1回実行されるのにかかる時間) ×1秒間の移動回数(1秒間に(ScreenFlip();が実行される回数)
= 4×144× (ScreenFlip();が1回実行されるのにかかる時間)
×
1/(ScreenFlip();が1回実行されるのにかかる時間)
=4×144
=576ドット
となり
どのようなリフレッシュレートであっても
自分の飛行機の1回の移動量を
🌞🌞🌞4×144× (ScreenFlip();が1回実行されるのにかかる時間) 🌞🌞🌞
に設定すれば
自分の飛行機の移動量は
144Hzの場合と同じ576ドットになります
もちろん
ScreenFlip();
が1回実行されるのにかかる時間を計測できなければ
自分の飛行機の1回の移動量を
🌞🌞🌞4×144× (ScreenFlip();が1回実行されるのにかかる時間) 🌞🌞🌞
にすることはできません」
solarplexuss「ということは
🌞🌞ユーザーのつかっているパソコンの🌞🌞
🌞🌞リフレッシュレートがわからなくても🌞🌞
🌞🌞リフレッシュが何Hzだったとしても🌞🌞
自分の飛行機の1回の移動量を
🌞🌞🌞4×144× (ScreenFlip();が1回実行されるのにかかる時間) 🌞🌞🌞
を
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4×144× (ScreenFlip();が1回実行されるのにかかる時間);
のように
ScreenFlip();
が1回実行されるときの自分の飛行機の1回の移動量にしておけば
1秒間に自分の飛行機の移動する量は
🌞いつも🌞
144Hzの場合と等しく576ドットになるってことなのなの?
狐につままれたみたい
でも確かに
自分の飛行機の移動量は
1回の移動量×移動回数
=
4×144× (ScreenFlip();が1回実行されるのにかかる時間) ×1秒間の移動回数(1秒間に(ScreenFlip();が実行される回数)
= 4×144× (ScreenFlip();が1回実行されるのにかかる時間)
×
1/(ScreenFlip();が1回実行されるのにかかる時間)
=4×144
=576ドット
になるんだよね
不思議〜」
(そのユーザーのパソコンで
ScreenFlip();
が1回実行されるのにかかる時間を計測することができさえすればこのように
1回の移動量を設定することができます)
マックス「おおっ
ScreenFlip();
が1回実行されるときの自分の飛行機の1回の移動量を
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4×144× (ScreenFlip();が1回実行されるのにかかる時間);
のように
🌞🌞🌞4×144× (ScreenFlip();が1回実行されるのにかかる時間) 🌞🌞🌞
のようにしておくだけで
リフレッシュレートが何Hzであっても
1秒間に自分の飛行機の移動する量は
🌞いつも🌞
144Hzの場合と等しく576ドットになるのか
それは凄くないかぁあ」
ソーラー「そう
だから
リフレッシュレートがいくらに設定されていても
十字キーを押した時の飛行機の1秒間の移動量(移動スピード)を
リフレッシュレートが144Hzのときと常に同じに保ちたければ
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;
if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;
を
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y -4* (ScreenFlip();が1回実行されるのにかかる時間)*144;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y +4* (ScreenFlip();が1回実行されるのにかかる時間)*144;
if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x -4* (ScreenFlip();が1回実行されるのにかかる時間)*144;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4* (ScreenFlip();が1回実行されるのにかかる時間)*144;
もしくは
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y -4* (1/(ScreenFlip();が1秒間に実行される回数))*144;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y +4* (1/(ScreenFlip();が1秒間に実行される回数))*144;
if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x -4* (1/(ScreenFlip();が1秒間に実行される回数))*144;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4* (1/(ScreenFlip();が1秒間に実行される回数))*144;
のように記述すればいいって事になるね」
マックス「だが
ScreenFlip();
が1回実行されるのにかかる時間をどうやって計測するかだが・・・」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます