【前回の振り返り】
・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.png | 0x7ffd32ac… | 3 (←これが handle) |
この番号(3みたいな数字)が「ハンドラ(handle)」です!
🎮プログラムにすると?
cppコピーする編集するint handle = LoadGraph("player.png");
🔽やってること:
- 「player.png」をメモリに読み込む
- 読み込んだ画像に「番号(ハンドラ)」を割り振る
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に描かせた。↓



コメント