目的:実践的にゲームを完成させる力を身に着ける
・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;
}
🤔なんでヘッダファイルが必要なの?
- 分業しやすい!
- たとえば、ゲームの「プレイヤー」「敵」「UI」それぞれ別の人が書いても、ヘッダでつながる!
- 複数の
.c
ファイルで同じ関数を使える! - 中身(実装)を隠して宣言だけ見せることもできる!
- いわゆる「情報隠蔽」ってやつ。ゲームの内部ロジックは見せたくない時とか便利。
🛡️#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 ; // ソフトの終了
}
🔧まず全体の流れをざっくり言うと…
- DxLibを初期化
- 画面の中央に白い点を打つ
- キー入力があるまで待つ
- DxLibを終了
- アプリ終了
💡コードの中身を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
から始まるのがルールなんです。
🧠名前の意味と由来
WinMain
はWindows用の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_SHOW
やSW_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ライブラリ ゲームプログラム講座
↑こちらで次回の予習!
コメント