スクリプト/はじめてのRmakeスクリプト / 第08回 ユーザ定義関数をマスターしよう(履歴ID:273)
最終投稿者: aoihikawa
更新:2012/06/19 09:09:48
はじめてのRmakeスクリプト
第08回 ユーザ定義関数をマスターしよう
こんにちは 簸川 葵(ひかわ あおい)と申します
こんにちは 剣 芽優(つるぎ めゆ)です
この連載ではスクリプトの基礎を、じっくりとお話していきます
分からないところがあったら、過去の記事を読んでみてね
08-01 ユーザ定義関数
前回では時間の動作についてお話しました
今回は、『ユーザ定義関数』についてお話します
「関数」って、ある決まった動作をするまとまりのことだったよね
そうですね Rmakeでは「ユーザ定義」という名前の通り
オリジナルの関数をつくることができます
そんなことも可能なのね
これを使えば、ゲームの仕組みを変えることもできちゃったりするのかな
ゲームのシステムに関連した操作を行いたい場合は、
これまで通り用意されている関数を使う必要がありますが
繰り返し似たような処理を行う場合は、『ユーザ定義関数』にしておくことで
スクリプトを何度も書くという手間を省くことができます
できることは限られているのね
なお、『ユーザ定義関数』の作成は「def文」を使います
「def文」はdef (関数名)()~endでセットとなっています
#宿屋のユーザ関数 def shopInn() #変数「s」に表示するメッセージ文字列を入れる s = "お泊りですか?\n一晩10Gになります" #speakWithSelect関数の戻り値を元に複数分岐する case speakWithSelect(2, "はい", "いいえ", s) when 0 #「0」番目の選択肢が選ばれた場合 speak("ようこそ こちらの部屋へどうぞ") when 1 #「1」番目の選択肢が選ばれた場合 speak("無茶はされないよう") end end #宿屋のユーザ関数を使う(1回目) shopInn() #宿屋のユーザ関数を使う(2回目) shopInn()
speakWithSelect関数は1度しか書いてないのに、2回表示されたわ
この場合「shopInn」という名前の『ユーザ定義関数』を作成し
その中にspeakWithSelect関数を用意しておいたため
「shopInn関数」を使うことで、繰り返し
speakWithSelect関数の処理が実行されたわけです
「shopInn」が3回書いてあるけど、関数の実行は2回なのね
『ユーザ定義関数』をつくったとき、そこでは内容は実行されません
『ユーザ定義関数』を使ったタイミングで始めて実行されます
だから2回のみ実行されたのね
なお、『ユーザ定義関数』は先に用意されていないと使うことができません
必ず使用するより前の場所に「def文」でつくっておく必要があります
ということは、複数のイベントやシーンで使用する場合
それぞれのイベントやシーンの始めに、全部書かないといけないの?
複数のイベントやシーンで使用する場合は、
必ず先に実行される仕組みになっている「開始スクリプト」を使うと良いでしょう
複数のイベントやシーンで使用する『ユーザ定義関数』は
「開始スクリプト」につくるようにすればいいのね
08-02 ユーザ定義関数と引数
ユーザ定義関数も他の関数と同様に、値を渡すことができます
この関数に渡す値のことを『引数』といいます
関数名の後ろについていた、「( )」で囲まれていた値のことね
複数の『引数』を渡したい場合は「,」で区切り、
左から順に「第1引数」「第2引数」・・・といったように
番号をつけて呼ぶこともあります
さっきのspeakWithSelect関数の場合「第4引数」まであったわけね
そうですね それでは実際にスクリプトをみてみましょう
#宿屋のユーザ関数 def shopInn(g) #変数「s」に表示するメッセージ文字列を入れる s = "お泊りですか?\n一晩" + toString(g) + "Gになります" #speakWithSelect関数の戻り値を元に複数分岐する case speakWithSelect(2, "はい", "いいえ", s) when 0 #「0」番目の選択肢が選ばれた場合 speak("ようこそ こちらの部屋へどうぞ") when 1 #「1」番目の選択肢が選ばれた場合 speak("無茶はされないよう") end end #宿屋のユーザ関数を使う shopInn(50)
全体的な形はさっきとほとんど同じね
先ほどと異なる点は、def文の関数名の後ろの()内に
引数を受け取る変数名が追加されています
「shopInn関数」を使う時に渡している「50」という数値が
変数「g」に入るようになるのね
そのとおりです 後は、変数「g」の値を元に
選択肢で表示されるメッセージが変わるようになっています
ユーザ定義関数の引数を使うようにすることで
状況に応じてユーザ定義関数で動かしたい処理を変えることができるのね
08-03 ユーザ定義関数と戻り値
ユーザ定義関数も他の関数と同様に、戻り値を返すこともできます
なお、戻り値のことを『返り値』ということもあります
戻り値の設定は「return文」を使用します
「return文」はreturn (値)の形で書き、def文の中に入れる必要があります
どういったときに使うの?
関数を使うことで複雑な計算を行い、計算結果を得る場合や
関数でどういった内容が実行されたか知りたい場合に、
関数の戻り値として結果の値を設定します
いまいち、ピンとこない・・・
実際にスクリプトをみてみましょう
#宿屋のユーザ関数 def shopInn(g) #変数「s」に表示するメッセージ文字列を入れる s = "お泊りですか?\n一晩" + toString(g) + "Gになります" #変数「f」にブーリアン「false」を初期値として入れる f = false #speakWithSelect関数の戻り値を元に複数分岐する case speakWithSelect(2, "はい", "いいえ", s) when 0 #「0」番目の選択肢が選ばれた場合 speak("ようこそ こちらの部屋へどうぞ") #変数「f」の値を「true」に変更する f = true when 1 #「1」番目の選択肢が選ばれた場合 speak("無茶はされないよう") end #関数の戻り値に、変数「f」の値を設定する return f end #宿屋のユーザ関数の結果によって、分岐処理を行う if shopInn(50) speak("宿屋に泊まったよ") else speak("宿屋に泊まらなかったよ") end
えっと・・・ shopInn関数が実行されたら、
変数「f」に「false」が入って・・・
選択肢で「はい」が選択された場合だけ、変数「f」が「true」に変わります
つまり、選択した内容を「return文」で戻り値として設定してるのね
最後に「if文」の条件に「shopInn関数」の戻り値を入れることで
表示する内容を切り替えています
関数の中で実行された選択肢の結果が、
戻り値を使うことで、関数の外でも分かるようになるのね
08-04 第08回 まとめ問題集
それでは、今回のまとめ問題です
よーっし がんばるよ
なお、回答は記載しておりません
スクリプトをコピーして、実際に動作させることでチェックしてください
問題01
次のスクリプトにユーザ定義関数を使用して
実行結果が「おはよう」と表示されるよう、行を追加してください
#ここに追加する speakAisatu()
問題02
次のスクリプトにユーザ定義関数と引数を使用して
実行結果が「こんにちは」と表示されるよう、行を追加してください
#ここに追加する case x when 0 speak("おはよう") when 1 speak("こんにちは") when 2 speak("こんばんは") end end speakAisatu(1)
問題03
次のスクリプトにユーザ定義関数と引数を使用して
実行結果が「こんにちは 勇者様」と表示されるよう、行を追加してください
#ここに追加する speak(speakAisatu(1) + " 勇者様")
できた! これで、イベントやシーンの作成が簡単になるわね
なお、理解したかどうかの確認なので、コメントに回答を書かないでください
<連載一覧>
第01回 変数と数値をマスターしよう
第02回 変数と文字列をマスターしよう
第03回 変数とフラグをマスターしよう
第04回 配列変数をマスターしよう
第05回 通常変数をマスターしよう
第06回 数値の応用をマスターしよう
第07回 時間の動作をマスターしよう
第08回 ユーザ定義関数をマスターしよう
第09回 スクリプト用語のまとめ