ジェリーゼリーブログ

2019年11月14日

ティラノスクリプト作品をCordovaでAndroidアプリ化した時のメモ

 ティラノスクリプトで作ったゲームをAndroid StudioではなくCordovaでAndroidアプリ化した体験記です。ぶっちゃけめちゃくちゃ面倒です。特に音声ファイルを再生するあたりが。ただ、私の場合はティラノプレイヤーを使っても、なぜかAndroid Studioでうまくビルドできなかったので、Javaも分からないし、こうなったら使い慣れたCordovaで作ったるわ!となってこうなりました。雑に書いたのでめちゃくちゃ分かりにくいですが、いつか誰かが(もしくは未来の自分が)ティラノスクリプト作品をCordovaでAndroidアプリ化する際の参考にでもなったらいいなーと思って、トラブルとその試行錯誤の結果をメモしておきます。

目次



Gradleのパスが通らなくてビルドできなくなった

 まずAndroid Studioを更新しまくったらGradleのパスが通らなくなって、Cordovaでもビルドができなくなりました。で、Android Studioの「Settings」→「Build,Execution,Deployment」→「Gradle」をクリックしてみると「Service directory path: C:/Users/ユーザー名/.gradle」と書いてあります。

 そこで、システム変数「GRADLE_HOME」の変数値を「C:\Users\ユーザー名\.gradle\wrapper\dists\gradle-5.4.1-all\322.....\gradle-5.4.1」に変更!

 さらに、システム変数「Path」の編集で「C:\Users\ユーザー名\.gradle\wrapper\dists\gradle-5.4.1-all\322.....\gradle-5.4.1\bin」というパスを追加!

 これでCordovaのビルドが通るようになりました!
 コマンドプロンプトで「gradle -version」を実行するとバージョンも表示されるし、きちんとGradleのパスが通っていることが確認できます。


Cordovaプロジェクトを作る

 技術雑記さんの【Cordova入門】Androidアプリ開発編という記事を参考に、いつも通りCordovaプロジェクトを作りました。

 で、「wwwフォルダ」の中にティラノスクリプトの「dataフォルダ」「tyranoフォルダ」「index.html」の3つを放り込んで、普通にビルドしたら実機でも動くようになりました。

 ちなみに、ティラノスクリプトのプロジェクトは特にブラウザ用に書き出さずにそのままコピーしています。また、[playbgm]などの音声ファイル関係のタグを使っているとビルドはできても実機で動きませんでした。


Cordovaで横画面に固定する

 Cordovaプロジェクトのフォルダにある「config.xml」に以下のpreferenceタグを追加しました。

<name>アプリ名</name>
<preference name="Orientation" value="landscape" />
<description>以下略

 で、このままだと機種によっては実機で画面がはみ出ました。
 そこで「wwwフォルダ」に入れたティラノスクリプトの「index.html」のviewportタグを少し変えたら、とりあえずなんとか普通に表示されるようになりました。

<meta name="viewport" content="width=device-width, user-scalable=no" />


テキストボックスに入力できるようにする

 スマホの機種によってはテキストボックスをタップしても入力できなかったので、ティラノスクリプトのシナリオファイルに少し追加しました。

[edit width=200 size=25 left=540 top=200 name="sf.namae"]
[button graphic="input.png" target="*input" x=540 y=280]

[iscript]
var nameText = document.getElementsByTagName("input");
nameText[0].addEventListener("touchend",function(e){
nameText[0].value = prompt("あなた(主人公)の名前を入力してください");
});
[endscript]

 テキストボックスをクリックするとダイアログが表示されて入力が促される形になります。ごり押しですね。


音を出す

 CordovaではMediaプラグインをインストールしないと音を出せません。

 というわけでコマンドプロンプトで、Cordovaのプロジェクトフォルダに移動して、以下のコマンドを実行してMediaプラグインをインストールします。

cordova plugin add cordova-plugin-media

 それから「wwwフォルダ」に入れたティラノスクリプトの「index.html」にcordova.jsと、後で自分で用意するbgm_se.jsを読み込むタグを追加しておきます。

<head>
中略

<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="bgm_se.js"></script>
</head>

 で、音を再生するための「bgm_se.js」を作って「index.html」と同じ階層に置いておきます。ちなみに「bgm_se.js」の中身はこんな感じです。

function getPath(){
var str = location.pathname;
var i = str.lastIndexOf("/");
return str.substring(0, i+1);
}

function mediaError(e){
}

function onSuccess(){
}

function mediaStatusBGM(e){
if(e == 4){
CORDOVA_BGM.play();
CORDOVA_BGM.setVolume(TYRANO.kag.variable.sf.bgm);
}
}

