飛行機の飛んでいく速度を変化させる方法 その2

ソーラー「そうなんだ


みんな 飛行機が2倍の速さで飛ぶ仕組みがわかったかな?



もう一回


もともとの通常の速度(1倍速)で飛行機が飛んでいく様子を見てよ

👇


#include "DxLib.h"


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

{



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


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

{

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

}


int graphichandle;


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



SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です



for (int x = 0; x < 640; x++) {


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}



WaitKey(); //🌞 キーの入力を待っています 何かキーが入力がされるまで これ以上プログラムは実行されません


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


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

}



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

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

👇


https://youtu.be/YAC-j31RGl8


👆


ソーラー「


これが1倍速 もともと飛行機の飛んでいく速度なんだね」


マックス「このプログラムの


for (int x = 0; x < 640; x++) {


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}


が実行されると


x=0

から

x=639

まで


xの値を1ずつ大きくしながら


DrawGraph(0💖, 230, graphichandle, TRUE);

DrawGraph(1💖, 230, graphichandle, TRUE);

DrawGraph(2💖, 230, graphichandle, TRUE);

DrawGraph(639, 230, graphichandle, TRUE);


が実行されることになるだろう


つまり


1回のfor{}文の繰り返し(ループ)



1ドットずつ横にずれながら飛行機が描かれることになるわけだ


その様子を示す図がこれだ

👇

https://solalion.blogspot.com/2021/08/blog-post_7.html


このとき


飛行機の描画開始位置は


0,1,2・・・・・・・


となっているな」


ソーラー「そうだね


今度は


もう一回


もともとの通常の速度(1倍速)の2倍速で飛行機が飛んでいく様子を見てよ」


👇

#include "DxLib.h"


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

{



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


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

{

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

}


int graphichandle;


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



SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です



for (int x = 0; x < 640; x++) {


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


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


DrawGraph(2*x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}



WaitKey(); //🌞 キーの入力を待っています 何かキーが入力がされるまで これ以上プログラムは実行されません


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


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

}


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

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

👇


https://www.youtube.com/watch?v=UB-A8-R3x_c



ソーラー「

👆


もともと飛行機の飛んでいく速度


の2倍の速度で


飛行機が飛んでいるね


このプログラムのfor{}文

👇


for (int x = 0; x < 640; x++) {


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


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


DrawGraph(2*x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}



DrawGraph(2*x, 230, graphichandle, TRUE);



ご注目ください


このfor{}文が実行されると



x=0

から

x=639

まで


xの値を1ずつ大きくしながら


DrawGraph(0💖, 230, graphichandle, TRUE);

DrawGraph(2💖, 230, graphichandle, TRUE);

DrawGraph(4💖, 230, graphichandle, TRUE);

DrawGraph(1278, 230, graphichandle, TRUE);


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


このとき


飛行機の描画開始位置は


0,2,4・・・・・・・


となります


つまり


1回のfor{}文の繰り返し(ループ)



2ドットずつ横にずれながら飛行機が描かれることになります


その様子を示す図がこちらです

👇

https://solalion.blogspot.com/2021/08/blog-post_58.html



マックス「


つまり


1回のfor{}文の繰り返しで


1ドットずつ飛行機の画像が右にずれて描かれていたのが


1回のfor{}文の繰り返しで


2ドットずつ飛行機の画像が右にずれて描かれることになったので


速度が2倍になったように見えるわけだ」


ソーラー「そうなんです


ところで


このプログラムのfor{}文にご注目ください

👇


for (int x = 0; x < 640; x++) {


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


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


DrawGraph(2*x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}

👆


この for{}文のように


DrawGraph関数の第一引数が


DrawGraph(2*x, 230, graphichandle, TRUE);


のように


2*x


なら


飛行機の描画開始位置は


0,2,4・・・・・・・


となりました」


マックス「うむうむ 飛行機の飛ぶ速度が2倍になったわけだ」


ソーラー「でも


飛行機の描画開始位置を


0,2,4・・・・・・・


と変化させる別の方法はいくらでもあると思いませんか?」


マックス「??


はい?


飛行機の描画開始位置を


0,2,4・・・・・・・


と変化させる別の方法??


for (int x = 0; x < 640; x++) {


ProcessMessage();//👈ここです ここにProcessMessage();を記述しました


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


DrawGraph(2*x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}


なら


1回のfor{}文の繰り返しごとに


飛行機の描画開始位置は


0,2,4・・・・・・・


と変化するので


飛行機の飛ぶ速度は2倍になったわけだが・・・


飛行機の描画開始位置を


0,2,4・・・・・・・


と変化させる別の方法か・・・」


solarplexuss「


今のfor{}文

👇


for (int x = 0; x < 640; x++) {


ProcessMessage();


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


DrawGraph(2*x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}



       🍋for (int x = 0; x < 640; x++) 🍋



       🍓for (int x = 0; x < 640; x=x+2) 🍓


にして


       🍋DrawGraph(2*x, 230, graphichandle, TRUE);🍋



       🍓DrawGraph(x, 230, graphichandle, TRUE);🍓


にした


for (int x = 0; x < 640; x=x+2){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}


なら


飛行機の描画開始位置が


0,2,4・・・・・・・


と変化するんじゃない?」



for (int x = 0; x < 640; x=x+2){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}


が実行されると


まず


1回目のfor{}文の繰り返し(ループ)の時


DrawGraph(0, 230, graphichandle, TRUE);


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


このとき


飛行機の描画開始位置は0ですね


このときxの値は0ですが


次に


2回目のfor{}文の繰り返し(ループ)の時


for (int x = 0; x < 640; x=x+2)


により


x=x+2


が実行され


xの値は2となります


ですので


DrawGraph(2, 230, graphichandle, TRUE);


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


このとき


飛行機の描画開始位置は2になるよね


このときxの値は2ですが


次に


3回目のfor{}文の繰り返し(ループ)の時


for (int x = 0; x < 640; x=x+2)


により


x=x+2


が実行され


xの値は4となります


ですので


DrawGraph(4, 230, graphichandle, TRUE);


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


このとき


飛行機の描画開始位置は4になるよね


こうして


1回のfor{}文の繰り返しごとに


飛行機の描画開始位置は


0,2,4・・・・・・・


と変化するので


飛行機の飛ぶ速度は2倍になるよね」


マックス「おおわ


やるな~


よくわかったなあ」


solarplexuss「えへへ、


いやあ


たまたま気づいたんだよ~ん


for (int x = 0; x < 640; x++)


となっている場合


1回のfor{}文の繰り返しごとに


xの値は


0,1,2・・・・・・・


と増えていきます


となると


DrawGraph(2*x, 230, graphichandle, TRUE);



2*xに


0,1,2,3・・・・・・・


が代入されていくので


2*xの値は


0,2,4,6・・・・・・・


になるので


飛行機の描画開始位置は


0,2,4,6・・・・・・・


と変化するので


飛行機の飛ぶ速度は2倍になるよね


ところで


0,2,4,6・・・・・・・


自体は


数字の並び


だよね


0,2,4,6・・・・・・・

0に2を足すと右隣の2になる


2に2を足すと右隣の4になる


4に2を足すと右隣の6になる

という構造になっているっておもったの


ということは


1回のfor{}文の繰り返しごとに


xの値に2を足せばいいと思ったの



for (int x = 0; x < 640; x=x+2)


のように


条件式を適当に


x=x+2


にして


DrawGraph(x, 230, graphichandle, TRUE);


を実行してみたら


たまたまうまい具合に


1回のfor{}文の繰り返しごとに


飛行機の描画開始位置は


0,2,4・・・・・・・


と変化して


飛行機の飛ぶ速度は


2倍になったんだよ」


ソーラー「確かに


x=x+2は


xの値に2を加える命令文だよね」



マックス「


1回のfor{}文の繰り返しごとに


飛行機の描画開始位置が


0,1,2・・・・・・・


と変化する場合を


飛行機の飛んでいく速度の基準とした場合



1回のfor{}文の繰り返しごとに


飛行機の描画開始位置が


0,2,4・・・・・・・


と変化する場合は


基準の2倍の速度で飛行機は飛んでいくことになるんだろう


1回のfor{}文の繰り返しごとに


2ドットずつ右にずれて飛行機が描かれるからなあ


だったら


1回のfor{}文の繰り返しごとに


飛行機の描画開始位置が


0,3,6・・・・・・・


と変化する場合は


1回のfor{}文の繰り返しごとに


3ドットずつ右にずれて飛行機が描かれるため


基準の3倍の速度で飛行機は飛んでいくことになるんじゃないか?


1回のfor{}文の繰り返しごとに


飛行機の描画開始位置を


0,3,6・・・・・・・


と変化させるためには


今のfor{}文の


for (int x = 0; x < 640; x=x+2)


の部分を


for (int x = 0; x < 640; x=x+3)


に変えた


for (int x = 0; x < 640; x=x+3){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}


を事項することになるだろう


逆に言うと


for (int x = 0; x < 640; x=x+3👇ここです💖){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}


と記述すれば


基準の3倍の速度で飛行機は飛んでいくことになるわけだ


基準の5倍の速度で飛行機を飛ばすには


for (int x = 0; x < 640; x=x+3)


の部分を


for (int x = 0; x < 640; x=x+5)


に変えた


for (int x = 0; x < 640; x=x+5👇ここです💖){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}


を実行すればいいわけだ」


solarplexuss「おおお・・・」


ソーラー「つまり


for (int x = 0; x < 640; x=x+2👇ここです💖){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}

なら

飛行機の飛ぶ速度は2倍速になり


for (int x = 0; x < 640; x=x+3👇ここです💖){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}

なら

飛行機の飛ぶ速度は3倍速になり


for (int x = 0; x < 640; x=x+4👇ここです💖){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}

なら

飛行機の飛ぶ速度は4倍速になり


for (int x = 0; x < 640; x=x+100👇ここです💖){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}

なら

飛行機の飛ぶ速度は100倍速になります



for (int x = 0; x < 640; x=x+a👇ここです💖){


ProcessMessage();


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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}

なら

飛行機の飛ぶ速度はa倍速になるんだね


不思議だね


x=x+a


と記述するだけで


飛行機の飛ぶ速度はa倍速になるんだからね」













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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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