ユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても同じ速度で自分の飛行機が移動できるようにした場合 画面の端まで明らかに自分の飛行機が到達できなくなるバグが発生するので注意してください

ソーラー「これでユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても


同じ速度で自分の飛行機が移動できるようになりました😊」



solarplexuss「おお〜


なんかマニアック〜な調整だね


って


さっき


その話しなかったけ?」



ソーラー「そうだったっけ?


十字キーを押したとき自分の飛行機を移動させる命令文は

👇


int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);



if (4 *frametime* 144 <= jibunnohikouki.y && jibunnohikouki.y <= 460) {

if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4 *frametime* 144;

}



if (0 <= jibunnohikouki.y && jibunnohikouki.y <= 460-4 *frametime* 144) {


if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4 * frametime * 144;

}


if (4 *frametime* 144 <= jibunnohikouki.x && jibunnohikouki.x <= 605) {


if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4 * frametime * 144;

}


if (0 <= jibunnohikouki.x && jibunnohikouki.x <= 605-4 *frametime* 144) {


if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;

}


にしました


この命令文により


自分の飛行機は画面の外にでることはなくなったね


ただし


画面の右端に


本当にわずかながら


自分の飛行機がたどりつけなくなっています


実は


この命令文が実行されている場合


十字キーを右に押しつづけて


自分の飛行機を右に移動させていると


自分の飛行機のx座標=jibunnohikouki.xは最大💖💖で605まで増加します


なぜ605なのかというと


if (0 <= jibunnohikouki.x && jibunnohikouki.x <= 605-4 *frametime* 144) {


if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;

}


の条件式にご注目下さい


条件式が


0 <= jibunnohikouki.x && jibunnohikouki.x <= 605-4 *frametime* 144


となっているので


十字キーを右に押し続けて


自分の飛行機のx座標=jibunnohikouki.xが605-4 *frametime* 144になった場合


条件式


0 <= jibunnohikouki.x && jibunnohikouki.x <= 605-4 *frametime* 144


は真の値1を持つので



if (0 <= jibunnohikouki.x && jibunnohikouki.x <= 605-4 *frametime* 144) {


if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;

}


のブロック内の命令文


if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;

}



jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;



実行されることになります


すると


自分の飛行機のx座標であるjibunnohikouki.xの値は


605-4 *frametime* 144+ 4 * frametime * 144=


605になります


これ以上大きな値を


自分の飛行機のx座標であるjibunnohikouki.x


はとることができません


なぜなら


自分の飛行機のx座標であるjibunnohikouki.xの値が


605-4 *frametime* 144より


小さい値のときだけ


jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;



実行されるので


自分の飛行機のx座標であるjibunnohikouki.xの値は605を越えることはないんだね



自分の飛行機のx座標であるjibunnohikouki.xが0の値を取っている状態から


十字キーを右に押し続けた場合


自分の飛行機のx座標であるjibunnohikouki.xが605-4 *frametime* 144の値をとって


605になるかというと


ほとんどの場合なりません


最初


自分の飛行機のx座標=jibunnohikouki.xは0ですから


jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;


が実行されると


4 * frametime * 144ずつ


自分の飛行機のx座標=jibunnohikouki.xの値は増えていくことになります


そもそも4 * frametime * 144は実数値なので



(例えばframetimeは0.003333だったりするので


4 * frametime * 144は1.919808だったりします)



自分の飛行機のx座標であるjibunnohikouki.xの値が4 * frametime * 144ずつ増えていって


自分の飛行機のx座標であるjibunnohikouki.xの値が⭐️605-4 *frametime* 144ぴったり⭐️に


つまり


605-4 *frametime* 144=(4 * frametime * 14)の整数倍(×x倍)になるということは


まずないわけです


具体的には


自分の飛行機のx座標=jibunnohikouki.xの値が0から1.919808ずつ増えていって


自分の飛行機のx座標であるjibunnohikouki.xの値が605-1.919808=603.080192ぴったりに


つまり


605-4 *frametime* 144=(4 * frametime * 14)の整数倍(×x倍)になるということは


まずないわけです



十字キーを右に押し続けた場合


だいたい


自分の飛行機のx座標であるjibunnohikouki.xの値