CORDOVA_BGM_SE = "NO";
CORDOVA_BGM = null;
CORDOVA_SE = null;

window.onload = function(){
document.addEventListener("deviceready", function(){
try{
CORDOVA_BGM_SE = "OK";
}catch(e){
window.alert("media:" + e);
}
});
};

bgm_se.jsの内容メモ

 getPath、mediaError、onSuccess、mediaStatusBGM はCordovaのMediaを使うための関数です。最後のmediaStatusBGMは、BGMをリピート再生するための関数です。音声ファイルが停止されたら再度再生を開始するという内容です。

 CORDOVA_BGM_SEという変数は、「もうCordovaでMediaプラグインを使える状態になっているかどうか」を判定するための変数です。devicereadyのイベントが発火したらこの変数に「OK」と代入されます。

 CORDOVA_BGMとCORDOVA_SEは、それぞれBGMとSEの音声ファイルを…こう…代入?しておく的な?変数です。ここでグローバル変数として定義しておきます。

 ちなみに私も全然詳しくないので、再生・停止といった最低限の機能のみしか使えません。BGMは繰り返し再生のみ、SEは1回再生のみです。フェードアウト・フェードインも使えません。

 playbgm等の標準タグで音を出そうとすると動作が停止してしますので、別途音声ファイルを再生するタグを追加するために、ティラノスクリプト用のプラグインを作ります。

 「www\data\others\plugin」の中に「cordova_bgm_se」というフォルダを作成して、その中に「cordova_bgm_se.js」という名前のファイルを作っておきます。「cordova_bgm_se.js」の中身はこんな感じです。

(function(){
var bgmStart = {
vital : ["storage"],
pm : {
"storage" : "",
"loop" : "true",
"volume" : ""
},
start : function(pm) {
if(CORDOVA_BGM_SE == "OK"){
if(pm.volume == ""){
pm.volume = TYRANO.kag.variable.sf.bgm;
}
if(CORDOVA_BGM != null){
CORDOVA_BGM.release();
CORDOVA_BGM = null;
}
CORDOVA_BGM = new Media(getPath()+"data/bgm/"+pm.storage, onSuccess, mediaError, mediaStatusBGM);
CORDOVA_BGM.play();
CORDOVA_BGM.setVolume(pm.volume);
}
this.kag.ftag.nextOrder();
}
};

var bgmStop = {
vital : [],
pm : {
"time" : ""
},
start : function(pm) {
if(CORDOVA_BGM_SE == "OK"){
CORDOVA_BGM.stop();
CORDOVA_BGM.release();
CORDOVA_BGM = null;
}
this.kag.ftag.nextOrder();
}
};

var seStart = {
vital : ["storage"],
pm : {
"storage" : "",
"loop" : "true",
"volume" : "",
"buf" : ""
},
start : function(pm) {
if(CORDOVA_BGM_SE == "OK"){
if(pm.volume == ""){
pm.volume = TYRANO.kag.variable.sf.se;
}
if(CORDOVA_SE != null){
CORDOVA_SE.stop();
CORDOVA_SE.release();
CORDOVA_SE = null;
}
CORDOVA_SE = new Media(getPath()+"data/sound/"+pm.storage, onSuccess, mediaError);
CORDOVA_SE.play();
CORDOVA_SE.setVolume(pm.volume);
}
this.kag.ftag.nextOrder();
}
};

var seStop = {
vital : [],
pm : {
"time" : ""
},
start : function(pm) {
if(CORDOVA_BGM_SE == "OK"){
CORDOVA_SE.stop();
CORDOVA_SE.release();
CORDOVA_SE = null;
}
this.kag.ftag.nextOrder();
}
};

// タグとして割り当て
TYRANO.kag.ftag.master_tag.bgmStart = object(bgmStart);
TYRANO.kag.ftag.master_tag.bgmStart.kag = TYRANO.kag;

TYRANO.kag.ftag.master_tag.bgmStop = object(bgmStop);
TYRANO.kag.ftag.master_tag.bgmStop.kag = TYRANO.kag;

TYRANO.kag.ftag.master_tag.seStart = object(seStart);
TYRANO.kag.ftag.master_tag.seStart.kag = TYRANO.kag;

TYRANO.kag.ftag.master_tag.seStop = object(seStop);
TYRANO.kag.ftag.master_tag.seStop.kag = TYRANO.kag;
})();

