スクリプト/はじめてのRmakeスクリプト / 第08回 ユーザ定義関数をマスターしよう

最終投稿者:Cdv30200 aoi icon mini aoihikawa 更新:2012/07/19 21:03:27
はじめての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回 スクリプト用語のまとめ



この記事についてご質問等がありましたら
こちらのブログ記事のコメントへご投稿、
よろしくお願いいたします。

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Aa mini #いお(投稿日:2012/07/19 19:46, 履歴)
アクティビティフィードで送信したか送信してないか返り値で表せる。ってかいてあったので調べてここにたどり着いたんですが、この場合、trueとfalseはどう書けばいいんでしょうか。
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/07/19 21:03, 履歴)
関数と戻り値(返り値)の利用に関する記事はこちらになります
メニュー
目次