リフレッシュレートが異なっても自分の飛行機が同じ速度で移動するようにしてみましょう 果たしてそんなことができるのでしょうか?

マックス  「リフレッシュレートが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 + 4💖;


を実行していて


右のキーを押し続けている場合


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 + 4💖;


を実行していて


右のキーを押し続けている場合


ScreenFlip();


が1回実行されるごとに


右に自分の飛行機が4ドットずつ移動して表示されることになる



ScreenFlip();


が1回実行されるごとの自分の飛行機の移動量は


if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4💖;


の4てわけだ


リフレッシュレートが60Hzのとき


ScreenFlip();



1秒間に60回


16.7ミリ秒に1回の割合で


裏画面に描かれた画像を


表画面に描くことになる


だから


自分の飛行機は


1秒間に60×4💖ドット=240ドット移動することになるわけだ


まあ つまり


リフレッシュレートが


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 + 4💖;



if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4*2💖💖💖》;


にすればいいんだね


そうしておけば


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 + 4💖;



if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x +4* 144/60💖💖💖💖💖💖💖;


にすればいいんだね


そうすれば


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 + ×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 + ×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回実行されるのにかかる時間をどうやって計測するかだが・・・」



























  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る