はじめに

iPhone や iPad など iOS 上で動作するノベルゲームエンジン ONScripter on iOS を使ったアプリの作成方法について説明します。

App Store で公開可能(要審査)な有償・無償のノベルゲームアプリを作成することができます。ゲームデータはアプリに内蔵できますが、アプリのインストール後に別途ダウンロードすることもできます(配布用Webサーバを別途用意)。

ここで説明する方法は Mac OS X El Capitan 以降で Xcode 8.0 (統合開発環境)以降を使っていることを想定しています。iPad Air2 (iOS 10.0.2) の実機、および Xcode 8.0 のシミュレータ(iPhone 6, iPhone 7 Plus)で正常に動作することを確認しています。

使用にあたって私に連絡する必要はありません。また、使用者に対して私から何か要求することもありません。自由に使ってください。

使用作品例

NOeSIS02 -羽化-
NOeSIS02 NOeSIS02
NOeSIS -嘘を吐いた記憶の物語-
NOeSIS01 NOeSIS01

アプリの開発方法

開発の流れ

  1. 製作
    NScripter (2011/12/15)(解説)を使用して Windows PC でゲームを製作します。ONScripter Launcher and Binary for Mac OS X を使って MacOSX 上で製作することも可能です(この場合 Windows PC は必要ありません)。以下の入門講座が参考になると思います。
  2. アプリの作成
    開発環境の構築アプリの作成を参考にして Xcode でアプリを作成します。実機で動作確認をする場合は、iPhone/iPad を USB で Mac に接続します。
  3. ゲームデータの動作確認(ゲームデータを内蔵する場合)
    ゲームデータが完成したら、ゲームデータの内蔵方法を参考にしてゲームデータを Xcode のリソースにドラッグし、HAVE_CONTENTS を定義してアプリを作成します。アプリを実行すると、初回にリソースから Library/Caches/ONS フォルダにゲームデータをコピーし、その後にゲームを開始します。
    ゲームデータを修正する場合は、修正後に i-FunBox などを使用して、iPhone/iPad 実機の Library/Caches/ONS フォルダにある MAGIC_FILE を削除してから、再度アプリを実行してください。
    i-FunBox が使えない場合は、Xcode の Windows → Devices から Installed Apps の ONScripter を選択し、Download Container でアプリのファイル一式を Mac 側にコピーし、Finder で中身を編集してから、Replace Container で端末に書き戻しても構いません。
  4. ダウンロードの動作確認(ゲームデータを初回にダウンロードする場合)
    ゲームデータが完成したら、zip ファイルに圧縮して自身で用意した WEB サーバ上に置きます。次に、その場所を ZIP_URL に設定してアプリを作成します。アプリを実行すると、ZIP_URL で指定した場所から zip をダウンロードし、ゲームデータを Library/Caches/ONS フォルダに展開してから実行します。正しくダウンロードしてゲームが開始されることを確認します。
  5. 公開 App Store でアプリを公開します。(要審査)

開発環境の構築

アプリを実機で動作確認するための準備やアプリの公開手順については、このページでは扱いません。以下のサイトなどを参考にしてください。

コマンドラインツールの導入

Xcode 4.3 以降ではビルドに必要なツールが入っていないため、以下の手順に従ってインストールします。

  1. Command Line Tools のインストール
    • Xcode 5.1.1 以降では、Xcode を起動し、メニューバーの「Xcode」→「Open Developer Tool」→「More Developer Tools」を選択してください。そうすると、Downloads for Apple Developers web site に接続するので、サインインして、お使いの Mac OS X 用の Command Line Tools をダウンロードしてインストールしてください。
    • うまく行かない場合は、ターミナルから以下のコマンドを実行し、現れたダイアログでインストールを選択してもインストールできます。
      > xcode-select --install
      

      注意:先頭の > はプロンプトなので入力しません。

    • Xcode 5.1.1 未満では、Xcode を起動し、メニューバーの「Xcode」→「Preferences」→「Downloads」の Components のうち Command line Tools の横の「Install」ボタンを押してインストールしてください。
  2. Mac Ports の「Installing MacPorts」の中の OS X 10.11 El Capitan をクリックし、MacPorts のインストーラをダウンロードしてインストールします。次に、ターミナルから以下のコマンドを入力してビルドに必要なツールをインストールします。関連ツールもインストールするため、終了するまで時間がかかります。
    > sudo port install automake
    > sudo port install autoconf
    > sudo port install libtool
    > sudo port install pkgconfig
    

    注意:先頭の > はプロンプトなので入力しません。

