ツクールで使える計算式について
はいどーもこんにちは、本日はコマンドバトル(仮)からちょっと離れて、RPGツクールMVの話題に行ってみたいと思いますよ。
本日はこんな感じ。
- 計算式とは
- 三項演算子
- 短絡評価
- おまけ
なお、この記事は完全に制作者サイドに向けたものです。
計算式とは
ここで言う計算式とは、戦闘等で使うスキルの計算式のことです。
詳しくはRPGツクールに付属しているヘルプを見ていただきたいのですが、例えば以下のような計算式が使われています。
a.atk * 4 - b.def * 2
aはスキルの使用者側で、bはスキルの対象者です。
例えば2回攻撃を「ハロルド」が「こうもり」に使った場合、aは「ハロルド」で、bが「こうもり」ですね。
atkというのは攻撃力で、defは防御力のことです。
この辺までは普通に開発している方ならごく日常的に使用しているところかなと思います。
三項演算子
さて先日ツクマテさんでツクールの計算式に出てくる記号についてという質問がありました。
こちらで使われている計算式をそのまま引用すると以下の通りです。
a.atk * 4 *(a.hp <= a.mhp / 5 ? 2 : 1) - b.def * 2
確かに先ほどよりも複雑ですね。
具体的には、最初の式の
a.atk * 4 - b.def * 2
に
*(a.hp <= a.mhp / 5 ? 2 : 1)
が組み合わさった形となります。
そして恐らく多くの方が疑問に思うのもこの組み合わされた中で使われている「?」や「:」という記号でしょう。
謎の記号の正体
こちらは三項演算子と呼ばれる記述で使われている記号です。
ツクマテさんの方でも回答しますが改めてまとめると、以下の形式になります。
(条件式) ? (条件式がtrueのとき実行) : (条件式がfalseのとき実行)
もう一度あの謎の記号が混じった部分を見てみましょう(最初の*は掛け算の意味です。説明に不要なのでここでは省きます)。
(a.hp <= a.mhp / 5 ? 2 : 1)
上記の式の意味は 「使用者の現在HP」が「使用者の最大HP÷5」以下ならば「2」を返す。そうでなければ「1」を返すとなります。
最初の
a.hp <= a.mhp / 5
をわかりやすく記述すると
a.hp <= (a.mhp / 5)
ということですね。
なんでこんなややこしい記述を使うのか
三項演算子は、ある程度プログラミングに慣れていても、パッと見ただけではどういう計算式になっているのかわかりにくいです(特に1行で複数の三項演算子が使われていると最悪です)。
それでもなぜこんなものを使うのかと言うと、記述が簡単になるからです(「記述が簡単」とは「タイプ数が少ない」の意味であり、「読みやすい」と同義ではありません)。
具体的には、ツクマテの方でWTRさんが回答しているように、if文を使うと複数行になるものが、なんと1行で書けてしまうのですね。
if文を使うほど複雑でない場合は僕もよく三項演算子を使っています。
また、RPGツクールMVのスキル計算式の欄は1行に制限されています。
それならば、通常は複数行で書くスタイルであるif文よりも、三項演算子の方がまだ読みやすいだろうな、という感じです。
短絡評価
最後は短絡評価です。
計算式として使われる短絡評価の形式は
値1 || 値2
が多いかなと思います。
意味としては値1が空に相当する値ならば、値2を返すということになります。
例えば
undefined || a.atk * 4 - b.def * 2
ならば結果として使われる式は
a.atk * 4 - b.def * 2
の方になりますね。
使いどころ
例えばプラグインでエネミーやアクターに機能を追加していて、以下のような記述が可能だとします。
a.superPower()
このsuperPowerメソッドは空に相当する値もしくは超強い値をランダムで返すとします。
で、空の値が返ってきたとき、あるスキルでは
a.atk * 4 - b.def * 2
を適用し、あるスキルでは
a.atk * 1 - b.def * 2
を適用するとします。
このとき、各スキルは以下のように記述することができます。
a.superPower() || a.atk * 4 - b.def * 2
a.superPower() || a.atk * 1 - b.def * 2
まあこんな使い方をする人がいるのかどうかはかなり怪しいですが……(僕ならsuperPowerを呼ぶだけできちんと区別して使えるようにします)。
フォロワー以上限定無料
次回以降の記事の予定など
無料