2Dゲーム制作Ⅰ①(2025/04/21)

目的:実践的にゲームを完成させる力を身に着ける

・C言語・プログラミングの考え方をゲーム制作を通して学ぶ。
・審査会向けゲームを制作
・最初の題材はシンプルな2Dゲーム

DXライブラリ

DxLibとは?
⇒Windows用2Dゲーム向けライブラリ。
 DirectXの機能を使いやすくラップしてくれる。初学者にも使いやすいシンプルなAPI。
 日本語ドキュメントが多い。

開発環境について
⇒C言語/VisualStudio2022

C言語とは?
⇒いろいろできるが、管理もすべて自分で行う、というコンセプトのプログラミング言語

ゲームの基本構造
⇒初期化→ゲームループ(ゲーム処理⇔描画処理)→終了
※ゲームループは「無限ループ」を使う

Cのヘッダファイル/ライブラリを適切に設定。
※ヘッダファイル
 🌟ざっくり一言で!

ヘッダファイルは「設計図」や「連絡帳」みたいなもの。

  • 関数の宣言
  • 構造体の定義
  • 定数やマクロの定義

などをまとめておいて、他のCファイル(.cファイル)に「この機能使うよ!」って伝えるために使います。


🧩具体例で見るとわかりやすい

my_math.h ← ヘッダファイル(宣言だけ)

cコードをコピーする// my_math.h
#ifndef MY_MATH_H
#define MY_MATH_H

int add(int a, int b);
int sub(int a, int b);

#endif

my_math.c ← 実装ファイル(中身を書く)

cコードをコピーする// my_math.c
#include "my_math.h"

int add(int a, int b) {
    return a + b;
}

int sub(int a, int b) {
    return a - b;
}

main.c ← メインプログラム(使う側)

cコードをコピーする// main.c
#include <stdio.h>
#include "my_math.h"

int main() {
    printf("%d\n", add(5, 3));  // 8
    printf("%d\n", sub(5, 3));  // 2
    return 0;
}

🤔なんでヘッダファイルが必要なの?

  1. 分業しやすい!
    • たとえば、ゲームの「プレイヤー」「敵」「UI」それぞれ別の人が書いても、ヘッダでつながる!
  2. 複数の .c ファイルで同じ関数を使える!
  3. 中身(実装)を隠して宣言だけ見せることもできる!
    • いわゆる「情報隠蔽」ってやつ。ゲームの内部ロジックは見せたくない時とか便利。

🛡️#ifndef ~ #define ~ #endif はなに?

これは**「二重読み込み防止」**!

同じヘッダを何回も#includeしてもエラーにならないようにするおまじないです。


🎯ヘッダファイルはこう使う!

  • .h には「何があるか(宣言)」を書く
  • .c には「どうやるか(実装)」を書く
  • #include "ファイル名.h" で使いたい機能を読み込む

なんとなくイメージつかめたかな?

例えるなら「.hが企画書」「.cが実装書」って感じ。 または「.hが魔法の呪文のリスト」「.cがその呪文の効果」みたいなゲーム的たとえもいけるかも(笑)

・関数とは「処理(命令)をまとめておくもの」
 これを組み立てて大きなプログラムを組むことができる。

↓今日初めにやった内容。
DXライブラリ置き場 使い方説明

今回使ったソースコード。

#include “DxLib.h”

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
  if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
  {
   return -1 ; // エラーが起きたら直ちに終了
   }
DrawPixel( 320 , 240 , GetColor( 255,255,255 ) ) ; // 点を打つ
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

🔧まず全体の流れをざっくり言うと…

  1. DxLibを初期化
  2. 画面の中央に白い点を打つ
  3. キー入力があるまで待つ
  4. DxLibを終了
  5. アプリ終了

💡コードの中身を1行ずつ解説!


#include "DxLib.h"

👉 DxLibライブラリ(ゲーム作成に便利な命令セット)を使う宣言
これがないと DrawPixel()GetColor() などの命令が使えません!


int WINAPI WinMain(...)

👉 Windowsアプリでの「メイン関数」です!

  • 通常のCでは main() から始まりますが、
  • Windowsアプリでは WinMain() からスタートします。

if( DxLib_Init() == -1 )

👉 DxLibの初期化を試みる。うまくいかなければ -1 が返ってくる。

cコードをコピーするDxLib_Init() == -1

これがエラーの時true になります。


return -1;

👉 初期化に失敗したらすぐ終了!
ゲームがそもそも起動しないときは、ここで止まってくれます。


DrawPixel( 320 , 240 , GetColor( 255,255,255 ) );

