飛行機から弾を発射してみよう まずは飛行機と弾の画像を表示してみよう
ソーラー「みなさん😊
今度は
飛行機から弾を発射させることにチャレンジしてみようよ」
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)の位置になるように
表示されつづけるんじゃない?」
ソーラー「そうなんです
そこでね(^_-)-☆
次は
飛行機の移動に応じて
弾も
一緒に
くっついて移動するようにしてみましょう」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます