2Dゲーム制作Ⅰ②(2025/04/22)

【前回の振り返り】
・WindowsプログラムはWinMain関数から始まる。
・関数は処理の塊。
・関数はプログラムでできている。
・関数のreturnで返す値は0は正常終了。0以外はエラーで終了。
・最初の行の#include”dxLib.h”でDxLibの機能を使うことができるようになる。
・DxLibの関数を呼ぶことで画面表示などのゲームに必要な処理を使うことができる。

【画像表示】
int handle = LadGraph(“player.png”);
DrawGraph(100,50,handle,TRUE);

・画像はプログラム(*.cpp)と同じフォルダに置く
・画像ファイルをメモリに読み込み、表示。
・画像ファイルをメモリにハンドラを取得。
・ハンドラを指定し、XとY位置と半透明を使うかを指定し画面に表示。

※ハンドラ※
「ハンドラ(handle)」って初めて聞くとピンとこないよね。でも大丈夫、**本質は「メモリの名札」**みたいなものなんだ。


🎯ハンドラってなに?

簡単にいうと、
**「メモリに読み込んだ画像に貼られる番号札」**です!


💡たとえば…

「player.png」をプログラムで読み込むと、
画像データはコンピュータのメモリのどこかに保存されます。
でも、メモリの場所(アドレス)って人間には扱いにくいんです。

そこで、こうします👇

読み込んだ画像メモリ上の位置番号(ハンドラ)
player.png0x7ffd32ac…3(←これが handle)

この番号(3みたいな数字)が「ハンドラ(handle)」です!


🎮プログラムにすると?

cppコピーする編集するint handle = LoadGraph("player.png");

🔽やってること:

  1. 「player.png」をメモリに読み込む
  2. 読み込んだ画像に「番号(ハンドラ)」を割り振る
  3. handle にその番号を入れてくれる

🖼️表示するには?

cppコピーする編集するDrawGraph(100, 50, handle, TRUE);

ここで使ってる handle は、
「さっきメモリに読み込んだ画像、これだよ」って指定するための番号なんだ。


🧠まとめ

用語意味
ハンドラ(handle)読み込んだデータを指し示す番号札
LoadGraph("画像.png")画像をメモリに読み込んで、ハンドラをもらう
DrawGraph(x, y, handle, TRUE)指定したハンドラの画像を画面に描画する

🛠️比喩で例えると:

画像は「本」、メモリは「図書館の棚」、ハンドラは「貸出番号」みたいなもの!
「何番の本を表示して!」って言うために使ってる感じ。

【ゲームプログラムの構造】
初期化

ゲームループ(ゲーム処理⇔描画処理:60fps~)

終了

それで、今日使ったコード
#include “DxLib.h”

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE); // ウィンドウモード
SetGraphMode(640, 960, 32);
DxLib_Init(); // DXライブラリ初期化
SetDrawScreen(DX_SCREEN_BACK); // 裏画面に描画
int handleBg = LoadGraph(“bg.png”);
int handle = LoadGraph(“blackpiyo-s.png”);
int x = 320;
int y = 480;
int scrollY = 0;
int shotX = 0;
int shotY = 0;
int handleShot = LoadGraph(“egg.png”);
int shotFlag = 0; // 0:表示しない 1:表示
while (ProcessMessage() == 0) {
ClearDrawScreen();

if (CheckHitKey(KEY_INPUT_RIGHT))
{
x += 2;
}
if (CheckHitKey(KEY_INPUT_LEFT))
{
x -= 2;
}
if (CheckHitKey(KEY_INPUT_DOWN))
{
y += 2;
}
if (CheckHitKey(KEY_INPUT_UP))
{
y -= 2;
}
if (CheckHitKey(KEY_INPUT_SPACE))
{
if (shotFlag == 0)
{
shotX = x+54;
shotY = y;
shotFlag = 1;
}
}
scrollY += 8;
if (scrollY >= 960)
{
scrollY = 0;
}
DrawGraph(0, scrollY, handleBg, TRUE);
DrawGraph(0, scrollY – 960, handleBg, TRUE);
DrawGraph(x, y, handle, TRUE);
if (shotFlag == 1)
{
shotY -= 4;
if (shotY < 0)
{
shotFlag = 0;
}
DrawGraph(shotX, shotY, handleShot, TRUE);
}

ScreenFlip();
}
DxLib_End();