SDK の導入

リリース日SDK
20161016 onscripter_ios_Xcode8.0.tar.gz 最新版
  Xcode 8.0 + iOS 8.0-10.0 用
20160925 onscripter_ios_Xcode7.3.1_Lua_SMPEG.tar.gz
  Xcode 7.3.1 + iOS 9.3 用(Lua+SMPEG対応版)
20160728 onscripter_ios_Xcode7.3.1.tar.gz
  Xcode 7.3.1 + iOS 9.3 用
20150112 onscripter_ios_Xcode6.1.1.tar.gz
  Xcode 6.1.1 + iOS 8.1 用
20140505 onscripter_ios_Xcode5.1.1.tar.gz
  Xcode 5.1.1 + iOS 7.1 用
20131103 onscripter_ios_Xcode5.0.tar.gz
  Xcode 5.0 + iOS 7.0 用
20130812 onscripter_ios_Xcode4.6_movie.tar.gz
  Xcode 4.6 + iOS 6.1 用 (動画再生対応版)
20130204 onscripter_ios_Xcode4.6.tar.gz
  Xcode 4.6 + iOS 6.1 用
20121117 onscripter_ios_Xcode4.5.2.tar.gz
  Xcode 4.5.2 + iOS 6.0 用
20120316 onscripter_ios_Xcode4.2.tar.gz
  Xcode 4.2 + iOS 5.0 用
  1. ファインダーを起動し、メニューバーから「移動」→「ホーム」を選択してホームディレクトリに移動します。次に、src という名前のフォルダを作成し、上の全部入りソースパッケージ(onscripter_ios_Xcode*.tar.gz)を src フォルダの中に展開します。
  2. 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 に進んでください。

    これによって、以下のライブラリが実機用とシミュレータ用にそれぞれ作成されます。

SDL

  1. 以下のプロジェクトファイルをダブルクリックして Xcode で開きます。
    onscripter_ios/SDL/Xcode-iOS/SDL/SDL.xcodeproj
    
  2. メニューバーの「File」->「Project Settings」の Build の Derived Data Location を Default から Project-relative に変更します。
  3. メニューバーの「Product」->「Scheme」->「Edit Scheme」の Run の Build Configuration を Debug から Release に変更します。
  4. Xcode ウィンドウの左上に表示される「libSDL」の右側が Generic iOS Device (端末が接続されている場合は端末名) となっていることを確認し、メニューバーの「Product」->「Build」を実行します。実機用のライブラリが作成されます。
  5. Xcode ウィンドウの左上に表示される「libSDL」の右側を Generic iOS Device (端末が接続されている場合は端末名) 以外(iPhone 6 など)に変更し、メニューバーの「Product」->「Build」を実行します。シミュレータ用のライブラリが作成されます。

