読者です 読者をやめる 読者になる 読者になる

memo

ゲーム制作やデザインについての個人的メモ

2016年総括

……をしようと思ったのですが、全体的にぐだぐだで思い出してもつらいだけなのでやめました。すぐ過去をなかったことにするタイプです。たくさん色んなことを覚えたとは思うので、来年はそれを形にできたら良いですね。がんばれ来年の自分。

最近は人様のゲームのスクリプトとかやってます。あと絵の仕事もちょこちょこやってます。去年の暮れからフリーランス(という名の自宅警備員)になったのですが、まだまだ人並の生活をするには遠い感じです。まあ会社勤めのときも人並の生活なんてしてなかったので、好きなことやれてる分今の方が楽しいし幸せです。

スクリプト(今は吉里吉里とティラノスクリプトをやってます)とイラスト関係(ゲームに限らずなんでも、UIデザインとか印刷物のデザインもやってます)のご依頼は年中無休で受け付けてますのでお気軽にご相談ください。はい、宣伝です。一応生活かかってるのでお代はいただきまっせ。個人様向けにはお安くしときまっせ。

来年の目標はなるべくハロプロの現場に行くお金と時間をつくることです。芋かわいい静岡県出身の帰国子女、モーニング娘。'17の野中美希(ニックネーム:ちぇる)をよろしくね!

そんなこんなで今年もお世話になりました。来年もよろしくどうぞー。

【ティラノスクリプト】タイプライター風に文字を表示するマクロ

ティラノスクリプト

DEMO(タイプライター風テストを選択/※効果音が鳴るので注意)

効果音素材配布元:On-Jin ~音人~http://on-jin.com/)様

自分が欲しいのでつくってみたシリーズ。正確にはタイプライターのように一文字ずつ音を出すためのマクロですね。

①気軽にやる

短い単語にしか使わないとか、一か所しか使わないということであれば、単純に一文字ごとに効果音を入れればそれっぽくなります。かなり力技ですが難しいことはなにもありません。

[macro name="key"]
[playse storage="key.ogg"]
[wait time="200"]
[endmacro]

タ[key]イ[key]プ[key]ラ[key]イ[key]タ[key]ー[key]風[key]に[key]文[key]字[key]を[key]表[key]示[key]す[key]る[key]よ[key]。[key]

②ちょっと工夫する

前述の方法だと一文字ごとにマクロを入れなきゃいけないし、細かい指定もできないし、おまけにバックログを見ると一文字ごとに改行されてるしであまり使い勝手が良くありません。

そこでちょっと工夫してマクロをつくってみました。

[macro name="key_type"]

[glyph fix=true top=-100]

*loop
[eval exp="mp.text_count = 0" cond="mp.text_count == null"]

[eval exp="moji = mp.text[mp.text_count]"]

[if exp="moji == '、' || moji == '。' || moji == '!' || moji == '?'"]
[eval exp="mp.volume = 100"]
[else]
[eval exp="mp.volume = Math.floor(Math.random() * 21 + 30)"]
[endif]
[playse storage="key.ogg" volume="&mp.volume"]

[glyph cond="mp.text_count == mp.text.length - 1"]
[emb exp="moji"]

[iscript]
tf.system.backlog.pop();
[endscript]

[if exp="moji == '。' || moji == '!' || moji == '?'"]
[eval exp="mp.wait = 800"]
[elsif exp="moji == '、'"]
[eval exp="mp.wait = 600"]
[else]
[eval exp="mp.wait = Math.floor(Math.random() * 201 + 200)"]
[endif]
[wait time="&mp.wait"]

[eval exp="mp.text_count = mp.text_count + 1"]
[jump target=*loop cond="mp.text_count < mp.text.length"]

[iscript]
TG.pushBackLog(mp.text);
[endscript]

[endmacro]

[key_type text="タイプライター風に文字を表示するよ。"]

わかりにくい感じになってしまったので上からひとつずつ解説していきます。

[glyph fix=true top=-100]

