飛行機の画像をゲーム画面上で動かしています  SetDrawScreen関数 と ScreenFlip関数を用いた場合

ソーラー「静止画で飛行機が飛んでる様子を表現するのって


いいアイデアだと思わない?」


solarplexuss「…微妙…かも…」


ソーラー「仕方がない


では


実際に


ゲーム画面上で飛行機を飛ばすプログラムを実行してみます」


マックス「そんなことできるのか?」


ソーラー「もちろん できるんだあ


まずは


以下のプログラムをご覧ください

👇


#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");


for (int x = 0; x < 300; x=x+1) {


DrawGraph(x, 230, graphichandle, TRUE);


}



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


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


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

}


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

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

👇

https://solalion.blogspot.com/2021/07/blog-post_42.html




ソーラー「このプログラムでは


for (int x = 0; x < 300; x=x+1) {


DrawGraph(x, 230, graphichandle, TRUE);


}


の働きにより



前に描かれた飛行機の画像の上に


ちょっと右横に飛行機がずれた形で新たな飛行機の画像が300回


上書きされつづけています


(正確には


前に描かれた飛行機の画像の上に


1ドットずつ右横に飛行機がずれた形で新たな飛行機の画像が300回上書きされています)


前に描いた飛行機の画像は消えることなく


どんどん


新たな飛行機の画像が描かれています


ですから


まるで


尾を引いているような


飛行機の画像が表示されることになります

👇

https://solalion.blogspot.com/2021/07/blog-post_42.html



マックス「300回ていうのもすごいな」


solarplexuss「for文って便利だね」


ソーラー「


このプログラムでは


尾を引いた


飛行機の画像が一瞬で描かれています


ですが


動作速度の遅いパソコンでは


ゆっくりと


前に描かれた飛行機の画像の上に


ちょっと右横に飛行機がずれた形で新たな飛行機の画像が300回


上書きされることになります


その場合


飛行機はまるで


尾を引きながら飛んでいるように見えることになります」


マックス「動作速度の遅いパソコンか・・・」


ソーラー「動作速度が遅いパソコンの場合


そもそも飛行機を描画する速度が遅いんです


そのうえ


前に描かれた飛行機の画像の上に


ちょっと右横に飛行機がずれた形で


ゆっくりと新たな飛行機の画像が300回表示されることになるんだ


リアルに


少しづつ飛行機が描かれている様子が見えます」



solarplexuss「へえ」



ソーラー「では


そろそろ


飛行機がゲーム画面上を右に動いていく


プログラムを実行してみましょう


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


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

//😊さりげなく条件式をx<300からx<640に変更しています😊


DrawGraph(x, 230, graphichandle, TRUE);


ScreenFlip();//👈新たに登場 🌞ScreenFlip()関数です

}



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


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


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

}


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

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

👇

https://youtu.be/loRxwD4l8wg

👆 for (int x = 0; x < 640; x++)の場合



おまけ

👇

https://youtu.be/g5MEE3eZBR8

👆 for (int x = 0; x < 300; x++)の場合




マックス「ぐおおっ


かっこいいいいいぃいいい


尾を引きながら飛行機が飛んどる


とてもいい感じじゃないか


かっこええではないか」


solarplexuss「すごい これってどういう仕組みなのお」


ソーラー「


ここでは


新しい関数が2つ登場しています


SetDrawScreen関数

ScreenFlip関数の2つです


プログラム内で


次の命令文

👇


SetDrawScreen(DX_SCREEN_BACK);//👈新たに登場 🌞SetDrawScreen関数です


ScreenFlip();//👈新たに登場 🌞ScreenFlip()関数です



お気づきになられたでしょうか?




まずは


SetDrawScreen(DX_SCREEN_BACK);


の説明ですね


SetDrawScreen関数は


引数として


DX_SCREEN_BACK

DX_SCREEN_FRONT


等を持つことができます


DX_SCREEN_BACKは裏画面

DX_SCREEN_FRONTは表画面


を表しており


SetDrawScreen(DX_SCREEN_BACK);


が実行されると


私たちが見えない裏画面というものに


画像が描かれることになります


たとえば


SetDrawScreen(DX_SCREEN_BACK);


を実行したなら


その後

DrawBox関数

DrawGraph関数

などで


描く画像は


私たちがみえない


裏画面というものに描かれることになります


SetDrawScreen(DX_SCREEN_FRONT);


を実行したなら


今まで通り


私たちの見えるゲーム画面に


画像が描かれることになります」



solarplexuss「あれ?


このプログラムでは


SetDrawScreen(DX_SCREEN_BACK);


が実行されているよね


裏画面に画像を描いたら


私たちが見えないところに画像が描かれるんでしょう?


見えない裏画面に画像を描いてるのに


ゲーム画面に画像が表示されてるじゃん


そもそも裏画面に画像を描いても意味ないんじゃない?」



ソーラー「へへ


SetDrawScreen(DX_SCREEN_BACK);


を実行するには秘密があります



動作速度の遅いパソコンでは


画像を描画するのに時間がかかります


ですので


画面上に飛行機の画像を1つだけ描く場合でも


飛行機の画像を描くその過程がリアルに見えてしまいます


飛行機が少しづつゲーム画面上に描かれる様子などがみえてしまうわけです


その描画にはある程度の時間がかかります


ゲーム中に飛行機が少しづつゲーム画面上に描かれる様子を見せるのはよくないですね


ですので


SetDrawScreen(DX_SCREEN_BACK);



描画領域を裏画面に設定しています」


マックス「裏画面?」


ソーラー「


裏画面とは


私たちが通常見ているゲーム画面は表画面と呼ばれますが


私たちがみえないところに裏画面というものが存在します


その裏画面を描画先に設定すれば


飛行機の画像を描くその過程が見えることはありません


ですので


飛行機の画像を描くその過程を


ゲームユーザーにみられることなく


飛行機を描き切ることができます


飛行機の画像を描くその過程が見えることはないのですが


裏画面に飛行機の画像を描いているので


もちろん表のゲーム画面では何も見えません」


マックス「ゲームユーザーにみられることなく


飛行機の画像を描き切ることができるか・・・


なるほど


動作速度の遅いパソコンは


なかなか大変だな


だが


見えない裏画面に


飛行機の画像を描ききってもなあ(笑💖)」


ソーラー「そこで


裏画面に飛行機の画像を描ききったあとに


ScreenFlip関数

👇


ScreenFlip();


を実行することで


裏画面に画像を描ききったあとに


表のゲーム画面に


裏画面に描かれた画像


を表示することになります


そうすれば


表のゲーム画面では


裏画面で描き終わった画像だけが表示され


画像を描くその過程が見えることはありません


ScreenFlip();


とは


裏画面に描かれている画像

表画面に表示する働きがあります」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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