スクリプト講座その4 〜真偽値<true/false>とif文〜
去年すぐに頓挫してしまいましたスクリプト講座のボツ下書きが残ってたので
破棄するのももったいない気がするので公開しておきます。
現在、日記のおまけにつけている講座内容が難しく感じる場合は、
第1回の記事から順に読んでもらえると多少分かるようになるかもです!
また、講座一覧のページもまとめてみましたので貼っておきます。
* RPGツクールMV講座まとめ【スクリプト他】
こんにちは、シロップです!
前回(第3回の記事は「変数の宣言/代入」のしかたと「文字列の扱い」について説明しましたね。
Javascriptや他の一般的なプログラミング言語には、数値や文字列以外にも便利なデータ型がいくつかあります。
今日はBoolean(真偽値)型とif文について解説していきます!
*次回は配列について解説すると言った気もしますが、その日の気分で書きますのでご勘弁を!(~_~;)
さて、解説します!と力強く宣言はしたのですが…
実はBoolean型も条件分岐も第二回ですでに登場してるので、今回はすんなりと読み進められると思います!
第二回でダメージ計算式スクリプトとしてこんなの↓が出てきたのですが覚えてるでしょうか?
(b.isGuard() ? 0.1 : 1) * 2 * (a.atk * 4 - b.def * 2)
上の式は第1段階の翻訳として次のように訳しました。
(攻撃対象(b)は防御状態か(isGuard) ? 0.1 : 1) * 2 * 通常攻撃のダメージ
最初の部分の「(攻撃対象(b)は防御状態か(isGuard)?」のようにYESかNOで表されるデータ型」 をBoolean<真偽値>型
と呼びます。
(※上の例は、正しくはisGuard()関数が戻り値としてBoolean型の値を返しています。)
そして、3項演算子(?と:のセット)によって条件式が正しい場合と正しくない場合によってダメージにかかる倍率を変化させていたのでしたね!
(攻撃対象(b)が防御状態(isGuard)であれば0.1 、そうでなければ1) * 2 * 通常攻撃のダメージ
今回、紹介するif文による条件式分岐は3項演算子よりも覚えやすく使い勝手も良いので、気構えずに読み進めてください!
Boolean型(真偽値)
さて、先程Boolean型は「YESかNOで表されるデータ型」と言いましたが、Javascriptではtrue<真>とfalse<偽> という2つの値(真偽値)を取ります。
- true<真> : YES、ツクールのスイッチのONにあたる値
- false<偽>:NO、ツクールのスイッチのOFFにあたる値
たとえば、ツクールのイベントコマンドのセーブ可能かどうかはイベントコマンドを通じて「$gameSystem(ゲームのシステム管理オブジェクト)」が所有する「_saveEnabled」という変数を操作しています。
// ゲームシステムに対してセーブ不可状態にさせる命令
Game_System.prototype.disableSave = function() {
this._saveEnabled = false;
};
// ゲームシステムに対してセーブ可能状態にさせる命令
Game_System.prototype.enableSave = function() {
this._saveEnabled = true;
};
prototypeやら見慣れない表記がたくさんあると思いますが、今は無視して大丈夫です。
Game_System(ゲームシステム管理クラスのオブジェクト)にとっての自身(this)が所有する変数_saveEnabledにたいしてtrue<真>やfalse<偽>の値を代入していることが分かればOKです。
※簡単に説明すると、Game_Systemという「ゲームシステムを扱う機能を集めたクラス」の鋳型(prototype)に対して、disableSave()やenableSave()という新しい関数機能を追加しているスクリプトです。
$gameSystemというのはGame_Systemというクラスの鋳型から作られた実際のオブジェクトです。クラスというのはそれ自体は実態のない設計図であり、その設計図に沿って作られたものがオブジェクト、という程度に覚えて置いてください。
実際にゲーム上でセーブコマンドを選ぼうとすると、この$gameSystemにたいしてセーブが可能かどうか問い合わせます。
Game_System.prototype.isSaveEnabled = function() {
return this._saveEnabled;
};
$gameSystem.isSaveEnabled();
のように問い合わせると、$gameSystemは自身が管理している「_saveEnabled」変数に格納されているtrueかfalseの真偽値をそのまま返答(return)しているのが分かると思います。
if文
trueかfalseかを保存する変数があるのであれば、当然、trueかfalseによって処理を分岐させるツクールでいう条件分岐機能を使いたいところですよね。
それを実現するのがif文という文法構文です。
if (条件式){
//条件式が正しい(true)場合の処理内容
}
簡単ですね!
条件式というのは「trueかfalseで表される式」のことです。ついさっき覚えましたBooleanデータ型ももちろん使えます!
var saveEnabled = $gameSystem.isSaveEnabled();
if (saveEnabled){
//セーブが可能なら実行する処理
}
$gameSystemにセーブが可能かどうか問い合わせて変数saveEnabledに返り値(trueかfalseの真偽値)を代入して、その値を条件式として使っています。
セーブ可能(true)なら中括弧「{ }」の中身の処理を実行します。
いちいち変数に代入しないで、そのまま関数の戻り値を条件式に使うこともできます。
if ($gameSystem.isSaveEnabled()){
//セーブが可能なら実行する処理
}
ですが、条件式の中身が複雑になりそうなときは変数を使うと読みやすくなるのでおすすめです。(あとで例を出します)
真偽値をひっくり返す
上の例をみて、じゃあ「セーブが不可能な場合に行いたい処理はどうするんだ!」と思うかもしれません。後ほど説明する比較演算子を使ったりelse文を使ったりと方法はいろいろありますが、もっとも簡単なのは「!」 という否定演算子を使うことです。
真偽値の頭に「!」をつけるとtrueとfalseが入れ替わります!
if (!$gameSystem.isSaveEnabled()){
//セーブが不可能なら実行する処理
}
条件式の中身の$gameSystem.isSaveEnabled()がtrueであれば条件式は!true
つまり反転されてfalse
となります。
逆に、セーブ不可能(false)であれば「!」により反転してtrueとなって、条件式をクリアして「{}」の中身が実行されます。
簡単ですね!
比較演算子
さて、今までは真偽値(true/false)をそのまま代入するなりして使ってましたが、「ある値や式が等しいか」「等しくないか」「○○以上/以下か」といった判断をする条件式も作れます。
var gold = $gameParty.gold();
if (gold < 10){
//所持金が10未満の場合の処理
}
条件式の中身は、左辺(gold)と右辺(10)を比較演算子(<)で比較して、正しければtrue、間違っていればfalse**を表します。
このように左右の項を比較して真偽値を返す演算子を「比較演算子」
と呼びます。
真偽値が返されるので、例えば下のようにそのまま変数にBoolean値として代入することもできます。
var isMoneyShort = ($gameParty.gold() < 10);
if (isMoneyShort){
//所持金が10未満の場合の処理
}
変数isMoneyShort(直訳:お金が不足しているか)に比較演算子<を使った条件式が真であればtrue、偽であればfalseが代入されます。
そして、その真偽値をif文の条件式に使ってるわけです!
比較演算子
「<」以外の比較演算子も見ていきましょう
=== : 左辺と右辺が等しければtrue
!==:左辺と右辺が等しくなければtrue
> :左辺が右辺よりも大きければtrue
>=:左辺が右辺以上であればtrue
* <=:左辺が右辺以下であればtrue
「===」が等号を表しますが、始めて見る方は「=」の数の多さにびっくりするかと思います……が、深く考えないでください!
こういうものなのです!!
(※実は「==」という=の数が違う比較演算子もある……のですが、もう少しJavascriptを理解してからもっと詳しくなりたければ是非ご自身で調べて見てください!! 今はこういうものだと思ってもらって大丈夫なのです!!)
次回予告
すごく中途半端なのですが、長くなってきたのでいったん区切ります!
今回は
- Boolean型の値<true(真)/false(偽)>
- if文の構文`if(条件式) { //処理内容 }
- 比較演算子で左右の項を比較して条件式を作る
の3本立てでお送りしました!
次回は、複数の条件をつなぎ合わせる論理演算子と else文について解説予定です!
おまけ
if文を活用してツクールでなにか……と考えたのですが、スクリプトでif文を使っても実行したい内容をスクリプトで書けないとあまり意味が無いのですよね…。
そこで、今回は「ツクールの条件分岐コマンド」で役立つスクリプトを紹介します。
条件分岐コマンドのスクリプトはif文の条件式を入れる小括弧()の中を書くものだと考えると分かりやすいと思います!
「スクリプトじゃないと書けない処理」や、「変数を通さないと書けない面倒な処理」もばんばんスクリプトで分岐できちゃいますよ!(ほんの少しだけ処理が遅くなりますけど、毎フレーム呼び出すような処理じゃなきゃ全然平気です!)
「スマホかPCか」で分岐!
Utils.isMobileDevice()
:スマホ利用ならtrue
スマホ(MobileDevice)であればtrueとなります。
「スマホ以外なら」という条件にしたかったら否定演算子「!」を使うのでしたね!!Utils.isMobileDevice()
:スマホ以外ならtrue
Utilsクラス(Utilities・ユーティリティーズの略)にはゲームの動作環境などを調べる関数が豊富に用意されてます!
「テストプレイならば」
Utils.isOptionValid('test')
:テストプレイ中であればtrue
デバッグ用にテストプレイでだけアイテムを取得させたりレベルを上げたい場合はこの条件式!
完成版にうっかりデバッグ用のイベントが残ってしまう…なんてこともなくなるはずです!
「タッチ/マウス操作」で分岐!
TouchInput.isTriggered()
:ちょうどタッチされた瞬間であればtrueTouchInput.isPressed()
:タッチが押され続けていればtrueTouchInput.isLongPressed()
:タッチが長く押され続けていればtrueTouchInput.isRepeated()
:タッチが押され続けていれば一定間隔でtrueTouchInput.isCancelled()
:マウスの右クリックか2本指タップでキャンセルされたときにtrueTouchInput.isReleased()
:タッチがちょうど離されたときにtrueTouchInput.isMoved()
:タッチされたまま動いたときにtrue
ちなみに、どこがタッチ/クリックされたかはTouchInput.x
でx座標、TouchInput.y
でy座標が取得出来ますよ!
「キーボード入力」で分岐!
Input.isTriggered(keyName)
:keyNameが押された瞬間であればtrue
keyNameはそれぞれのキーを表す文字列を使います。
'left':左キー
'right':右キー
'down':下キー
'up':上キー
'ok':決定(z、Enter、スペース)
'cancel':キャンセル(x、esc)
'shift':シフトキー
'pageup':ページアップ(Qキー)
* 'pagedown':ページダウン(Wキー)
だいたいこんなところでしょうか?
isTriggered以外の関数はこちら↓
Input.isPressed(keyName)
:keyNameが押され続けていればtrueInput.isRepeated(keyName)
:keyNameが押され続けていれば一定間隔でtrueInput.isLongPressed(keyName)
:keyNameが長く押され続けていればtrue