そのままだとクリック待ち画像が一文字ごとに表示されてしまうので、最後の文字まではクリック待ち画像が見えないように画面の外へ放り出してます。-100の数値は見えない位置ならなんでもいいです。

*loop

処理をループさせるためのラベルです。(ところでマクロ内でラベルって使ってもいいんですかね…?あまり見かけないので不安になってきました…。callでサブルーチン呼び出した方がいい?)

[eval exp="mp.text_count = 0" cond="mp.text_count == null"]

一番最初だけmp.text_countというローカル変数に0を代入しています。この数字が文字列の配列と対応しています。(mp.text_countが0ならmp.text[0]の文字を表示する)

[eval exp="moji = mp.text[mp.text_count]"]

mp.text[mp.text_count]は現在表示される文字です。なんだかごちゃっとしてるので見やすいようmojiという変数に代入して使います。

[if exp="moji == '、' || moji == '。' || moji == '!' || moji == '?'"]
[eval exp="mp.volume = 100"]
[else]
[eval exp="mp.volume = Math.floor(Math.random() * 21 + 30)"]
[endif]
[playse storage="key.ogg" volume="&mp.volume"]

ここで効果音を鳴らしています。句読点と!と?の部分は音量を100に、その他の部分は音量を30~50の間でランダムに設定しています。音量に差をつけるとリアルさとリズム感が出ていいかな~と思ったのですが、ここは好みの問題ですね。単純に[playse]だけでもいいと思います。

[glyph cond="mp.text_count == mp.text.length - 1"]
[emb exp="moji"]

ここで実際に文字を表示させています。[glyph]は最後の文字を表示するときだけクリック待ち画像をデフォルト設定に戻す(見えるようにする)ために記述しています。最後までクリック待ち画像を表示させない場合は[glyph]をまるっと削除して、別の場所(通常の文章に戻る場所)で[glyph]を置いておけばOKです。

[iscript]
tf.system.backlog.pop();
[endscript]

このまま文字を表示していくとバックログで表示したときに一文字ずつ改行されてしまうので、一度文字をバックログから削除しています。後で文章ごとまとめて収納します。

[if exp="moji == '。' || moji == '!' || moji == '?'"]
[eval exp="mp.wait = 800"]
[elsif exp="moji == '、'"]
[eval exp="mp.wait = 600"]
[else]
[eval exp="mp.wait = Math.floor(Math.random() * 201 + 200)"]
[endif]
[wait time="&mp.wait"]

次の文字を表示するまでの待ち時間です。文字が句点と!と?の場合は800、読点の場合は600、その他の場合は200~400の間でランダムに設定しています。こちらも効果音の音量と同じくメリハリをつけるため多少大げさに差をつけていますが、お好みで変更してください。[wait]のみでもいいと思います。

[eval exp="mp.text_count = mp.text_count + 1"]

次の文字を表示させるためにmp.text_countに1を足しています。

[jump target=*loop cond="mp.text_count < mp.text.length"]

mp.text_countが文章の文字数と同じになるまで*loopにジャンプして処理をループさせています。

[iscript]
TG.pushBackLog(mp.text);
[endscript]

最後に文章をまとめてバックログに収納しています。

で、実際にマクロを使用するときは

[key_type text="タイプライター風に文字を表示するよ。"]

これだけでいいので楽ですね。

うーん、改めてみるとちょっと詰め込み過ぎた感がありますね…。適宜削ってご利用ください。なんか間違ってたら優しく教えていただけるととってもありがたいです。このマクロを使えばレトロゲーム風に一文字ずつ音も出せるけど、常時使うには処理の重さとか気になるところもあるので、やっぱりアクセント的に時々使う感じが良いと思います。

実は私、今までmpのことをよくわかってなかったのですが、調べたりしてるうちにちょっとだけ仲良くなれました。すごいぜmp。何気に万能だぜmp。

【ティラノスクリプト】メニュー画面を表示している間はキーボード操作を無効にする

ティラノスクリプト