onscripter_ios*.tar.gz での変更点

  • 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

  1. 以下のプロジェクトファイルをダブルクリックして Xcode で開きます。
    onscripter_ios/SDL_image/Xcode-iOS/SDL_image.xcodeproj
    
  2. メニューバーの「File」->「Project Settings」の Build の Derived Data Location を Default から Project-relative に変更します。
  3. メニューバーの「Product」->「Scheme」->「Edit Scheme」の Run の Build Configuration を Debug から Release に変更します。
  4. Xcode ウィンドウの左上に表示される「libSDL_image」の右側が Generic iOS Device (端末が接続されている場合は端末名) となっていることを確認し、メニューバーの「Product」->「Build」を実行します。実機用のライブラリが作成されます。
  5. Xcode ウィンドウの左上に表示される「libSDL_image」の右側を Generic iOS Device (端末が接続されている場合は端末名) 以外 (iPhone 6 など) に変更し、メニューバーの「Product」->「Build」を実行します。シミュレータ用のライブラリが作成されます。

onscripter_ios*.tar.gz での変更点

  • 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

  1. 以下のプロジェクトファイルをダブルクリックして Xcode で開きます。
    onscripter_ios/SDL_mixer/Xcode-iOS/SDL_mixer.xcodeproj
    
  2. メニューバーの「File」->「Project Settings」の Build の Derived Data Location を Default から Project-relative に変更します。
  3. メニューバーの「Product」->「Scheme」->「Edit Scheme」の Run の Build Configuration を Debug から Release に変更します。
  4. Xcode ウィンドウの左上に表示される「libSDL_mixer」の右側が Generic iOS Device (端末が接続されている場合は端末名) となっていることを確認し、メニューバーの「Product」->「Build」を実行します。実機用のライブラリが作成されます。
  5. Xcode ウィンドウの左上に表示される「libSDL_mixer」の右側を Generic iOS Device (端末が接続されている場合は端末名) 以外 (iPhone 6 など) に変更し、メニューバーの「Product」->「Build」を実行します。シミュレータ用のライブラリが作成されます。

onscripter_ios*.tar.gz での変更点

  • music_mad.c, music_mad.h の Target Membership にチェックを入れて使用されるようにしています。
  • Build Settings の Preprocessor Macros に以下の定数を追加しています。
    MP3_MAD_MUSIC
    
  • Build Settings の Header Search Paths に以下のパスを追加しています。
    $(SRCROOT)/../../Release-iphoneos/include
    

SDL_ttf

  1. 以下のプロジェクトファイルをダブルクリックして Xcode で開きます。
    onscripter_ios/SDL_ttf/Xcode-iOS/SDL_ttf.xcodeproj
    
  2. メニューバーの「File」->「Project Settings」の Build の Derived Data Location を Default から Project-relative に変更します。
  3. メニューバーの「Product」->「Scheme」->「Edit Scheme」の Run の Build Configuration を Debug から Release に変更します。
  4. Xcode ウィンドウの左上に表示される「libSDL_ttf」の右側が Generic iOS Device (端末が接続されている場合は端末名) となっていることを確認し、メニューバーの「Product」->「Build」を実行します。実機用のライブラリが作成されます。
  5. Xcode ウィンドウの左上に表示される「libSDL_ttf」の右側を Generic iOS Device (端末が接続されている場合は端末名) 以外 (iPhone 6 など) に変更し、メニューバーの「Product」->「Build」を実行します。シミュレータ用のライブラリが作成されます。

