[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