VGS-Zero のゲームを開発するための初期プロジェクトです。
VGS-Zero のゲーム開発は Linux (推奨) または macOS に対応しています。
# install GNU Make, GCC and other
sudo apt install build-essential
# install SDL2
sudo apt-get install libsdl2-dev
# install ALSA
sudo apt-get install libasound2
sudo apt-get install libasound2-dev
SDCC 4.1.0 をインストールしてパスを切る。
apt や apt-get で sdcc をインストールすると対応していないバージョン(4.1.0以外)がインストールされる可能性があるため、上記リンクからダウンロードしたものを使用してください。
- XCODE
brew install sdl2
- SDCC 4.1.0をインストールしてパスを切る
HomeBrew で sdcc をインストールすると対応していないバージョン(4.1.0以外)がインストールされる可能性があるため、上記リンクからダウンロードしたものを使用してください。(ただし、未署名バイナリなので Finder で control ボタンを押しながら開き1ファイルづつ実行の許可をする必要があり面倒くさいので頑張ってください)
# 本リポジトリを mygame として取得
git clone https://github.com/suzukiplan/vgszero-empty-project mygame
# ディレクトリ移動
cd mygame
# .git を削除
rm -rf .git
# submodule を一旦削除
rm .gitmodules
rm -rf vgszero
# ./src/Makefile を編集して PROJECT を自分のプロジェクト名に変更するなど
vi ./src/Makefile
# README.md をクリア
echo "# mygame" >README.md
# .git を初期化
git init
# サブモジュールを追加
git submodule add https://github.com/suzukiplan/vgszero
# commit
git add -A
git commit -m "initial commit"
# ビルド
make
- make が完了すると SDL2 版 VGS-Zero がビルドされた game.pkg を起動します
- 初回 make には少し時間が掛かりますが 2 回目以降は高速になります
2. ./src/Makefile の編集方法
編集が必要な箇所は先頭の 5 行(以下)のみです。
PROJECT = mygame
SRC_FILES = main.rel table.rel
CHR_FILES = image0.chr image1.chr image2.chr
WAV_FILES = se0.wav se1.wav se2.wav
BGM_FILES = song0.bgm song1.bgm song2.bgm
PROJECT
... プロジェクト名SRC_FILES
... C言語のプログラム(.c)からコンパイルされるオブジェクトファイル(.rel)を記述(複数可)CHR_FILES
... バンク4(第5バンク)以降に追加される映像データ(.bmp から変換される .chr)ファイルを記述(複数可)WAV_FILES
... 効果音データ(.wav)ファイルを記述(複数可)BGM_FILES
... BGMデータ(.mml からコンパイルされる .bgm)ファイルを記述(複数可)
ファイル数が多くて 1 行で記述するのが大変な場合、次のように定義することもできます。
SRC_FILES = main.rel
SRC_FILES += table.rel
SRC_FILES += hoge.rel
SRC_FILES += hige.rel
SRC_FILES += hage.rel
- ./src/main.c ... プログラムのメインコード
- ./src/table.c ... 定数テーブル(constグローバル変数)の実体定義など
- ./src/header.h ... 共通ヘッダーファイル
- 初期状態は Hello, World! (BGM & SE 付き) になっています
- ./src/Makefile の
SRC_FILES
に追加ファイルの拡張子(.c)を .rel にしたものを追加 - [./src] ディレクトリにソースファイル(.c)を追加
- 追加ソースで定義する関数プロトタイプなどを [./src/header.h] に定義
- ./src/Makefile の
WAV_FILES
に効果音ファイル(.wav)を追加 - [./src] ディレクトリに効果音ファイル(.wav)を追加
vgs0_se_play
に指定する効果音番号はWAV_FILES
の指定位置(0スタート)です
- ./src/Makefile の
BGM_FILES
に追加する MML ファイルの拡張子(.mml)を .bgm にしたものを追加 - [./src] ディレクトリに MML ファイル(.mml)を追加
vgs0_bgm_play
に指定する BGM 番号はBGM_FILES
の指定位置(0スタート)です
SDCCにはバグが多いので、C言語の規約通りに実装しても想定通りに動かないケースが多いです。
int n = 0;
do {
vars[n++] = 0; // インクリメント演算子が想定通りに動かない
} while (n != 0);
// C 規約ではなく C++ 規約だが for の変数宣言スコープがおかしい
for (int a = 0; a < 8; a++) {
;
}
int a = 1234; // 最初の a が for の外側スコープ扱いなのでコンパイルエラーになる
一般論ですが、コンパイラの開発では優先順位のバグは(優先度の考え方がそもそも複雑なこともあって)かなり作り込まれる可能性が高い傾向があるので、複雑な演算は分解して記述するなど、品質の低いコンパイラのバグエンカウントを避けるコーディングなどが有効ではないかと考えられます。
コンパイラが使えるだけ有り難いので、その辺を完全に避けたい場合、フルアセでのプログラミングをオススメします。(アセンブラはコンパイラと違って単純なのでバグリスクが低いです)