ユーザーのパソコンのリフレッシュレートが何ヘルツに設定されていても 同じ速度で自分の弾が移動するようにしてみましょう

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


(144Hzのときと)同じ速度で自分の飛行機が移動できるようになりましたし


自分の飛行機が画面の端っこで動けなくなるということも無くなりました😊」



マックス「まあ


まさか


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


同じ速度で自分の飛行機が移動できるようにできたと思ったら


自分の飛行機が画面の端にいくと身動きが取れなくなるとは思わないからな


さっきは


かなりやばいことになったと思ったぞ」



solarplexuss「無事に不具合が解消されてよかったね」



ソーラー「ところで


みなさん忘れていることはないかな?」



solarplexuss 「全然ない!」



ソーラー「


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


(144Hzのときと)同じ速度で自分の飛行機が移動することに成功したなら


一緒に


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


(144Hzのときと)同じ速度で自分の弾が移動するようにしてみようよ


今のままだと


リフレッシュレートが高ければ高いほど


自分の飛行機から発射された弾は


速く


リフレッシュレートが低ければ低いほど


自分の飛行機から発射された弾は


ゆっくり


移動することになります」



マックス「自分の弾か


そうか


自分の弾も


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


(144Hzのときと)同じ速度で移動するようにしないとな



1秒間に自分の飛行機の移動する量は


自分の飛行機の1秒間の移動回数(ScreenFlip();が1秒間に実行される回数=リフレッシュレート)


×自分の飛行機の1回の移動量


だろう


同様に


1秒間に自分の弾の移動する量は


自分の弾の1秒間の移動回数(ScreenFlip();が1秒間に実行される回数=リフレッシュレート)


×自分の弾の1回の移動量


ってわけだ😊


👆

これが基本のポイントだ




リフレッシュレートが60Hzでも120Hzでも


いくらに設定されていても


1秒間に自分の弾の移動する量



リフレッシュレートが144Hzのときと同じようにするには


さっきのプログラムの


for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10;


if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}




for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10 * (ScreenFlip();が1回実行されるのにかかる時間)*144;


//👆🌞🌞🌞🌞🌞🌞ここに注目🌞🌞🌞🌞🌞🌞




if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}



もしくは




for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10 * (1/(ScreenFlip();が1秒間に実行される回数))*144;


//👆🌞🌞🌞🌞🌞🌞ここに注目🌞🌞🌞🌞🌞🌞




if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}




にすればいいんじゃないか?



1秒間に自分の弾の移動する量は


自分の弾の1秒間の移動回数(ScreenFlip();が1秒間に実行される回数=リフレッシュレート)


×自分の弾の1回の移動量


だから


1秒間に自分の弾の移動する量は


自分の弾の1秒間の移動回数(ScreenFlip();が1秒間に実行される回数=リフレッシュレート)


×


10* (ScreenFlip();が1回実行されるのにかかる時間)*144



になる


(先ほど


ScreenFlip();が1回実行されるのにかかる時間(の平均値)はframetimeに代入されましたね


となると


ScreenFlip();が1秒間に実行される回数は1/frametime になります


ですので



jibunnotama[i].x = jibunnotama[i].x + 10 * (1/(ScreenFlip();が1秒間に実行される回数))*144;



10* frametime*144


になります


)


この場合


結局


1秒間に自分の弾の移動する量は


1/frametime


×


10* frametime*144


= 10*144


=1444ドット


になるわけだ


いつも


    🌞1秒間に1/frametime回(=リフレッシュレート)🌞


       🌞自分の弾は移動するので🌞


       🌞自分の弾の1回の移動量を🌞


       🌞10* frametime*144にさえしておけば🌞


1秒間に自分の弾の移動する量はいつも


自分の弾の1秒間の移動回数(ScreenFlip();が1秒間に実行される回数=リフレッシュレート)


×自分の弾の1回の移動量


=


1/frametime


×


10* frametime*144


= 10*144


=1444


となる


そうなのだ


            🌞1444ドット🌞


すなわち


リフレッシュレートが何Hzでも


自分の弾の移動量は


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


自分の弾の移動量


と同じ移動量になるわけだ


ようは


for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10* frametime*144;


//👆🌞🌞🌞🌞🌞🌞ここに注目🌞🌞🌞🌞🌞🌞




