開発環境の構築
アプリを実機で動作確認するための準備やアプリの公開手順については、このページでは扱いません。以下のサイトなどを参考にしてください。
Xcode 4.3 以降ではビルドに必要なツールが入っていないため、以下の手順に従ってインストールします。
- Command Line Tools のインストール
- Mac Ports の「Quickstart」の中の macOS Big Sur v11 をクリックし、MacPorts のインストーラをダウンロードしてインストールします。次に、ターミナルから以下のコマンドを入力してビルドに必要なツールをインストールします。関連ツールもインストールするため、終了するまで時間がかかります。
> sudo port install automake
> sudo port install autoconf
> sudo port install libtool
> sudo port install pkgconfig
注意:先頭の > はプロンプトなので入力しません。
SDK の導入
- ファインダーを起動し、メニューバーから「移動」→「ホーム」を選択してホームディレクトリに移動します。次に、src という名前のフォルダを作成し、上から最新の SDK (onscripter_ios_Xcode*.tar.gz)をダウンロードして src フォルダの中に展開します。
- Mac OS X の「アプリケーション」->「ユーティリティ」->「ターミナル.app」を起動し、以下のコマンドを実行します。
> cd ~/src/onscripter_ios
> source dev_iPhoneOS.sh
> make clean
> make
> source dev_iPhoneSimulator.sh
> make clean
> make
注意:先頭の > はプロンプトなので入力しません。また、初回の make clean はエラーで終了しますが、そのまま make に進んでください。
これによって、以下のライブラリが実機用とシミュレータ用にそれぞれ作成されます。
アプリの作成
以下のワークスペースファイルをダブルクリックして Xcode で開きます。
onscripter_ios/ONScripter.xcworkspace
実機ではなくシミュレータ用に作成する場合は、Xcode ウィンドウの左上に表示される「ONScripter」の右側を Generic iOS Device (端末が接続されている場合は端末名) からそれ以外 (iPhone 12 Pro Max など) に変更します。
最新の ONScripter の導入
ONScripter のページから最新の ONScripter のソースコード(onscripter-????????.tar.gz)をダウンロードして適当な場所に展開します。
図1の1をクリックし、展開したソースコードの内全ての *.cpp, *.h ファイルをファインダーを使って Sources (図1の2)にドラッグします(ドラッグ前にファインダー側で「種類」を押してソートしておくと楽です)。そのときにダイアログが出ますが、Add to targets で ONScripter にチェックを入れてから「Finish」ボタンを押してください(これをしないとドラッグしたファイルがビルドされません)。さらに、ドラッグしたファイルの内、不必要な以下のファイルを Sources から(Delete キーで)削除します(図1は削除後の状態)。
AVIWrapper.h
AVIWrapper.cpp
conv_shared.cpp
nsaconv.cpp
nsadec.cpp
nscriptdecode.cpp
sarconv.cpp
sardec.cpp
simple_aviplay.cpp
Sources の以下のファイルを右クリックして Show File Inspector を選択し、Xcode ウィンドウの右側に表示される Identiy and Type の File Type を Objective-C++ source に変更します。
onscripter_main.cpp
プロジェクトの設定
図1の 3 をクリックし、さらに上図の TARGETS の下の ONScripter をクリックして、以下のようにプロジェクトの設定を変更します。赤字の部分は適宜変更してください。
General の項目 | 設定値 |
Bundle Identifier |
jp.ogapee.ONScripter |
Version |
1.0 |
Build |
1.0 |
Deployment Target |
9.0 |
Devices |
Universal |
Supported Interface Orientations |
Landscape Left, Landscape Right (マウスでクリック) |
Launch Images |
起動時に表示される画像を指定(必要ないなら消去) |
Info の項目 | 設定値 |
App Transport Security Settings
Exception Domains |
onscripter.osdn.jp |
Build Settings の項目 | 設定値 |
Product Name |
ONScripter |
Preprocessor Macros |
IOS |
UTF8_FILESYSTEMS |
USE_LUA |
USE_SMPEG |
MP3_MAD |
PDA_AUTOSIZE |
USE_SDL_RENDERER |
HAVE_CONTENTS |
RENDER_FONT_OUTLINE |
ZIP_URL=\"http://*.*/*/*.zip\" |
MAGIC_FILE=\".20171105\" |
USE_SELECTOR |
アプリ名
Bundle Identifier にはドメイン名、Product Name にはアプリ名を設定します。jp.company.Game1 という名前にする場合は、Product Name に Game1、Bundle Identifier に jp.company.Game1 を設定します。Bundle Identifier の最後には Product Name に設定した文字列が自動的に入ります。インストール後のアプリアイコンの下には Game1 と表示されます。
ゲームデータの配布方法
ゲームデータを内蔵する場合
ゲームデータを内蔵する場合は HAVE_CONTENTS を定義してください。この場合、ZIP_URL は指定しません。詳しくはゲームデータの内蔵方法を参考にしてください。
ゲームデータを初回にダウンロードする場合
ゲームデータを初回にダウンロードする場合は、ご自身でサーバを用意し、ZIP_URL にゲームの構成ファイルを全てまとめた単一の zip ファイルの URL を指定してください。URL の左右両方にバックスラッシュ(\)とダブルクオート(")を入れる点に注意してください。この場合、HAVE_CONTENTS は指定せず削除します。ゲームの構成ファイルのうち nscript.dat, arc.nsa, default.ttf 等は zip 内の(フォルダを挟まない)直下に置いてください。例えば、Lhaca デラックス版、Explzh、WinZipなどのzip作成ソフトを起動し、nscript.dat, arc.nsa, default.ttf などのファイルを直接ドラッグ&ドロップすれば正しく zip ファイルが作成されます。
また、「Info の項目」→「NSAppTransportSecurity」→「NSExceptionDomains」のドメイン(デフォルトは onscripter.osdn.jp)を、ZIP_URL で指定した URL のドメインに変更してください。変更しないとダウンロードできません。
MAGIC_FILE にはゲームデータのバージョン管理用のファイル名を指定します。ファイル名の左右両方にバックスラッシュ(\)とダブルクオート(")を入れる点に注意してくださいです。HAVE_CONTENTS もしくは ZIP_URL が指定された状態で、ゲーム起動時にこのファイルが存在しない場合に、ゲームデータのコピーもしくはダウンロードを実行し、最後に MAGIC_FILE で指定した空のファイルを作成してゲームを開始します。ゲームの構成ファイルを更新するときに変更してください。ファイル名は、ゲームの構成ファイルと重ならない名前であれば任意の名前を指定できますが、上の例のようにリリースした日付などにしておくと管理しやすいと思います。
アプリを更新する際に、エンジン部分(ONScripter)だけを変更してゲームデータは変更しない場合は、MAGIC_FILE を更新する必要はありません。
ゲームの選択機能
USE_SELECTOR を定義すると、起動時にゲームを選択できるようになります。ゲームデータは、アプリをインストールした後に、iFunBox (Windows版の iFunbox 4.0 Preview 以降)などを使って端末のアプリの Library/Caches 直下に任意の名前のフォルダを作成してその中に置いてください。ただし、ゲームデータがあるフォルダが Library/Caches 直下に1つしかない場合は、無条件にそのフォルダにあるゲームが実行されます。また、Documents の下にも同じ名前の空のフォルダを作成してください。セーブデータはこちらに保存されます。
iFunBox が使えない場合は、Xcode の Windows → Devices and Simulators から Installed Apps の ONScripter を選択し、Download Container でアプリのファイル一式を Mac 側にコピーし、Finder で中身を編集してから、Replace Container で端末に書き戻しても構いません。
HAVE_CONTENTS と USE_SELECTOR、もしくは ZIP_URL と USE_SELECTOR を併用することもできます。内蔵ゲームデータもしくは ZIP_URL で指定されたゲームデータは Library/Caches/ONS フォルダに展開されます。併用した場合、もし Library/Caches 直下に他にフォルダがなければ、内蔵したもしくはダウンロードしたゲームが無条件に実行されます。ユーザがフォルダを追加した場合は、起動時にゲーム選択画面が表示されます。
文字の輪郭描画
RENDER_FONT_OUTLINE を定義すると、起動オプションで --render-font-outline を指定した場合と同じになります。文字が見やすくなるのでおすすめです。
ゲームデータの内蔵方法
HAVE_CONTENTS を定義した場合のゲームデータの内蔵方法について説明します。まず、ゲームデータをまとめたフォルダの名前を ONS にします。次に、ファインダーで ONS フォルダを Xcode の Resources にドラッグします。このときに、ダイアログが表示されるので、必ず Create folder references for any added folders にチェックを入れてください。こうすることで、図2の例に示すようにフォルダの階層構造を保ったまま Resources にコピーすることができます。
アプリを実行すると、もし Library/Caches/ONS が存在しない場合、もしくは Library/Caches/ONS/ 以下に MAGIC_FILE が存在しない場合に、Resources から ONS を Library/Caches/ONS にコピーし、Library/Caches/ONS/ 以下に MAGIC_FILE を作成した後にゲームを開始します。このとき、セーブデータなど後から生成されるファイルは、ゲームデータの中に元々含まれていない限り消されずに残ります。
アイコン
アプリのアイコンを変更するには、以下のファイルを差し替えてください。
onscripter_ios/ONScripter/Default.png (起動時に表示される画像 例 320x480)
onscripter_ios/ONScripter/Icon.png (アイコン iPhone 57x57, iPhone(Retina Display) 114x114, iPad 72x72)
作成
メニューバーの「Product」->「Scheme」->「Edit Scheme」の Run ONScripter.app の Build Configuration を Debug から Release に変更します。
メニューバーの「Product」->「Build」を実行します。
アプリの作成に成功したら、メニューバーの「Product」->「Run」を実行するとプログラムが起動します。
Xcode で "Signing for "ONScripter" requires a development team. Select a development team in the Signing & Capabilities editor." というエラーが出る場合には、プロジェクトの設定の Signing & Capabilities の Signing 項で、Automatically manage signing のチェックを一度外してから再度チェックを入れ、続いてその直下の Team を設定してください。
アプリの申請
Xcode から App Store にアプリを登録するには以下のようにします。
- メニューバーの「Product」->「Archive」を実行して申請用にアプリを作成
- Xcode ウィンドウの右上に表示される Organizer ボタンをクリックし、Archives から Validatet ボタンを押してアプリをチェック
- 同様に Organizer の Archives から「Upload to App Store」ボタンを押して申請
ただし、上記以外にも作業が必要なので、詳しいアプリの申請方法については、例えば以下のサイトを参考にしてください。
zip 内のゲームデータの配置方法
ゲームデータを初回にダウンロードする場合に、スクリプトファイル(nscript.dat や 00.txt)、アーカイブファイル(arc?.nsa や ??.ns2), フォントファイル(default.ttf)は zip 内の(フォルダを挟まない)直下に置いてください。その他のファイルはサブフォルダの下にあっても構いません。Android 版でも同じ zip ファイルが使用できます。
nscript.dat (ゲームの構成ファイル)
arc.nsa (ゲームの構成ファイル)
default.ttf (自分で用意するフォントファイル)
... (その他のゲームの構成ファイル (基本的に全てコピー))
- ゲームの構成ファイル(arc.nsa など) は解像度変更などはせずに元のファイル(サブフォルダを含む)をそのままコピーしてください。
- TrueType font による文字表示を参考にフォントファイルを default.ttf という名前で同じ場所に置いてください。
例えばM+とIPAの合成フォントの Migu 2M の太字 (Migu-2M-bold.ttf) が、きれいな太字で見やすくお勧めです。
実行方法
実機と MacOSX を接続して Xcode から実行するか、もしくは ONScripter のアイコンをタップして ONScripter を起動してください。
画面をタップすることによってゲームが進行します。同時にタップする指の本数によって機能が変わります。同時にタップする場合は、1本ずつ順に画面に触れてください。
タップ方法 | 機能 |
指1本 | 左クリック |
指2本 | 右クリック |
指3本 | 早送り(ctrl キー) |
その他
使用しているライブラリの修正箇所を以下に記します。
SDL
- Retina display に対応するために、「Bug 1394 - Fixes for SDL's handling of "Retina" display on iOS devices」のパッチをあてています。
- iOS 6.0 に対応するため、src/video/uikit 以下を、2012/10/29 時点のリポジトリ上の SDL のものと差し替えています。
- Xcode 6.1.1 に対応するために、以下のように修正しています。
--- SDL-old/src/video/uikit/SDL_uikitappdelegate.m 2012-10-30 01:05:43.000000000 +0900
+++ SDL-new/src/video/uikit/SDL_uikitappdelegate.m 2015-01-11 17:12:36.000000000 +0900
@@ -38,6 +38,7 @@
#endif
extern int SDL_main(int argc, char *argv[]);
+extern void SDL_iPhoneSetEventPump(SDL_bool enabled);
static int forward_argc;
static char **forward_argv;
static int exit_status;
SDL_image
- IMG_bmp.c, IMG_gif.c, IMG_jpg.c, IMG_png.c の Target Membership にチェックを入れて使用されるようにしています。
- iOS 9.3.3 で読み込んだ画像が乱れる場合があるので、SDL_image 2.0 を参考に、IMG_ImageIO.m の CGColorSpaceCreateCalibrateRGB を CGColorSpaceCreateDeviceRGB に変更しました。
SDL_mixer
SDL_ttf
- 現時点(2012/01/11)でリポジトリにある SDL_ttf.c の TTF_RenderGlyph_Shaded 関数には文字が全く描画されないバグがあるため、以下のように修正しています。
--- a/SDL_ttf.c Fri Jan 20 20:35:28 2012 -0500
+++ b/SDL_ttf.c Mon Jan 23 00:17:59 2012 +0900
@@ -1747,7 +1747,7 @@
/* Copy the character from the pixmap */
src = glyph->pixmap.buffer;
dst = (Uint8*) textbuf->pixels;
- for ( row = 0; row < glyph->bitmap.rows; ++row ) {
+ for ( row = 0; row < glyph->pixmap.rows; ++row ) {
memcpy( dst, src, glyph->pixmap.width );
src += glyph->pixmap.pitch;
dst += textbuf->pitch;
- Build Settings の Header Search Paths に以下のパスを追加しています。
$(SRCROOT)/../../Release-iphoneos/include
$(SRCROOT)/../../Release-iphoneos/include/freetype2
その他のライブラリ