メニュー画面(セーブ、ロード、バックログ含む)を表示しているときにEnterキーやSpaceキーを押すとテキストが進んでしまう(イベントが進行してしまう)のをなんとかしたくてこんな感じになりました。

※例によって本体部分に追加してるので自己責任です

kag.key_mouse.js

$(document).keyup(function(e) {
if ($('.layer_menu').css('display') == 'block') return false;
switch (e.keyCode) {
case 13:
case 32:
if (that.kag.key_mouse.canClick()) $(".layer_event_click").click();
break;
case 27:
that.kag.key_mouse.hideMessage();
break
}
});

赤字が追加部分です。

メニュー画面を表示しているときはlayer_menuというクラスのdisplayプロパティがblockになるので、それを利用してfalseを返してみました。

参考:jQueryで要素の表示・非表示を判定する方法: 小粋空間

一応狙い通りの動きにはなったのですが、なんだかスマートじゃないというか本当にこれでいいのかしら……と不安になったので、こっちの方がいいんじゃない?という情報がございましたら是非共有をお願いします。ムズカシー!

Meryのティラノスクリプト用入力補助ファイル

ティラノスクリプト Mery

7yen.hateblo.jp

以前の記事で紹介した入力補助ファイルですが、パラメータ補完バージョンもつくってみたので置いておきます。

ダウンロード(※Dropbox

詳しい使い方は上の記事をご覧ください。

f:id:onigirimgmg:20161121170646p:plain

f:id:onigirimgmg:20161121170658p:plain

パラメータはリファレンスに載っている分全部書いてるのでとても盛沢山な感じです。よく使うタグは各自で使いやすいように編集してください。

【ティラノスクリプト】オート時の待ち時間を文字数から計算して設定するマクロ

ティラノスクリプト

DEMO(オートモードテストを選択)

自分が欲しいのでつくってみたシリーズ。

オートモード実施時に、短い文章のときは待ち時間を少なく、長い文章のときは待ち時間を多くするマクロです。通常は一律で設定されている待ち時間ですが、これを使うことによって文章ごとに異なる待ち時間を設定することができます。

[macro name="p2"]
[iscript]
text = this.kag.stat.current_message_str.length; //文字数
text_wait = 70; //1文字ごとの待ち時間(ミリ秒)
wait_time = 1000; //最小時間(ミリ秒)

auto_wait = (text * text_wait) + wait_time; //【(文字数×1文字ごとの待ち時間)+ 最小時間 】

this.kag.config.autoSpeed = auto_wait;
sf._system_config_auto_speed = auto_wait;
[endscript]
[p]
[iscript]
this.kag.config.autoSpeed = 1300;
sf._system_config_auto_speed = 1300;
[endscript]
[endmacro]

[p]の代わりに[p2]を使うことでオート時の待ち時間の設定が変更されます。初期数値のままなら10文字表示したときの待ち時間は1700ミリ秒(1.7秒)になります。

【ちょっと解説】

text = this.kag.stat.current_message_str.length;

lengthは文字の長さを取得するプロパティです。この場合例えば表示されているテキストが「いろはにほへと」ならtextに7を代入していることになります。

text_wait = 70;
wait_time = 1000;

ここは単に数字を代入しているだけです。数値を変えると待ち時間が変わります。wait_timeは1文字だけ表示したときの待ち時間、と考えるといいと思います。

auto_wait = (text * text_wait) + wait_time;

ここで実際の待ち時間を計算してauto_waitに代入しています。

this.kag.config.autoSpeed = auto_wait;
sf._system_config_auto_speed = auto_wait;

auto_waitに代入した数値をティラノスクリプトの設定に反映させています。

[iscript]
this.kag.config.autoSpeed = 1300;
sf._system_config_auto_speed = 1300;
[endscript]

変更した待ち時間をデフォルトに戻しています。他に[p]や[l]を使う場合はここで戻しておかないと待ち時間が最後に設定された数値になってしまいます。

最終的には全部プレイヤー側で設定できるようにしたいです。目標はシステム面が異常に充実してることで有名な(?)某エロゲ会社のゲームシステムです。