飛行機から弾を発射してみよう まずは飛行機と弾の画像を表示してみよう

ソーラー「みなさん😊


今度は


飛行機から弾を発射させることにチャレンジしてみようよ」


solarplexuss「ついに 飛行機から弾を発射させる日が来たんだぁ」


マックス「腕が鳴るぜ 百発発射させるぜ」


ソーラー「ところで


飛行機から弾を発射させるためには


何が必要だと思う?」


solarplexuss「う~ん


経済力かなあ」


マックス「体力なんじゃないか?」


ソーラー「どちらも重要なものだね


僕が思うに


野菜をそだてるのに必要なのは



            💖愛💖


なんじゃないかな」



マックス「愛か・・・


ふっ  そうだな」


solarplexuss「野菜!?


って


飛行機から弾を発射する話から


話がずれてない??」


ソーラー「


飛行機から弾を発射させるのに必要なのは


まずは


飛行機の弾の画像データです」



solarplexuss「はいぃ~


話が戻った


う~ん


飛行機の弾の画像?


そういわれても


飛行機の弾の画像はどうやって用意するのよん」


ソーラー「え?


それ


以前のエピソードでやっったよね?」


solarplexuss「そうだったっけ


全然記憶にないよお」


ソーラー「いいぃ!?」


マックス「そういえば・・・


確かに


どこかで


飛行機の画像データを作製しなかったか?


だから


今までのエピソードのプログラムで


ゲーム画面に飛行機の画像を表示できているんだろう


理論的には


どこかで


飛行機の画像データを作製しているはずなんだ」


ソーラー「もう~


忘れちゃ困っちゃうよ


飛行機の画像データを作製したよね?」


solarplexuss「あ~


そのとき


違うことしてたかも」


ソーラー「


飛行機の画像データを作製する方法を忘れた・・・



そんな あなたは



『お絵描きソフトCLIP STUDIOペイントを導入して自分の思うがままのゲームキャラクターをデザインしよう』



の章を参照してください


飛行機の画像データを作製する方法がのっています



さあ さあ


マックスさん

solarplexussさん


自分の弾の画像データの作成をしていくよ」



マックス「まかしておけ」


solarplexuss「腕がなるなあ」


マックスとsolarplexussが弾の画像データを作製している様子はこちらからご覧になれます

👇


https://solalion.blogspot.com/2021/09/blog-post_16.html


(この作製している画像データの名前



自分の弾と名付けました


この


自分の弾と名付けられた画像データのファイルへの保存形式はBMP形式です


BMP形式で画像データをファイルへ保存しないと


ゲーム画面に自分の弾と名付けられた画像データを表示することはできません)



ソーラー「こうして


自分の弾の画像データを作製したなら


次は


この


自分の弾の画像データをゲーム画面に表示してみましょう


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

👇


#include "DxLib.h"



struct Character {

int x;

int y;

int graphichandle;


};

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




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



struct Character jibunnohikouki;

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


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


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

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




struct Character jibunnotama;

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


jibunnotama.x = 0;


jibunnotama.y = 0;


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

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



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;

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

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

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




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




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



ScreenFlip();


ClearDrawScreen();


};



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


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

}


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

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

👇


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


マックス「・・・なんだか


飛行機は移動しつづけて


弾だけが画面左上に表示されつづけているようだが・・・」


solarplexuss「このプログラムの仕組みはどうなってるのかな?」


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


まず jibunnohikoukiの構造体変数宣言


struct Character jibunnohikouki;

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


が実行されています


そして


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


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

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

//👆🌞ソーラーが描いた飛行機.bmpファイルに保存された画像データはメモリに読み込まれ その画像データに割り振られた番号が構造体変数jibunnohikoukiのメンバ変数 jibunnohikouki.graphichandleに代入されています


を実行することにより


構造体変数jibunnohikoukiのメンバ変数


jibunnohikouki.x


jibunnohikouki.y


jibunnohikouki.graphichandle


を初期化しています



構造体変数jibunnohikoukiのメンバ変数


jibunnohikouki.x


jibunnohikouki.y


jibunnohikouki.graphichandle



飛行機のデータを取り扱っているんだ」


solarplexuss「


飛行機のデータを取り扱うために


構造体変数jibunnohikoukiのメンバ変数


jibunnohikouki.x


jibunnohikouki.y


jibunnohikouki.graphichandle


を作製しているんだね



次に


jibunnotamaの構造体変数宣言


struct Character jibunnotama;

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


が実行することにより


構造体変数jibunnotamaのメンバ変数


jibunnotama.x


jibunnotama.y


jibunnotama.graphichandle


を生成しています


そして


jibunnotama.x = 0;


jibunnotama.y = 0;


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

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

//👆🌞自分の弾.bmpファイルに保存された画像データはメモリに読み込まれ その画像データに割り振られた番号が構造体変数jibunnotamaのメンバ変数 jibunnotama.graphichandleに代入されています


を実行して


構造体変数jibunnotamaのメンバ変数


jibunnotama.x


jibunnotama.y


jibunnotama.graphichandle


を初期化しています


構造体変数jibunnotamaのメンバ変数は


自分の弾のデータを取り扱っているんだ


飛行機も自分の弾も


ゲーム画面内での


x座標のデータ


y座標のデータ


グラフィックデータ


を持っているね


だから


         😊同じ構造体Character型の😊


構造体変数jibunnohikoukiのメンバ変数


jibunnohikouki.x


jibunnohikouki.y


jibunnohikouki.graphichandle




         😊同じ構造体Character型の😊


構造体変数jibunnotamaのメンバ変数


jibunnotama.x


jibunnotama.y


jibunnotama.graphichandle



飛行機の


x座標のデータ


y座標のデータ


グラフィックデータ



自分の弾の


x座標のデータ


y座標のデータ


グラフィックデータ


を取り扱っているんだね


あとは


飛行機の画像データを表示する命令文


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


自分の弾の画像データを表示する命令文


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


の実行により


飛行機と


自分の弾の画像を


ゲーム画面に表示することになります


jibunnotama.x = 0;


jibunnotama.y = 0;


が実行されているので


自分の弾の画像データの左上の頂点が


ゲーム画面の左上の(0,0)の位置になるよう


自分の弾の画像が表示されます」


その様子はこちらです

👇

https://solalion.blogspot.com/2021/09/blog-post_25.html


拡大するとこんな感じです

👇

https://solalion.blogspot.com/2021/09/blog-post_39.html



solarplexuss「おや???


このプログラムだと


while{}文

👇

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;

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

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

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




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



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



ScreenFlip();


ClearDrawScreen();


};


の実行によって


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

👇

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;

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

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

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




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




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



ScreenFlip();


ClearDrawScreen();



ずっと繰り返し実行されることになっても


自分の弾の画像データは


ずっと


自分の弾の画像データの左上の頂点が


ゲーム画面の左上の(0,0)の位置になるように


表示されつづけるんじゃない?」



ソーラー「そうなんです


そこでね(^_-)-☆


次は


飛行機の移動に応じて


弾も


一緒に


くっついて移動するようにしてみましょう」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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