cordova_bgm_se.jsの内容メモ

 音声ファイルを再生するためのタグを定義し、最後にタグとして割り当てています。

 bgmStartはBGM再生用のタグです。bgm_se.jsの方で定義したCORDOVA_BGM_SEという変数の中身がOKの時のみ、機能します。(つまり、devicereadyが発火した後のみ機能します。)で、同じくbgm_se.jsで定義したCORDOVA_BGMという変数に新しいMediaを設定し、CORDOVA_BGM.play();で再生開始し、CORDOVA_BGM.setVolume(pm.volume);でボリュームを変更します。再生→ボリューム変更の順序じゃないとボリュームが適用されないので注意です。ちなみに、ティラノスクリプトのsf.bgmという変数をボリューム設定に利用しています。このsf.bgmというのは私が適当に作ったシステム変数です。0.0~1.0の値でボリュームを設定します。

 bgmStopはBGM停止用のタグです。こちらもCORDOVA_BGM_SEという変数の中身がOKの時のみ、機能します。まずCORDOVA_BGM.stop()で再生を停止し、CORDOVA_BGM.release()でリソースを解放しておきます。このCORDOVA_BGM.release()がないと、実機で動かしていると途中で動作が止まってしまうので注意です。最後にCORDOVA_BGM=null;で変数を空っぽにしておきます。

 seStartはCORDOVA_BGMがCORDOVA_SEになっていること以外、bgmStartとほとんど一緒ですが、CORDOVA_SEという変数に新しいMediaを設定するとき、mediaStatusBGMという関数の記載を省きます。mediaStatusBGMはBGMをリピート再生するための関数なので、1回しか再生しないSEでは不要ということです。あとボリューム設定はsf.bgmではなくsf.seで行います。これも私が適当に作ったシステム変数です。0.0~1.0の値でボリューム設定します。

 同じ階層に「init.ks」というファイルも作成します。「init.ks」の中身はこんな感じです。

@loadjs storage="plugin/cordova_bgm_se/cordova_bgm_se.js"
@return

 で、「www\data\scenario」の中にある「first.ks」あたりで今作ったプラグインを読み込んでおきます。以下のタグを追加します。

[plugin name="cordova_bgm_se"]

 これで[bgmStart][bgmStop][seStart][seStop]の4つのタグが追加されました。あとは標準タグのplaybgmやplayseタグの代わりに、今回プラグインで作った[bgmStart]や[seStart]タグを使えばOKです。なお、上記の記述ではloopパラメータやbufパラメータは形だけなので使えません。何を設定したところでBGMは無限ループ再生、SEは1回再生になります。もっとしっかり作ればその辺もなんとかなるとは思いますが、今回私は必要なかったので割愛しました。

 あ、音量の設定は0.0~1.0の値で行います。私はsf.bgm、sf.seというシステム変数を自分で用意して、それを使って音量設定することにしました。オプションで音量を変更するときも、sf.bgmやsf.seの値を変更するようにしています。

 ちなみに音声ファイルはOGGファイルを使用しました。軽いので。


対応するOSのバージョンを設定する

 今回AndroidのOSがVer4.4以上の機種のみで動作確認したので、対応するOSは4.4以上に設定しようと思います。

 Cordovaプロジェクトのフォルダにある「config.xml」の<platform name="android">のあたりにタグを追加します。

<platform name="android">
<preference value="19" name="android-minSdkVersion"/>
<allow-intent href="market:*"/>
</platform>


後は普通にビルドしてGooglePlayに申請する

 技術雑記さんの【Cordova入門】Androidアプリ開発編という記事を参考に、いつも通りビルドしました。

 しかしGooglePlayにアップロードしたら署名ファイルの有効日数が短すぎるとのことなので、署名ファイルの作成は以下のコマンドに変更しました。(testの所は適宜、実際のプロジェクトごとの名前に変更します)

keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -keysize 2048 -validity 50000

 validityのところを10000から50000に変えています。これで申請したらアップロードすることができました。後は審査が終わるまで待ち、今回は申請から4日後くらいに無事公開開始されました。

 

 以上、Cordovaでティラノスクリプト作品をAndroidアプリ化してGooglePlayに登録し公開開始するまでの体験記でした。なんか改めて見るといろいろ面倒ですね。特に音声ファイル周りがやっかいです。それでもなぜCordovaを使ったかというと、Javaがさっぱり分からないからです。Android Studioを使うなら、ある程度Javaの知識が要るな~めんどくさいな~と思って、JavaScriptだけで大体なんとかなるCordovaを使うことにしました。Javaが分かる方は普通にAndroid Studioを使えばいいのだと思います。ティラノプレイヤーっていう公式のフレームワークも使えますしね。

★今回の私の環境
・Windows 10 Home(RAM:8GB)
・ティラノスクリプト for Windowsアプリケーション Ver472
・Cordova ver 9.0.0
・Node.js ver 10.13.0
・npm ver 6.4.1
・Android Studio ver 3.5.1


カテゴリ:製作者向け情報/ティラノスクリプト関係/Androidアプリ関係