605-4 *frametime* 144の手前まで


増加した後


jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;


が実行されて


自分の飛行機のx座標=jibunnohikouki.xの値は


605-4 *frametime* 144


をこえることになります


このとき


自分の飛行機のx座標=jibunnohikouki.xは


605-4 *frametime* 144


をこえていても


605よりは小さくなっています


605-4 *frametime* 144< jibunnohikouki.x< 605


という状態になっています


なぜ


605-4 *frametime* 144< jibunnohikouki.x< 605


が成立するのかというと


自分の飛行機のx座標であるjibunnohikouki.xの値



605-4 *frametime* 144の手前まできたときの値を


aとすると


a< 605-4 *frametime* 144


となっています


両辺に4 *frametime* 144を足すと


a+ 4 *frametime* 144<605になります


つまり


自分の飛行機のx座標=jibunnohikouki.xの値



605-4 *frametime* 144の手前まで


増加して


aという値を取った後


jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;


が実行されて


自分の飛行機のx座標=jibunnohikouki.xは


a+ 4 *frametime* 144


という値をとりますが


605よりは小さいというわけです




自分の飛行機のx座標=jibunnohikouki.xが


605-4 *frametime* 144


をこえた場合



if (0 <= jibunnohikouki.x && jibunnohikouki.x <= 605-4 *frametime* 144) {


if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;

}



のif()の()内の条件式


0 <= jibunnohikouki.x && jibunnohikouki.x <= 605-4 *frametime* 144


は偽の値0を持つことになるので


if (0 <= jibunnohikouki.x && jibunnohikouki.x <= 605-4 *frametime* 144) {


if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;

}


のブロック{}内の命令文



if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;



jibunnohikouki.x = jibunnohikouki.x + 4 * frametime * 144;


が実行されることはありません


ですので


自分の飛行機のx座標=jibunnohikouki.xの値が


a+ 4 *frametime* 144の値をとって


605-4 *frametime* 144


をこえた場合


a+ 4 *frametime* 144が


自分の飛行機のx座標=jibunnohikouki.xの取る値の最大値になります


a+4 *frametime* 144 < 605


なので


自分の飛行機のx座標=jibunnohikouki.x



605にたどり着かないんですね


もし


自分の飛行機のx座標=jibunnohikouki.xの値が


0から


315回


4 *frametime* 144(1.919808)ずつ増加して


605-4 *frametime* 144(603.080192)の手前の


604.73952あたりで


最大値をとった場合


35ドットが自分の飛行機の画像データの幅のサイズだとすると


自分の飛行機の画像は


横に604.73952から639.73952(604.73952+35)の範囲にわたって


描かれることになります


ゲー-ム画面の幅は


640ドットなので


640 - 639.73952=0.26048ドット


自分の飛行機の画像の右に隙間ができることになります


0.26048ドットは640×480ドットのゲーム画面の中では


大変小さな数値なので


自分の飛行機の画像の右に隙間ができていることに


気づくことはまず出来ません


ゲーム進行上では何の問題も起こらないというわけです


ようは


十字キーの右を押し続けて


自分の飛行機を画面の右端いっぱいに移動させようとしても


どうしても


自分の飛行機の画像の右にほんとうにわずかながら隙間ができるってわけなんだね」



solarplexuss「へえ それぐらいの隙間ならいいかな」



ソーラー「そこは全然問題ないんだけど


実際には


 ユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても同じ速度で


自分の飛行機が移動できるようにした場合


この動画のように

👇

https://www.youtube.com/watch?v=RvKkK5tKnTg


画面の端まで


                🍎明らかに🍎


自分の飛行機が到達できなくなるバグが発生するので


注意してね😊」


solarplexuss「なにぃ


それどうなってるの?」


ソーラー「原因は不明です」


solarplexuss「プログラム通りに必ず命令が実行されると思ったけど


結構プログラム通りに


命令が実行されてないパターンがあるね・・・」



ソーラー「結論からいうと


ユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても同じ速度で自分の飛行機が移動できるようにした場合 画面の端まで明らかに自分の飛行機が到達できなくなるバグが発生するので



ユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても同じ速度で自分の飛行機が移動できるようにするのは良くないんだね」


















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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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