ScreenFlip();を用いて裏画面に描かれた画像を表画面に表示してClearDrawScreen();を用いて消すを繰り返すプログラムは高速で実行されるので画像は表示され続けているように見えます

マックス「再び


飛行機が飛んでいく画像の背景として


一瞬だけ


青い四角形の画像が表示されるプログラムはこれだあ」

👇


👇


#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関数です


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈💖💖この位置にDrawBox関数を記述しました



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


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();//👈👈👈ここで再び登場 🌞ScreenFlip関数です


ClearDrawScreen();//👈 🌞 ClearDrawScreen関数です

}



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


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


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

}


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

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


一瞬だけ


青い四角形の画像が表示されますが


すぐに消え


真っ黒い画面の中を


黒い飛行機が飛んでいくことになります


(あまりにも青い四角形の画像が表示されて消えるのが早すぎて


動画キャプチャソフトではその様子をキャプチャすることはできませんでした)


マックス「どうやったら


青い四角形の画像を飛行機が飛んでいる間


ずっと背景として表示させることができるのか?」


solarplexuss「どっかにいい方法があるはず・・」


マックス「そうだなあ


・・・


試しに・・・


for{}文の中の


DrawGraph(x, 230, graphichandle, TRUE);


の前に


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈💖💖この位置にDrawBox関数を記述しました


を記述してみるのはどうだ?


こんなかんじだあ

👇


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


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈💖💖ここに注目 この位置にDrawBox関数を記述しました


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();//👈👈👈ここで再び登場 🌞ScreenFlip関数です


ClearDrawScreen();//👈 🌞 ClearDrawScreen関数です


}



これなら


もしかしたら


飛行機の背景として青い画像がずっと表示され続けるんじゃないか


ははは


for{}文の中の命令文の繰り返しが行われるごとに


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈💖💖ここに注目 この位置にDrawBox関数を記述しました


DrawGraph(x, 230, graphichandle, TRUE);


が実行されては


裏画面に


青い四角形の画像と飛行機の画像が描かれ


ScreenFlip();//👈👈👈ここで再び登場 🌞ScreenFlip関数です


によって


表画面に


青い四角形の画像と飛行機の画像が表示されるだろう


そして


ClearDrawScreen();//👈 🌞 ClearDrawScreen関数です


により


青い四角形の画像と飛行機の画像が消去される


これの繰り返しにより


青い四角形の画像と飛行機の画像は


いちおう


ずっと表示され続けるわけだ


どうだ


このアイデア


冴えてるだろう」


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

👇


#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++) {


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);の前にDrawBox関数を記述しました


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}



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


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


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

}



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

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

👇


https://youtu.be/nrp1oWca0LU


solarplexuss「やった


ちゃんと


とんでいく飛行機の画像の背景に青い四角形が表示されつづけてる


