自分向けのメモです。
具象(メモリ番地、値)と抽象(ポインタ、変数)を合わせて理解すること。
ネット情報はほとんどが抽象だけで説明しようとしており、かえって混乱する。
分からなくなったら、K&Rや公式ドキュメントを紐解くこと。
自分向けのメモです。
具象(メモリ番地、値)と抽象(ポインタ、変数)を合わせて理解すること。
ネット情報はほとんどが抽象だけで説明しようとしており、かえって混乱する。
分からなくなったら、K&Rや公式ドキュメントを紐解くこと。
[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
[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
[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/
[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;
}
}
}
[M1 Mac, Big Sur 11.6.5]
このChapterのcppファイルは17個です。
左から攻めてくる敵機は大砲の設置に対しA*探索アルゴリズムを使って最短ルートを探します。
ゲームプログラミングには数学の知識とセンスが必須だということがよく分かりました。
私は実用アプリしか書いていませんが、こういう要素もたまには取り入れてみたいです。
[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
[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
[M1 Mac, Big Sur 11.6.5]
苦行のようなFLTKアプリ開発がひと段落したので、しばらくはゆるく過ごします。
『ゲームプログラミングC++』という本を購入しました。サンプルコードをいじりながら、楽しく学んでいきます。
Visual StudioやXCodeを使わないノンIDE派の手作り好きなので、以下のMakefileを走らせてコンパイル&ビルドしています。
# コンパイラ設定
COMPILER = clang++
DEBUG = -g
# フラグ設定
CPPFLAGS = $(shell pkg-config sdl2 --cflags --libs) -std=c++11
LDFLAGS =
# includeパス(-I)
INCLUDE = -I/opt/homebrew/Cellar/sdl2/2.0.20/include
# ライブラリパス(-l)
LIBRARY_l = -lsdl2
# 優先ライブラリパス(-L)
LIBRARY_L = -L/opt/homebrew/Cellar/sdl2/2.0.20/lib
# ソースファイル
SRCDIR = .
SRCS = $(SRCDIR)/Main.cpp $(SRCDIR)/Game.cpp
# オブジェクトファイル
OBJDIR = .
OBJS = $(OBJDIR)/Main.o $(OBJDIR)/Game.o
# 実行ファイル
TARGETDIR = .
TARGET = Game01MOD
# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/Main.o: $(SRCDIR)/Main.cpp
$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<
$(OBJDIR)/Game.o: $(SRCDIR)/Game.cpp
$(COMPILER) $(CPPFLAGS) $(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)
これまでSwingを使った簡単なツールの開発過程を記事にしてきました。
今はそれなりの完成度を目指しアプリを開発していますが、基礎的なレベルを離れてネットでもなかなか見つからない独自スキルや創意工夫を盛り込み始めましたので、SwingなどGUI関連は原則的に非公開とします。
そういったことを気に掛ける程度にはプログラミングレベルが向上してきた様です。