if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}


が実行されるときは


リフレッシュレートに応じた


ScreenFlip();が1回実行されるのにかかる時間がframetimeに代入されることになる」



solarplexuss「ははあ


for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10 * (ScreenFlip();が1回実行されるのにかかる時間)*144;


//👆🌞🌞🌞🌞🌞🌞ここに注目🌞🌞🌞🌞🌞🌞




if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}



for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10 *frametime*144;


//👆🌞🌞🌞🌞🌞🌞ここに注目🌞🌞🌞🌞🌞🌞




if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}


であらわされるんだ




さっき


リフレッシュレートに応じた


(ScreenFlip();が1回実行されるのにかかる時間)をframetimeに代入したね


リフレッシュレートがいくらに設定されていても



for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10 *frametime*144;


//👆🌞🌞🌞🌞🌞🌞ここに注目🌞🌞🌞🌞🌞🌞




if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}


が実行された場合


リフレッシュレートがいくらに設定されていても


十字キーを押した時の自分の弾の1秒間の移動量(移動スピード)



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


十字キーを押した時の自分の弾の1秒間の移動量(移動スピード)576ドット


になるんだね」


ソーラー「それでは


リフレッシュレートがいくらに設定されていても


自分の弾の1秒間の移動量(移動スピード)



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


自分の弾の1秒間の移動量(移動スピード)


と常に同じになるプログラムを実行してみたいと思います


そのためにまず

👇


int first_time;


int second_time;


double frametime; //😊 (frametimeとはScreenFlip();が1回実行されるときの時間、画像が表画面に表示される1フレームの時間を表しています)


double frametimegoukei=0;



for (int i = 0; i < 50; i++) {


first_time = GetNowCount(); //🌞 ScreenFlip();が実行される前の時間を求めています


ScreenFlip();//🌞 ScreenFlip();が実行されるには数ミリ秒かかります


second_time = GetNowCount(); //🌞 ScreenFlip();が実行された後の時間を求めています


frametime = (second_time - first_time)/1000; //🌞 ScreenFlip();が実行される時間を求めています


frametimegoukei= frametimegoukei+ frametime; //🌞 ScreenFlip();が実行される時間の合計を求めています

}



frametime= frametimegoukei/50; //🌞 ScreenFlip();が実行される時間の平均値を求めています

👆

を実行して




for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10;


//👆🌞🌞🌞🌞🌞🌞ここに注目🌞🌞🌞🌞🌞🌞




if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}




for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10 *frametime*144;


//👆🌞🌞🌞🌞🌞🌞ここに注目🌞🌞🌞🌞🌞🌞




if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}


に変更して


実行することになります」



そのプログラムはこちらです

👇


#include "DxLib.h"


struct Character {

double x;

double y;

int graphichandle;

int life;

};

//👆🌞Characterの構造体宣言です




int first_time;


int second_time;


double frametime; //😊 (frametimeとはScreenFlip();が1回実行されるときの時間、画像が表画面に表示される1フレームの時間を表しています)


double frametimegoukei = 0;




int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}




SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です 裏画面に画像を描きます printfDxで表示される文字も裏画面に描かれることになります



first_time = GetNowCount(); //🌞 ScreenFlip();が1回実行される前の時間を求めています


ScreenFlip();//🌞 ScreenFlip();が1回実行されるには数ミリ秒かかります


second_time = GetNowCount(); //🌞 ScreenFlip();が1回実行された後の時間を求めています


frametime = (second_time - first_time) / 1000.0; //🌞 ScreenFlip();が1回実行される時間を求めています



printfDx("%d\n", first_time); //🌞 ScreenFlip();が1回実行される前の時間を表示しています



printfDx("%d\n", second_time); //🌞 ScreenFlip();が1回実行された後の時間を表示しています



printfDx("ScreenFlip();が1回に実行されるのにかかる時間は%fです\n", frametime); //🌞 ScreenFlip();が1回に実行されるのにかかる時間を表示しています




for (int i = 0; i < 50; i++) {


first_time = GetNowCount(); //🌞 ScreenFlip();が1回実行される前の時間を求めています


ScreenFlip();//🌞 ScreenFlip();が1回実行されるには数ミリ秒かかります


second_time = GetNowCount(); //🌞 ScreenFlip();が1回実行された後の時間を求めています


frametime = (second_time - first_time) / 1000.0; //🌞 ScreenFlip();が1回実行される時間を求めています


frametimegoukei = frametimegoukei + frametime; //🌞 ScreenFlip();が1回実行される時間の合計を求めています

}



