(ツクールMV)フキダシアイコンをスキップ可能にするプラグイン
「ウェイト処理」は辛抱ならん
ゲーム中のウェイト(何もしない何もさせない待ち時間)ってどう思います?
プレイヤーとしての私は、基本的に辛抱ならんのです。セリフ表示が流れていく中で「話しているリズム」を演出するために1秒に満たないウェイトがちょいちょい入ってるだけでもすんごいイライラするし、そもそもゲーム中のテキストが「1文字ずつ表示される」という仕組みにも疑問を感じます。自分が読むスピードより表示の方が遅いとそれだけで発狂ものです。あれはおそらく堀井雄二氏が始めたシステムで、当時は漢字が表示できなかったからあの速度でもやれるのですが(と、このへんの話はすごく長くなるので省略。機会があったらまたいずれ…)
「フキダシアイコン」も時間がかかりすぎでは?
で、今回の本題。
他の部分はまあいいのです。「ウェイト」というイベントコマンドや \.
(1/4秒待つ) \|
(1秒待つ) といった制御文字はそもそも作者として入れなければいいし、文字の表示速度に関しては偉大な先人達が作られた優れたプラグインがありますし。
問題はフキダシアイコンです。
これ自体は、文章なしで登場キャラクターのおおまかな感情を知ることができ、作者も省力できるし、ユーザーもキャラクターの仕草まで想像できて楽しく遊べるスグレモノだと思います。
ただね、このフキダシがぴょこぴょこしてる間、1秒くらい待たされるんですよ。もうそのシーンが表現していることはわかってるのに、その余分な1秒があればどれだけ文章が読めるんだっていうこの感じ、わかりますかね…? わからないかもしれません。すみません。
というわけでスキップするプラグインを探しましたが……
きっと、この鬱陶しいフキダシアイコンをスキップしてくれるプラグインを誰かが既に作っているに違いない。そう思って探しました。
フキダシアイコンを表示するだけは表示して、キー入力があったらスキップする。ただそれだけでいいのですがなかなか見当たらない。
見当たらないので、自分で書きました。
機能は以下の通りです。
- フキダシアイコンを表示している間、okキーあるいはctrlキーが押されたら(押されていたら)それを終了します。
- okキーが既に押しっぱなしだった場合は、フキダシアイコンが一瞬だけ見えます。
BalloonSkip.js (1.30kB)
ダウンロードMITライセンスで公開しますので自由に使ってください。
(以下は読まなくていいと思います)
ソースの解説など……
仕組みは驚くほど簡単です。せっかくなのでソースを具体的に解説してみましょう。
まずは、プログラムの学習でよく出てくるあれ。そう、おまじないです。意味わからなくてもこう書いときゃいいです。
(function () {
'use strict';
// ここにプラグインの内容を書く
})();
プラグインの内容としては、最初にこのプラグインの名前を書きます。このプラグインの名前はシンプルに BalloonSkip
に決めました。pluginNameという変数を作って文字列を入れれば自動的に「プラグイン管理」で表示される名前になります。型はvarというキーワードが勝手に決めてくれるので気にする必要はありません。
※訂正:
「プラグイン管理」で表示される名前はファイル名から取っているようです。pluginNameというのはここでは全く意味のない変数で、参考にしたプラグイン(具体的にはトリアコンタン様のソース)で、プラグインパラメータを取得する際にPluginManagerに渡すために変数を作っているようです。
なのでこの段落の解説は間違いです。失礼しました。
var pluginName = 'BalloonSkip';
次にプラグインの処理として、まず _update
という名前の変数を作り、そこに Sprite_Balloon.prototype.update
というフキダシアイコンを監視して書き換える(=アニメーションを実現したり、終了のタイミングで消したりする)関数をそっくりそのまま代入します。なんか変数と呼ぶのはおかしい感じが若干しますが、そういうものみたいです。
var _update = Sprite_Balloon.prototype.update;
それから Sprite_Balloon.prototype.update
をまっさらな状態に再定義。
Sprite_Balloon.prototype.update = function() {
// ここにやりたい処理を書く
}
やりたい処理というのは以下の通りです。
- okキーが押された、つまり
input.isTriggered('ok')
が true あるいは - ctrlキーが押しっぱなしである、つまり
input.isPressed('control')
が true
のとき、フキダシアイコンの残り表示期間(おそらくフレーム数)を表し、この値がゼロ以下になるとフキダシアイコンが終了となる変数 this._duration
にゼロを代入します。この this
は Sprite_Balloon.prototype.update
を指す、そのまんま代名詞のような役割をするキーワードです。
if(Input.isTriggered('ok') || Input.isPressed('control')){
this._duration = 0;
}
それから、
- okキーが押しっぱなしである、つまり
input.isPressed('ok')
が true
のときは、this._duration
を 5 だけ減らします。this._duration
は放っておいてもフレームごとにデクリメント(1だけ減らす)されるので、つまり終了までの期間が大幅に短くなるということです。これにより即時終了するのではなく、ある程度の時間(と言っても一瞬ですが)をかけて終了させることになります。
if(Input.isPressed('ok')){
this._duration -= 5;
}
最後に、元々の Sprite_Balloon.prototype.update
に入っていたオブジェクトの機能をぜんぶくっつけます。これは最初に _update
という名前の変数に入れましたよね。
_update.apply(this);
apply(this)
の概念はなかなか面白いのですが説明すると長くなるので割愛します。興味のある方は適当にぐぐって調べてください。
以上がこのプラグインの内容です。ご清聴ありがとうございました。
この処理は間違ってる、この変数は触るべきではない、この関数の返り値は保証されていない、みたいなご意見があったらコメントで教えてください。偉そうな解説ぶっこいてるけど何せJavaScriptに関してはほぼ素人、一夜漬けでコアスクリプトを読みながら文法を推理し、有名なプラグイン大家の書いたソースを参考にして作った、というものです。実装にはいくつかの方法があるように見えましたが、ちゃんと正解を選択している自信はありません。特に「5減らす」のあたり超てきとーだし。理由はよくわかんないけど5減らしたらちょうどいい感じになっただけなので。
プログラムは楽しいよ!
ところで、RPGツクールMVのプラグインの仕組みってGUIでいじれるパラメータとかプラグインコマンドとかあって便利だけど、それに頼ってるとプログラムそのものや、プラグイン制作の楽しさに触れることができずちょっともったいない気がするのですがいかがでしょうか。
例えばこのプラグインの ok
という部分を tab
に変えると、okキーではなくtabキーでフキダシアイコンが終了します。 isTriggered
を isReleased
に変えると、押した瞬間ではなく離した瞬間が検知されます。こういうのを試してみて、
「おっ、ほんとだ。ふふっ」
ってなる方はプログラムを楽しむ素地があると思います。プログラム快楽回路(今作った言葉)はこういう、ソースのちょっとした改造から育まれるとマイコンBASICマガジンで育った私なんかは思うわけです。
ぜひ一緒に、コアスクリプトを読むだけで性的絶頂を覚えるような体質を目指しましょう! この方みたいにね。