🔧 全体の構成(ざっくり)

1. 初期設定

cppコピーする編集するChangeWindowMode(TRUE);        // ウィンドウモードで起動
SetGraphMode(640, 960, 32);    // 解像度 640x960 / 色深度 32bit
DxLib_Init();                  // DxLib 初期化
SetDrawScreen(DX_SCREEN_BACK); // 裏画面に描画(ダブルバッファリング)

👉 チラつきを防ぎながら、ウィンドウで描画する準備です。


2. 画像の読み込みと変数の初期化

cppコピーする編集するint handleBg = LoadGraph("bg.png");        // 背景
int handle = LoadGraph("blackpiyo-s.png"); // プレイヤー画像
int handleShot = LoadGraph("egg.png");     // 弾画像

👉 各グラフィックファイルを読み込んで、描画のための「ハンドル(番号)」を取得。

cppコピーする編集するint x = 320, y = 480;   // プレイヤー初期位置
int shotX = 0, shotY = 0, shotFlag = 0;  // 弾の位置と状態

👉 プレイヤーの座標や、弾の表示状態を管理する変数。


3. ゲームループ(メインの処理)

cppコピーする編集するwhile (ProcessMessage() == 0) {
	ClearDrawScreen(); // 画面をクリア

🎮 プレイヤー操作

cppコピーする編集するif (CheckHitKey(KEY_INPUT_RIGHT)) x += 2;
if (CheckHitKey(KEY_INPUT_LEFT)) x -= 2;
if (CheckHitKey(KEY_INPUT_DOWN)) y += 2;
if (CheckHitKey(KEY_INPUT_UP)) y -= 2;

👉 十字キーでキャラを上下左右に移動可能。


🥚 弾の発射(スペースキーで一発だけ)

cppコピーする編集するif (CheckHitKey(KEY_INPUT_SPACE)) {
	if (shotFlag == 0) {
		shotX = x + 54;
		shotY = y;
		shotFlag = 1;
	}
}

👉 弾が表示されていないときだけ、スペースキーで弾を「発射」する。


🌌 背景スクロール

cppコピーする編集するscrollY += 8;
if (scrollY >= 960) scrollY = 0;
DrawGraph(0, scrollY, handleBg, TRUE);
DrawGraph(0, scrollY - 960, handleBg, TRUE);

👉 背景画像を2枚重ねて上下に流し続けることで、無限スクロールのように見せる処理。


🐤 キャラと弾の描画

cppコピーする編集するDrawGraph(x, y, handle, TRUE); // プレイヤー描画
cppコピーする編集するif (shotFlag == 1) {
	shotY -= 4;                 // 弾を上に動かす
	if (shotY < 0) shotFlag = 0; // 画面外に出たら非表示に
	DrawGraph(shotX, shotY, handleShot, TRUE);
}

👉 弾が発射されたら上に動き続けて、画面外に出たらリセット。


4. 画面更新

cppコピーする編集するScreenFlip(); // 裏画面→表画面に反映

💡まとめると

要素内容
プレイヤー上下左右に移動可能
弾(1発)スペースキーで撃てる(同時に1発のみ)
背景縦スクロールし続ける
描画処理1フレームごとに全て再描画
更新ダブルバッファでちらつきなし

次回の予定:弾の連射。

(おまけ)今日使ったアセット。Copilotに描かせた。↓

コメント

タイトルとURLをコピーしました