frametime = frametimegoukei / 50; //🌞 ScreenFlip();が実行される時間の平均値を求めています




printfDx("ScreenFlip();が1回実行されるのにかかる時間の平均値は%fです\n", frametime); //🌞 ScreenFlip();が1回に実行される時間の平均値を表示しています



struct Character jibunnohikouki;

//👆🌞jibunnohikoukiの構造体変数宣言です


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


jibunnohikouki.graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");


jibunnohikouki.life = 1;//👈🌞🌞🌞ここがポイントです🌞🌞🌞


//👆🌞構造体変数jibunnohikoukiのメンバ変数の初期化を行っています

//👆😋自分の飛行機😋のデータをとりあつかっています




struct Character tekinohikouki[10];

//👆🌞敵の飛行機を10体登場させるために要素数を10にして構造体変数tekinohikouki[0]、tekinohikouki[1]、tekinohikouki[2]・・・tekinohikouki[9]を作成しています



for (int i = 0; i < 10; i++) {


tekinohikouki[i].x = 50;


tekinohikouki[i].y = 20 * i;


tekinohikouki[i].graphichandle = LoadGraph("画像データ\\敵の飛行機.bmp");


//👆メモリに取り込まれた😋敵の飛行機のデータ😋に割り当てられた番号が tekinohikouki[i].graphichandle に代入されています


tekinohikouki[i].life = 1;


}





struct Character jibunnotama[2];

//🌞👆自分の弾を2つ作成しています

for (int i = 0; i < 2; i = i + 1) {


jibunnotama[i].x = 0;

jibunnotama[i].y = 0;


jibunnotama[i].graphichandle = LoadGraph("画像データ\\自分の弾.bmp");


jibunnotama[i].life = 0;


}


int tsix;//🌞🌞🌞tsixには発射される弾の最初の位置のx座標が代入されることになります tは弾、sは最初、iは位置、xはx座標を表しています



int count = 0;//🌞🌞🌞ここでint型の変数countを作製し0で初期化しました




while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {







DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);




int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);


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

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

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

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





if (jibunnohikouki.life == 1) {


DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);


}


//👆 jibunnohikouki.lifeに格納されている値が1なら自分の飛行機の画像を描きます

//👆jibunnohikouki.lifeに格納されている値が0なら自分の飛行機の画像が描かれることはありません


for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life == 1) {


DrawGraph(tekinohikouki[i].x, tekinohikouki[i].y, tekinohikouki[i].graphichandle, TRUE);


}


}




for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life == 1) {


if ((jibunnohikouki.x + 7 < tekinohikouki[i].x + 28) && (tekinohikouki[i].x + 7 < jibunnohikouki.x + 27) && (jibunnohikouki.y + 7 < tekinohikouki[i].y + 13) && (tekinohikouki[i].y + 6 < jibunnohikouki.y + 13)) {


jibunnohikouki.life = 0;


tekinohikouki[i].life = 0;


}

}


}


for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life == 1) {


for (int j = 0; j < 2; j++) {


if ((jibunnotama[j].x < tekinohikouki[i].x + 28) && (tekinohikouki[i].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 13) && (

tekinohikouki[i].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[i].life = 0;

}


}

}


}



if ((key & PAD_INPUT_A) && (count == 0)) {


for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 0) {


jibunnotama[i].x = jibunnohikouki.x + 35;


tsix = jibunnotama[i].x;


jibunnotama[i].y = jibunnohikouki.y + 20;


jibunnotama[i].life = 1;


break;


}


}


count = 10;

}



if (count > 0) { count = count - 1; }




for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることになります

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10 *frametime*144;


//👆🌞🌞🌞🌞🌞🌞ここに注目🌞🌞🌞🌞🌞🌞




if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}




ScreenFlip();


ClearDrawScreen();


};



DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します


}


デバッグなしで実行をしてから一度プログラムを終了し

生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです

👇

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



ソーラー「見た目はかわらなくても


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


144Hzのときと同じ速度で自分の弾が移動できるようになりました😊


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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