うひゃひゃ(*´▽`*)//


すごいなあ


私が


このプログラムの説明してみよっかなあ


このプログラムでは


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


の実行により


描かれる画像はすべて


             🌞裏画面🌞


に描かれることになります



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


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);の前にDrawBox関数を記述しました


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

}


の実行により


x=0のときから

xの値を1ずつ値を増やしながら

x=639まで


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

👇

DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);の前にDrawBox関数を記述しました


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

👆


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


まず


x=0のとき


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);の前にDrawBox関数を記述しました


DrawGraph(0, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


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


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);


が実行されると



         💖💖💖裏画面💖💖💖👈👈👈ここに注目


に青い四角形が描かれることになります


次に


DrawGraph(0, 230, graphichandle, TRUE);


が実行されると



         💖💖💖裏画面の💖💖💖👈👈👈ここに注目


真ん中 左端のほうに


飛行機の画像が


描かれることになります


この時


          💖裏画面には💖


青い四角形の画像



飛行機の画像

描かれています


その状態で



ScreenFlip();



が実行されると


表画面に


裏画面に描かれていた


青い四角形の画像

飛行機の画像

表示されることになります


ScreenFlip();


をつかっているので


しばらくの間



青い四角形の画像

飛行機の画像

表示されることになります


そして


ClearDrawScreen();


の実行により


     🌞表画面と裏画面の両方に描かれている青い四角形の画像と飛行機の画像🌞👈👈👈ここに注目


消去されることになります


この時点では


表画面に描かれている青い四角形の画像と飛行機の画像


は消去されています


次に


x=1のとき


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);の前にDrawBox関数を記述しました


DrawGraph(0, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


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


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);


が実行されると



         💖💖💖裏画面💖💖💖👈👈👈ここに注目


に青い四角形が描かれることになります


次に


DrawGraph(1, 230, graphichandle, TRUE);


が実行されると



         💖💖💖裏画面の💖💖💖👈👈👈ここに注目


先ほどの飛行機の画像が1ドット右にずれた形で


飛行機の画像が


描かれることになります


この時


          💖裏画面には💖


青い四角形の画像



先ほどの飛行機の画像より右に1ドットずれた飛行機の画像

描かれています


その状態で



ScreenFlip();



が実行されると


表画面に


裏画面に描かれていた


青い四角形の画像

先ほどの飛行機の画像より右に1ドットずれた飛行機の画像

表示されることになります


ScreenFlip();


をつかっているので


しばらくの間



青い四角形の画像

先ほどの飛行機の画像より右に1ドットずれた飛行機の画像

表示されることになります


そして


ClearDrawScreen();


の実行により


     🌞表画面と裏画面の両方に描かれている青い四角形の画像と先ほどの飛行機の画像より右に1ドットずれた飛行機の画像🌞👈👈👈ここに注目


消去されることになります


すなわち


表画面に描かれている青い四角形の画像と先ほどの飛行機の画像より右に1ドットずれた飛行機の画像


は消去されています


このとき


表画面(ゲーム画面)は何も描かれていない真っ黒な状態です



次に


x=2のとき


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);の前にDrawBox関数を記述しました


DrawGraph(2, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


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


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);


が実行されると



         💖💖💖裏画面💖💖💖👈👈👈ここに注目


に青い四角形が描かれることになります


次に


DrawGraph(2, 230, graphichandle, TRUE);


が実行されると



         💖💖💖裏画面の💖💖💖👈👈👈ここに注目


先ほどの飛行機の画像が1ドット右にずれた形で


飛行機の画像が


描かれることになります


この時


          💖裏画面には💖


青い四角形の画像



先ほどの飛行機の画像より右に1ドットずれた飛行機の画像

描かれています


その状態で



ScreenFlip();



が実行されると


表画面に


裏画面に描かれていた


青い四角形の画像

先ほどの飛行機の画像より右に1ドットずれた飛行機の画像

表示されることになります


ScreenFlip();


をつかっているので


しばらくの間



青い四角形の画像

先ほどの飛行機の画像より右に1ドットずれた飛行機の画像

表示されることになります


そして


ClearDrawScreen();


の実行により


     🌞表画面と裏画面の両方に描かれている青い四角形の画像と先ほどの飛行機の画像より右に1ドットずれた飛行機の画像🌞👈👈👈ここに注目


消去されることになります


すなわち


表画面に描かれている青い四角形の画像と先ほどの飛行機の画像より右に1ドットずれた飛行機の画像


は消去されています


このとき


表画面(ゲーム画面)は何も描かれていない真っ黒な状態です



以下繰り返し



マックス「・・・??



x=0のときのfor文のブロック{}内の命令文


👇

DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);の前にDrawBox関数を記述しました


DrawGraph(0, 230, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();

👆



ScreenFlip();


の実行により


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

DrawGraph(0, 230, graphichandle, TRUE);


によって裏画面に描かれた青い四角形の画像と飛行機の画像が


            ある一定の間


表画面(ゲーム画面)に描かれるわけだ


だが


次に


ClearDrawScreen();


を実行しているので


青い四角形の画像と飛行機の画像



表画面と裏画面の両方から消去されるわけだ


このとき


表画面(ゲーム画面)



真っ黒になっているだろう



x=1のとき


また


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

DrawGraph(1, 230, graphichandle, TRUE);


によって裏画面に描かれた青い四角形の画像と飛行機の画像が


ScreenFlip();


の実行により


            ある一定の間


表画面(ゲーム画面)に描かれる


x=2のとき

x=3のとき


と繰り返されるわけだが・・・




これだと


青い四角形の画像と飛行機の画像が


表示されたり消えたり


ゲーム画面が点滅して見えるようになるはずなんだが


なんで


ふつうにずっと


青い四角形の画像と飛行機の画像が


表画面(ゲーム画面)に表示されているように見えるんだ」


ソーラー「それはね


確かに


x=0のとき



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

DrawGraph(0, 230, graphichandle, TRUE);


によって裏画面に描かれた青い四角形の画像と飛行機の画像が


ScreenFlip();


の実行により


            ある一定の間


表画面(ゲーム画面)に描かれて


次に


ClearDrawScreen();


を実行しているので


青い四角形の画像と飛行機の画像



表画面と裏画面の両方から消去され


表画面(ゲーム画面)は真っ暗になります


が、


x=0のときの


ClearDrawScreen();


が実行された



               すぐあとに


それはもう


人間の目では認識できないほどの速さで


x=1のときのfor文のブロック{}内の命令文


👇

DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);//👈👈👈ここに注目 SetDrawScreen(DX_SCREEN_BACK);の前にDrawBox関数を記述しました


DrawGraph(1, 230, graphichandle, TRUE);


ScreenFlip();


が実行されるので


再び


青い四角形の画像と飛行機の画像が


            ある一定の間



表示されることになります


真っ黒い画面が表示されている時間はあまりにも短く


青い四角形の画像と飛行機の画像は


ある一定の時間表示され続けるので


人の目には


真っ黒い画面を認識することができず


青い四角形の画像と飛行機の画像が表示され続けているように見えるんだね


だから


画面のちらつきを


認識することはできないんだね」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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