スクリプト講座その2 〜ダメージ計算式と戯れる(関数編)〜
こんにちは、シロップです!
今回はスクリプト講座の第二回目となります!
第一回目の前回は、簡単なスクリプトでダメージ計算式をいじって遊んでみました。$gameParty._gold
で 「パーティーの所持金」といったように、A.B
はAのB
と訳せると説明しましたね!
今回は引き続きダメージ計算式のスクリプトを触りながら、A.B(C,...)
といった形で表される関数というものをご紹介します。
関数について
さっそくですが、ダメージ計算式に下のスクリプトを入れてみて下さい。
(b.isGuard() ? 0.1 : 1) * 2 * (a.atk * 4 - b.def * 2)
これは、「防御によりダメージを1/10にできる敵の必殺技的なスキル」です。
スクリプトを解析してみましょう。
まず、一番右側の(a.atk * 4 - b.def * 2)
は慣れ親しんだ通常攻撃の計算式ですね。
それを直前の2 *
により2倍しています。 「通常攻撃の2倍威力のダメージ」ということが分かります。
(b.isGuard() ? 0.1 : 1 ) * (2倍 * 通常攻撃ダメージ)
では、前半部分をみていきます。bが攻撃対象者であるから、b.isGuard()
を日本訳してみると攻撃対象(b)が防御(guard)しているか?
と訳すことができます。
A.B
が「Aが持っているBという要素」と訳せるとすると、A.B()
は「Aさん、Bを実行して下さい」と、Aに対してBという内容を命令しているとみなせます。
b.isGuard()
はb(攻撃対象者)に対して「防御しているか(isGuard)教えて下さい」と命じている訳です。
命令を受けたbは、
- 自分が持っている特性をリスト化して
- その中に「防御状態」を表す特性が含まれているか
- さらに、状態異常などで行動不能状態ではないかを判断
という処理を順に行って、最終的に防御状態であればtrue
、防御状態でなければfalse
を返答します。(※ true<真>はツクールのスイッチで言うところのON状態、false<偽>はOFF状態を表します。)
つまり、対象が防御状態であればb.isGuard()
は返答結果であるtrue
に置きかわり、防御状態でなければfalse
という結果に置きかわります。
関数の定義
このように、複数の処理をまとめて、特定の機能を実現したものを関数
と呼びます!
(isGuard()
は「自身が防御状態かどうかを返答する機能」を実現した関数と言えます。)
さらに、このisGuard関数のように結果を返す関数もあれば、結果は返さず処理を行うだけの関数もあります。
結果を返さない関数の例
$gameParty.increaseSteps()
「パーティーが計測している累積歩数を一歩増やせ」、という命令です。
内部的には$gameParty._steps という変数が1増えます。(変数についてはいずれ)
結果を返す関数の例
$gameSystem.playtime()
:「システムが管理しているプレイ時間を返す」関数。$gameParty.gold()
:「パーティーの所持金額を返す」関数です。
2つ目の例は、冒頭で述べた$gameParty._gold
というスクリプトと同じ結果となります。
この2つは何が違うのかと言うと、$gameParty._goldという表記がパーティーの所持金額を覗き見している状態であるのに対し、$gameParty.gold()
という関数命令では正規にパーティーに対して所持金額を尋ねている状態と言えます。
専用の関数命令が用意されてる場合は、そちらを利用しましょう!(おまけ1で補足)
引数(命令の詳細なパラメータ)を取る関数
関数にはさらに、命令するときに詳細なパラメータを指定できものもあります。
A.関数名(引数1,引数2,・・・)
、といった感じで括弧の中にパラメータをカンマ「,」区切りで指定します。
この指定するパラメータを引数(ひきすう) と呼びます。
例えば、次のスクリプトを見てみます。
$gameActors.actor(1).addState(2)
前半の$gameActors.actor(1)
は、すべてのアクターを管理しているゲームアクターズ($gameActors)に対して、カッコ内で引数指定したアクターID1のアクターを渡すように命令しています。
そして、渡してもらったアクターに対して括弧内で指定したステートID2の状態異常(state) を付与(add)するように命令しています。
全体としては「アクターID1のアクターにステートID2のステートを付与」するスクリプトとなります。
関数定義のまとめ
関数についてまとめます。
- 関数名(引数1, 引数2, ・・・)という形で実行する
- 複数の処理をまとめて特定の機能を実現する命令
- 何らかの命令の結果を返す関数と返さない関数がある
- 引数(ひきすう)で命令の詳細なパラメータを指定できる
3項演算子(ちょっと上級者向け)
さて、ここまでの説明で関数についてはなんとなく理解してもらえたと思います!
冒頭のダメージ計算式スクリプト(b.isGuard() ? 0.1 : 1) * 2 * (a.atk * 4 - b.def * 2)
を完全に理解してもらうにはあと1つ、3項演算子についても説明しておきます!
ここまでの説明では下のように訳せましたね!
(攻撃対象(b)は防御状態か(isGuard) ? 0.1 : 1) * 2 * 通常攻撃のダメージ
さて、まだ説明してませんisGuard()直後の「?」と「:」という2つの記号を合わせて3項演算子と呼びます。
3項演算子は次のように使います。
条件式 ? 条件がtrue<真>である場合に使う値 : false<偽>である場合に使う値
条件式についてはいずれ詳しく説明しますが、ここではisGuard()関数が防御状態かどうかによってtrueかfalseを返しており、「trueなら0.1、falseなら1を使う」という表記になります。
(攻撃対象(b)が防御状態(isGuard)であれば0.1 、そうでなければ1) * 2 * 通常攻撃のダメージ
つまり、防御状態のときはスキルの基本ダメージ(通常攻撃の2倍の威力)に0.1をかけて軽減しており、防御状態でなければ1をかけてそのままのダメージとなります。
次回の内容
お疲れ様でした!
今日はスクリプトの重要な要素である関数について説明しました!
前回と比べて少しレベルが高くなったと思いますが、ついてこれたでしょうか?
まだまだ難しい内容が残ってますが、スクリプトでできることも増えていきます!
じっくり読んで、わからない部分はコメントで質問してくださいませ!
次回はツクールでもおなじみの変数についてご説明します!
※どれくらいの人に最後まで読んでもらえているのか気になるので、ここまで読んでくれた人は「いいね」してもらえると嬉しいです!
おまけ
おまけの内容は支援者限定コンテンツとしてみました。
基本編の講座についてはおまけのみ限定コンテンツで、応用編以降の講座については支援者限定コンテンツとなりますのでよろしくおねがいします!!
おまけの中身
- プライベートな要素について
- 特定の状態で強化されるスキルの例
- 追加でスキルを発動するスキル
【 300円 】プラン以上限定 支援額:300円
このバックナンバーを購入すると、このプランの2018/10に投稿された限定特典を閲覧できます。 バックナンバーとは?
支援額:300円