onscripter_ios*.tar.gz での変更点

  • 現時点(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
    

アプリの作成

以下のプロジェクトファイルをダブルクリックして Xcode で開きます。

onscripter_ios/ONScripter/ONScripter.xcodeproj

実機ではなくシミュレータ用に作成する場合は、Xcode ウィンドウの左上に表示される「ONScripter」の右側を Generic iOS Device (端末が接続されている場合は端末名) からそれ以外 (iPhone 6 など) に変更します。

最新の ONScripter の導入

ONScripter のページから最新の ONScripter のソース(onscripter-????????.tar.gz)をダウンロードして適当な場所に展開します。

Fig.1
図1:ONScripter のソースの導入

図1の1をクリックし、展開したソースの内全ての *.cpp, *.h ファイルをファインダーを使って Sources (図1の2)にドラッグします(ドラッグ前にファインダー側で「種類」を押してソートしておくと楽です)。そのときにダイアログが出ますが、Add to targets で ONScripter にチェックを入れてから「Finish」ボタンを押してください(これをしないとドラッグしたファイルがビルドされません)。さらに、ドラッグしたファイルの内、不必要な以下のファイルを Sources から(Delete キーで)削除します(図1は削除後の状態)。図1にはLUAHandler.hがありませんが、LUAHandler.hは削除せずに残してください。

AVIWrapper.h
AVIWrapper.cpp
conv_shared.cpp 
nsaconv.cpp
nsadec.cpp 
nscriptdecode.cpp
sarconv.cpp 
sardec.cpp
simple_aviplay.cpp

Sources の以下のファイルをクリックし、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 8.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
MP3_MAD
PDA_AUTOSIZE
USE_SDL_RENDERER
HAVE_CONTENTS
RENDER_FONT_OUTLINE
ZIP_URL=\"http://*.*/*/*.zip\"
MAGIC_FILE=\".20160728\"
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 デラックス版ExplzhWinZipなどの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 を定義すると、起動時にゲームを選択できるようになります。ゲームデータは、アプリをインストールした後に、i-FunBox などを使って端末のアプリの Library/Caches 直下に任意の名前のフォルダを作成してその中に置いてください。ただし、ゲームデータがあるフォルダが Library/Caches 直下に1つしかない場合は、無条件にそのフォルダにあるゲームが実行されます。また、Documents の下にも同じ名前のフォルダを作成してください。セーブデータはこちらに保存されます。

i-FunBox が使えない場合は、Xcode の Windows → Devices から 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 を指定した場合と同じになります。文字が見やすくなるのでおすすめです。

ゲームデータの内蔵方法

Fig.2
図2:ゲームデータの内蔵

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 8.0 で "Signing for "ONScripter" requires a development team. Select a development team in the Project Editor." というエラーが出る場合には、プロジェクトの設定の General の Signing 項で、Automatically manage signing のチェックを一度外してから再度チェックを入れ、続いてその直下の Team を設定してください。

アプリの申請

Xcode から App Store にアプリを登録するには以下のようにします。

  1. メニューバーの「Product」->「Archive」を実行して申請用にアプリを作成
  2. Xcode ウィンドウの右上に表示される Organizer ボタンをクリックし、Archives から Validatet ボタンを押してアプリをチェック
  3. 同様に 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 キー)

制限・注意事項

  • ディスプレイの解像度に合うようにゲーム画面の解像度が自動調整されます。色深度は 32bit です。
  • 電源ボタンもしくはホームボタンを押すと処理を中断して他のアプリを実行できるようになります。アイコンをタップするとゲームを再開します。
  • 動画ファイルの再生は MPEG1, H.264, MPEG4 フォーマットに対応しています。
  • 使用する音楽のサンプリング周波数は 22.05KHz か 44.1KHz のどちらかにしてください(混在可)。MP3, Ogg Vorbis, WAV をサポートしています。48 KHz などの音源は正常に再生されないので、えこでこツールなどを使って 44.1 KHz に変換してください。
  • 画像は BMP, JPEG, PNG, GIF をサポートしています。

Tips

  • SDL の最新のソース(開発版)を取得するには、Mercurial binary packages Mac OS X から Mercurial をダウンロードしてインストールした後で、ターミナル上で以下のようにします。
    > hg clone http://hg.libsdl.org/SDL SDL
    > hg clone http://hg.libsdl.org/SDL_image SDL_image
    > hg clone http://hg.libsdl.org/SDL_mixer SDL_mixer
    > hg clone http://hg.libsdl.org/SDL_ttf SDL_ttf
    
  • シミュレータ上で Retina display を試すには、iOS シミュレータが立ち上がった後に、iOS シミュレータのメニューの「ハードウェア」->「デバイス」から iPhone(Retina) を選択してください。