さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
ユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても同じ速度で自分の飛行機が移動できるようにした場合 画面の端まで明らかに自分の飛行機が到達できなくなるバグが発生するので注意してください
ユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても同じ速度で自分の飛行機が移動できるようにした場合 画面の端まで明らかに自分の飛行機が到達できなくなるバグが発生するので注意してください
ソーラー「これでユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても
同じ速度で自分の飛行機が移動できるようになりました😊」
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なのかというと
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「プログラム通りに必ず命令が実行されると思ったけど
結構プログラム通りに
命令が実行されてないパターンがあるね・・・」
ソーラー「結論からいうと
ユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても同じ速度で自分の飛行機が移動できるようにした場合 画面の端まで明らかに自分の飛行機が到達できなくなるバグが発生するので
ユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても同じ速度で自分の飛行機が移動できるようにするのは良くないんだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます