[C++]『ゲームプログラミングC++』Chapter02 Game::LoadData

引き続きGame.cppの読解です。

// 宇宙船、背景2枚の描画設定
void Game::LoadData(){ // Game::Initialize()内で実行
	// 宇宙船の設定
	mShip = new Ship(this);
	mShip->SetPosition(Vector2(100.0f, 384.0f)); // 位置は左側中央とする SetPositionはActorのメンバ関数
	mShip->SetScale(1.5f); // SetScaleはActorのメンバ関数

	// Actor tempをWindowの中心に設定 bgのowner
	Actor* temp = new Actor(this);
	temp->SetPosition(Vector2(512.0f, 384.0f));

	// BGSpriteComponent bgの設定(ownerはtemp,優先度100) 最背面の宇宙
	BGSpriteComponent* bg = new BGSpriteComponent(temp); // SpriteComponent, Componentを継承
	bg->SetScreenSize(Vector2(1024.0f, 768.0f)); // BGSpriteComponent独自のメンバ関数
	std::vector<SDL_Texture*> bgtexs = { // SDLテクスチャのvector配列を作成
		GetTexture("../Assets/Farback01.png"), // GetTextureはGameのメンバ関数
		GetTexture("../Assets/Farback02.png")
	};
	bg->SetBGTextures(bgtexs); // bgにSDLテクスチャをセット
	bg->SetScrollSpeed(-100.0f); // bgのスクロール速度を-100とする
	
	bg = new BGSpriteComponent(temp, 50); // 優先度50のbgを新たに作成 手前の星
	bg->SetScreenSize(Vector2(1024.0f, 768.0f));
	bgtexs = {
		GetTexture("../Assets/Stars.png"),
		GetTexture("../Assets/Stars.png")
	};
	bg->SetBGTextures(bgtexs);
	bg->SetScrollSpeed(-200.0f); // スクロール速度は倍の-200に設定
}

[C++]『ゲームプログラミングC++』Chapter02 Game::UpdateGame

学習経過のメモ書きです。進度チェック用なので私以外には意味のない記事でしょう。

サンプルコードをつぶさにチェックし意味を把握するという地味な作業です。日本語のコメントに書き換えまたは追加しています。

私にとっては新しい分野かつ英語ユーザーが書いたコード&コメントなのでこういった作業をしないとなかなか頭に定着しません。

まあのんびり取り組みます。

void Game::UpdateGame(){
	// 1コマ16ms経過するまでの処理(特になし)
	while (!SDL_TICKS_PASSED(SDL_GetTicks(), mTicksCount + 16)){
	}

	// 1ループ時間を算出
	float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f;
	if (deltaTime > 0.05f){
		deltaTime = 0.05f;
	}

	// SDL初期化からの経過時間
	mTicksCount = SDL_GetTicks();

	// ActorとComponentsのUpdate
	mUpdatingActors = true;
	for (auto actor : mActors){
		actor->Update(deltaTime); 
	}
	mUpdatingActors = false;

	// 保留ActorのmActorsへの追加
	for (auto pending : mPendingActors){
		mActors.emplace_back(pending);
	}
	mPendingActors.clear();

	// EDead状態ActorのdaadActorsへの追加
	std::vector<Actor*> deadActors;
	for (auto actor : mActors){
		if (actor->GetState() == Actor::EDead){
			deadActors.emplace_back(actor);
		}
	}

	// deadActorsのメモリ解放
	for (auto actor : deadActors){
		delete actor;
	}
}

[C++]『ゲームプログラミングC++』Chapter05 Makefile案

[M1 Mac, Big Sur 11.6.5]

完成作ではありませんが、どうやら詰んでしまったようなので記念に上げておきます。

ビルドまでできたものの、実行時にShaderが読めないとかで起動できません。XCodeでも同様でした。

SOIL(Simple OpenGL Image Library)関連でも3つエラーが出ており、該当部分を無効にして無理やりビルドしましたが結局実行できずです。

そもそもSOILの公式サイトは閉鎖されていて、GitHubに有志?の方がアップされているのみで挙動が怪しくなるのも仕方ないと思います。

今はChapter02のコードを自分で書こうとしていますが、Chapter05に着手したらかなりの修正が必要になるでしょう。

今なりに代替策はあるはずなので何とかしたいものです。

# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = $(shell pkg-config sdl2 --cflags --libs) -std=c++11
CPPFLAGS2 = $(shell pkg-config sdl2_image --cflags --libs)
CPPFLAGS3 = $(shell pkg-config glew --cflags --libs)
CPPFLAGS4 = $(shell pkg-config sdl2_mixer --cflags --libs)
CPPFLAGS5 = $(shell pkg-config sdl2_ttf --cflags --libs)
CPPFLAGS6 = $(shell pkg-config soil --cflags --libs)

LDFLAGS = -lc++ -framework CoreFoundation -framework OpenGL

# includeパス(-I)
INCLUDE = -I./include -I/opt/homebrew/Cellar/sdl2/2.0.20/include -I/opt/homebrew/Cellar/sdl2_image/2.0.5/include \
-I/opt/homebrew/Cellar/glew/2.2.0_1/include -I/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/include \
-I/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/include -I/usr/local/include

# ライブラリパス(-l)
LIBRARY_l = -lsdl2 -lsdl2_image -lglew  -lsdl2_mixer -lsdl2_ttf -lsoil

# 優先ライブラリパス(-L)
LIBRARY_L = -L/opt/homebrew/Cellar/sdl2/2.0.20/lib -L/opt/homebrew/Cellar/sdl2_image/2.0.5/lib \
-L/opt/homebrew/Cellar/glew/2.2.0_1/lib -L/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/lib \
-L/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/lib -L/usr/local/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(addprefix $(OBJDIR), $(patsubst ./src/%.cpp,/%.o,$(SRCS)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = Game05_01

list : echo $(SRCS) && echo $(OBJS)
	
# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS)

# 全ソース・コンパイル&ビルド
.PHONY:all
all: clean $(OBJS) $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app

[C++]『ゲームプログラミングC++』Chapter04 Makefileの改良 正規表現と関数

[M1 Mac, Big Sur 11.6.5]

Makefileのソースファイルおよびオブジェクトファイルが個別表記になっていましたが、正規表現とMakefile関数を使い全体を短縮しました。

これでChapterごとにMakefileを作る手間がだいぶ省けますので、学習がはかどりそうです。

# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = $(shell pkg-config sdl2 --cflags --libs) -std=c++11
CPPFLAGS2 = $(shell pkg-config sdl2_image --cflags --libs)
CPPFLAGS3 = $(shell pkg-config glew --cflags --libs)
CPPFLAGS4 = $(shell pkg-config sdl2_mixer --cflags --libs)
CPPFLAGS5 = $(shell pkg-config sdl2_ttf --cflags --libs)
CPPFLAGS6 = $(shell pkg-config soil --cflags --libs)

LDFLAGS = -lc++

# includeパス(-I)
INCLUDE = -I./include -I/opt/homebrew/Cellar/sdl2/2.0.20/include -I/opt/homebrew/Cellar/sdl2_image/2.0.5/include \
-I/opt/homebrew/Cellar/glew/2.2.0_1/include -I/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/include \
-I/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/include -I/usr/local/include

# ライブラリパス(-l)
LIBRARY_l = -lsdl2 -lsdl2_image -lglew  -lsdl2_mixer -lsdl2_ttf -lSOIL

# 優先ライブラリパス(-L)
LIBRARY_L = -L/opt/homebrew/Cellar/sdl2/2.0.20/lib -L/opt/homebrew/Cellar/sdl2_image/2.0.5/lib \
-L/opt/homebrew/Cellar/glew/2.2.0_1/lib -L/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/lib \
-L/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/lib -L/usr/local/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(addprefix $(OBJDIR), $(patsubst ./src/%.cpp,/%.o,$(SRCS)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = Game04

list : echo $(SRCS) && echo $(OBJS)
	
# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS)

# 全ソース・コンパイル&ビルド
.PHONY:all
all: clean $(OBJS) $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app

[C++]『ゲームプログラミングC++』ソースファイルの仕分け

[M1 Mac, Big Sur 11.6.5]

Chapter05ではソースファイルが16個になり手作業での仕分けがしんどくなってきたので、シェルスクリプトで自動処理しました。

source classify_files.sh
#!/bin/bash

mkdir {bin,include,obj,src,ide}
mv -n *.cpp src/
mv -n *.h include/
mv -n *.sln ide/
mv -n *.xcodeproj ide/
mv -n *.vcxproj ide/
mv -n *.filters ide/

[C++]『ゲームプログラミングC++』Chapter01 ゲームPONGの改造

[M1 Mac, Big Sur 11.6.5]

サンプルコードで遊ぶのはほどほどにして本を初めからきちんと読み始めました。

内容を理解しつつ卓球ゲームPONGを改造しています。

とりあえず、以下のように変えました。
1.任意の文字を入力するまで始まらない。
2.一時停止できる。文字入力で再開。
3.ボールを左にそらしても一時停止後、文字入力でリセット再開する。
4.パドルを最大にして全てのボールを打ち返せるようにする。解除も可。

あとは文字やタイムの埋め込み、パドルに当たったところによってダーツのように点数をつけるなどでしょうか。

Chapter01はここまでにして次に進むことにします。

<改造箇所>

// Pを押すと一時停止、Iで無限モード、Uで解除
void Game::ProcessInput(){
	SDL_Event event;
	while (SDL_PollEvent(&event)){
		switch (event.type){
			case SDL_QUIT:
				mIsRunning = false;
				break;
			case SDL_KEYDOWN:
				switch(event.key.keysym.sym){
					case SDLK_p:
						std::cin >> str;
						std::cout << "str: " << str << std::endl;
						break;
					case SDLK_i:
						paddleH += 1600.0f;
						break;
					case SDLK_u:
						paddleH -= 1600.0f;
						break;
				}
		}
	}

[C++]『ゲームプログラミングC++』Chapter04 A*探索アルゴリズム

[M1 Mac, Big Sur 11.6.5]

このChapterのcppファイルは17個です。

左から攻めてくる敵機は大砲の設置に対しA*探索アルゴリズムを使って最短ルートを探します。

ゲームプログラミングには数学の知識とセンスが必須だということがよく分かりました。

私は実用アプリしか書いていませんが、こういう要素もたまには取り入れてみたいです。

[C++]『ゲームプログラミングC++』Chapter03 Makefile

[M1 Mac, Big Sur 11.6.5]

Chapter03ではcppファイルが9個から13個に増えました。火球を発射して小惑星を撃ち落とせます。ただし宇宙船に小惑星がぶつかっても何も起こりません。

もはやプログラミングの勉強というよりゲームの進化に興味が向いています。このプログラムはベクトルなどを駆使して書かれています。アプリの動く背景とかに使えそうです。

Makefileはファイルが増えた分を書き足しただけです。

# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = $(shell pkg-config sdl2 --cflags --libs) -std=c++11
CPPFLAGS2 = $(shell pkg-config sdl2_image --cflags --libs)
CPPFLAGS3 = $(shell pkg-config glew --cflags --libs)
CPPFLAGS4 = $(shell pkg-config sdl2_mixer --cflags --libs)
CPPFLAGS5 = $(shell pkg-config sdl2_ttf --cflags --libs)
CPPFLAGS6 = $(shell pkg-config soil --cflags --libs)

LDFLAGS = -lc++

# includeパス(-I)
INCLUDE = -I./include -I/opt/homebrew/Cellar/sdl2/2.0.20/include -I/opt/homebrew/Cellar/sdl2_image/2.0.5/include \
-I/opt/homebrew/Cellar/glew/2.2.0_1/include -I/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/include \
-I/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/include -I/usr/local/include

# ライブラリパス(-l)
LIBRARY_l = -lsdl2 -lsdl2_image -lglew  -lsdl2_mixer -lsdl2_ttf -lSOIL

# 優先ライブラリパス(-L)
LIBRARY_L = -L/opt/homebrew/Cellar/sdl2/2.0.20/lib -L/opt/homebrew/Cellar/sdl2_image/2.0.5/lib \
-L/opt/homebrew/Cellar/glew/2.2.0_1/lib -L/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/lib \
-L/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/lib -L/usr/local/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(SRCDIR)/Main.cpp $(SRCDIR)/Game.cpp $(SRCDIR)/Actor.cpp \
$(SRCDIR)/Asteroid.cpp $(SRCDIR)/CircleComponent.cpp $(SRCDIR)/Component.cpp \
$(SRCDIR)/InputComponent.cpp $(SRCDIR)/Laser.cpp $(SRCDIR)/Math.cpp \
$(SRCDIR)/MoveComponent.cpp $(SRCDIR)/Random.cpp $(SRCDIR)/Ship.cpp \
$(SRCDIR)/SpriteComponent.cpp

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(OBJDIR)/Main.o $(OBJDIR)/Game.o $(OBJDIR)/Actor.o \
$(OBJDIR)/Asteroid.o $(OBJDIR)/CircleComponent.o $(OBJDIR)/Component.o \
$(OBJDIR)/InputComponent.o $(OBJDIR)/Laser.o $(OBJDIR)/Math.o \
$(OBJDIR)/MoveComponent.o $(OBJDIR)/Random.o $(OBJDIR)/Ship.o \
$(OBJDIR)/SpriteComponent.o

# 実行ファイル
TARGETDIR = ./bin
TARGET = Game03_01

# cppファイルからoファイル作成 $<:依存ファイル
#1
$(OBJDIR)/Main.o: $(SRCDIR)/Main.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#2
$(OBJDIR)/Game.o: $(SRCDIR)/Game.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#3
$(OBJDIR)/Actor.o: $(SRCDIR)/Actor.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#4
$(OBJDIR)/Asteroid.o: $(SRCDIR)/Asteroid.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#5
$(OBJDIR)/CircleComponent.o: $(SRCDIR)/CircleComponent.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#6
$(OBJDIR)/Component.o: $(SRCDIR)/Component.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#7
$(OBJDIR)/InputComponent.o: $(SRCDIR)/InputComponent.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#8
$(OBJDIR)/Laser.o: $(SRCDIR)/Laser.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#9
$(OBJDIR)/Math.o: $(SRCDIR)/Math.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#10
$(OBJDIR)/MoveComponent.o: $(SRCDIR)/MoveComponent.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#11
$(OBJDIR)/Random.o: $(SRCDIR)/Random.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#12
$(OBJDIR)/Ship.o: $(SRCDIR)/Ship.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#13
$(OBJDIR)/SpriteComponent.o: $(SRCDIR)/SpriteComponent.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS) 

# 全ソース・コンパイル&ビルド
.PHONY:all
all: clean $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app

[C++]『ゲームプログラミングC++』Chapter02 Makefile

[M1 Mac, Big Sur 11.6.5]

GUIのXCodeは使わずにコンソールでコンパイル&ビルドしています。Chapter01のソースコードは簡単に動いたものの、Chapter02になって難易度が格段に上がりました。

Actor.oが生成されていないことに気が付かず長時間停滞したこともあり、ファイルが見やすいように各ディレクトリに移動させました。

Makefileは後のChapterを視野に入れているので本来必要な内容より分量多めになっています。

またしてもFLTK&OpenCVの時と同様にmath.hがらみのエラーが発生したため、Math.hをMath2.hにリネームしました。FLTKの開発者もそうですが、安易にmath.hという命名はしないでいただきたいものです。

とりあえずサンプルアプリは動いています。WSAD各キーで宇宙船の位置を変えることができます。方向キーに変えた方がプレイしやすいですね。

# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = $(shell pkg-config sdl2 --cflags --libs) -std=c++11
CPPFLAGS2 = $(shell pkg-config sdl2_image --cflags --libs)
CPPFLAGS3 = $(shell pkg-config glew --cflags --libs)
CPPFLAGS4 = $(shell pkg-config sdl2_mixer --cflags --libs)
CPPFLAGS5 = $(shell pkg-config sdl2_ttf --cflags --libs)
CPPFLAGS6 = $(shell pkg-config soil --cflags --libs)

LDFLAGS = -lc++

# includeパス(-I)
INCLUDE = -I./include -I/opt/homebrew/Cellar/sdl2/2.0.20/include -I/opt/homebrew/Cellar/sdl2_image/2.0.5/include \
-I/opt/homebrew/Cellar/glew/2.2.0_1/include -I/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/include \
-I/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/include -I/usr/local/include

# ライブラリパス(-l)
LIBRARY_l = -lsdl2 -lsdl2_image -lglew  -lsdl2_mixer -lsdl2_ttf -lSOIL

# 優先ライブラリパス(-L)
LIBRARY_L = -L/opt/homebrew/Cellar/sdl2/2.0.20/lib -L/opt/homebrew/Cellar/sdl2_image/2.0.5/lib \
-L/opt/homebrew/Cellar/glew/2.2.0_1/lib -L/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/lib \
-L/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/lib -L/usr/local/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(SRCDIR)/Main.cpp $(SRCDIR)/Game.cpp $(SRCDIR)/Actor.cpp \
$(SRCDIR)/AnimSpriteComponent.cpp $(SRCDIR)/BGSpriteComponent.cpp $(SRCDIR)/Component.cpp \
$(SRCDIR)/Math.cpp $(SRCDIR)/Ship.cpp $(SRCDIR)/SpriteComponent.cpp

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(OBJDIR)/Main.o $(OBJDIR)/Game.o $(OBJDIR)/Actor.o \
$(OBJDIR)/AnimSpriteComponent.o $(OBJDIR)/BGSpriteComponent.o $(OBJDIR)/Component.o \
$(OBJDIR)/Math.o $(OBJDIR)/Ship.o $(OBJDIR)/SpriteComponent.o

# 実行ファイル
TARGETDIR = ./bin
TARGET = Game02_01

# cppファイルからoファイル作成 $<:依存ファイル
#1
$(OBJDIR)/Main.o: $(SRCDIR)/Main.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#2
$(OBJDIR)/Actor.o: $(SRCDIR)/Actor.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#3
$(OBJDIR)/Game.o: $(SRCDIR)/Game.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#4
$(OBJDIR)/AnimSpriteComponent.o: $(SRCDIR)/AnimSpriteComponent.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#5
$(OBJDIR)/BGSpriteComponent.o: $(SRCDIR)/BGSpriteComponent.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#6
$(OBJDIR)/Component.o: $(SRCDIR)/Component.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#7
$(OBJDIR)/Math.o: $(SRCDIR)/Math.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#8
$(OBJDIR)/Ship.o: $(SRCDIR)/Ship.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<
#9
$(OBJDIR)/SpriteComponent.o: $(SRCDIR)/SpriteComponent.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS) 

# 全ソース・コンパイル&ビルド
.PHONY:all
all: clean $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app