👉 画面の中心に白い点を1つ打つ命令!

  • (320, 240):画面のX,Y座標(たいてい640×480なので中心)
  • GetColor(255,255,255):白(R,G,B全部最大)
  • DrawPixel(x, y, color):指定座標に色を置く

🟡 ここで点が表示される!


WaitKey();

👉 何かキーが押されるまで待つ

これがないと、一瞬でウィンドウが閉じちゃいます。


DxLib_End();

👉 DxLibの後片付け(終了処理)
リソースを解放したり、ウィンドウを閉じたり。


return 0;

👉 プログラム正常終了!


🎯まとめると

処理内容
DxLib_Init()ゲーム開発ライブラリの起動
DrawPixel点を描く
WaitKey入力待ち(画面がすぐ消えないように)
DxLib_Endライブラリ終了・後片付け
return 0終了コード(正常終了)

🕹️ちょっとした応用例

cコードをコピーするDrawPixel( 100 , 100 , GetColor( 255,0,0 ) ); // 左上のほうに赤い点
DrawPixel( 200 , 200 , GetColor( 0,255,0 ) ); // 緑の点
DrawPixel( 300 , 300 , GetColor( 0,0,255 ) ); // 青い点

これでRGBの点が打てます✨

・・・で、WinMainの使い方がよくわからなかったのでさらに詳細を

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )

これを人間の言葉でめっちゃやさしく分解して説明していくね。


🎮これは何の関数?

これは Windowsアプリのエントリーポイント(=起動時に最初に呼ばれる関数)です。

通常のCだと int main() がスタートだけど、
Windowsアプリでは WinMain から始まるのがルールなんです。


🧠名前の意味と由来

  • WinMainWindows用のmain関数 って意味!
  • WINAPI は「Windows APIの呼び出し規約」っていう、Windows特有のお作法。

🧩引数の意味(4つもある!)

cコードをコピーするHINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow

ひとつずつ見ていこう!


① HINSTANCE hInstance

👉 このアプリケーションの「実体(インスタンス)」のハンドル

  • Windowsではアプリを「インスタンス」として扱う。
  • hInstance は「このアプリがどこにあるか」を指し示すIDみたいなもの。

📦「今起動してるこのアプリ自体ですよ〜」って伝えるやつ!


② HINSTANCE hPrevInstance(今はほぼ使わない)

👉 昔のWindowsで「前に起動したインスタンス」があるか?という情報

  • 今は常に NULL になる。
  • だから現代ではほぼ無視してOK!

🗑️(ただのレガシー。飾りです)


③ LPSTR lpCmdLine

👉 このアプリが起動されたときに渡されたコマンドライン引数

  • LPSTR は「文字列へのポインタ」=文字列
  • たとえばショートカットのプロパティで MyGame.exe -debug とか指定すると、この -debug がここに入ってくる。

🔍「外部から命令が来たら、それを読む」ための場所!


④ int nCmdShow

👉 ウィンドウを「どう表示するか」の命令

  • 通常は SW_SHOWSW_HIDE などの定数が渡される
  • ShowWindow() 関数に渡すと使える

🪟「ウィンドウ開いていいよ〜」とか「最小化してスタートね」っていう指示!


🧪まとめるとこう!

引数名意味今どき重要?
hInstanceアプリ自体の情報✅ よく使う
hPrevInstance前の起動があるか?❌ 使わない
lpCmdLineコマンド引数✅ たまに使う
nCmdShowウィンドウ表示方法✅ 条件分岐で使える

✨WINAPIってなに?

cコードをコピーするWINAPI

これは**Windows APIの呼び出しルール(stdcall規約)**を示すキーワード。

  • OSが関数を呼び出す時の「お作法」
  • __stdcall っていう呼び方ルールの別名
  • 実は WINAPI#define WINAPI __stdcall って書かれてる

🧑‍💻「Windowsさん、ちゃんとした作法で呼んでくださいね〜」って印!


🎮 最後にざっくりまとめ!

cコードをコピーするint WINAPI WinMain(
    HINSTANCE hInstance,      // 自分自身のID
    HINSTANCE hPrevInstance,  // 古の遺産(無視)
    LPSTR lpCmdLine,          // 起動引数
    int nCmdShow              // ウィンドウの表示方法
)

Windowsアプリはここからスタートする!
➡ DxLibもここに書いていく!

次に使ったソース
DXライブラリ置き場 リファレンスページ
こちらで画像を表示した。

DXライブラリ ゲームプログラム講座
↑こちらで次回の予習!

コメント

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