スクリプト/物を押す(暫定版)(履歴ID:24)

最終投稿者:      mini shirosaboten 更新:2010/02/08 22:51:17

はじめに

このスクリプトを理解するには、以下の関数を理解している必要があります。
#イベントの移動(押す&戻すスイッチ)
  • イベント向きの取得(getEventDirection関数)
  • イベントの移動先の設定(setEventTarget関数)
  • イベントの移動の開始(runEventMove関数)
  • 変数取得(getVariable関数)
  • 変数設定(setVariable関数)
#移動目的先でのイベント発生
  • フラグ取得関数(getFlag関数)
  • フラグ設定関数(setFlag関数)
リンク/関数リファレンス


イベントの移動

A-1.開始スクリプトに以下のように記述します。
  押されるイベント(例:像1,event0)のX座標、Y座標を示す変数を設定します。
setVariable("像1posX", 2)
setVariable("像1posY", 5)

A-2.押されるイベントに以下のスクリプトを記述します。
  話しかけたときのプレイヤーの向きに従って、変数「像1posX」「像1posY」の値を増減させた後、イベントの移動を行います。
#このifは「移動目的先でのイベント発生」に関係します
if !getFlag("くぼみに移動したか")
#プレイヤー向きに従って像の座標用変数を変更
  case getEventDirection("playerCharacterEvent")
    when getDownDirection()
       setVariable("像1posY", getVariable("像1posY") + 1)
    when getUpDirection()
       setVariable("像1posY", getVariable("像1posY") - 1)
    when getRightDirection()
       setVariable("像1posX", getVariable("像1posX") + 1)
    when getLeftDirection()
       setVariable("像1posX", getVariable("像1posX") - 1)
  end     
#像の位置を移動
  setEventTarget("event0", getVariable("像1posX"), getVariable("像1posY")) 
  runEventMove()
else

end

A-1~2だけでイベントを押すことが出来ます。
しかし押したイベントがマップの端等にきた場合、自由な向きに押すことが出来なくなります。
このため、元の位置に戻すスイッチが必要になります。

A-3.戻すスイッチ(イベント)に以下のスクリプトを記述します
  変数「像1posX」「像1posY」の値を元の値に設定し、イベントを元の位置に移動させます。
#このifは「移動目的先でのイベント発生」に関係します
if !getFlag("くぼみに移動したか")
  case speakWithSelect(2,"はい","いいえ", 
    "像を元の位置に戻しますか?")
    when 0
      setEventDirection("event1", getLeftDirection())
#像1のX,Y座標の変数を元の数値に
      setVariable("像1posX", 2)
      setVariable("像1posY", 5)
#像1を元の位置に移動
      setEventTarget("event0", 2, 5)
      runEventMove()
      setEventDirection("event1", getDownDirection())
    when 1
    
  end

else
  speak("スイッチはもう反応しないようだ")
end


移動目的先でのイベント発生

像を自由に押せるだけでも楽しいですが、ここでは特定の位置に移動した場合に、謎が解ける、というイベントを作ってみましょう。
B-1.目的地に目印となるイベントを置く。
・スクリプトの記述は無しです。
・当たり判定を、「無し(通行可能)」にしましょう。

B-2.移動目的先までイベントを押したときに発生するイベントを作ります。
・目的地とは別の場所(マップ上の通行不能場所が良いでしょう)にイベントを作成
・開始方法を「自動的に開始」に設定する。
以下の内容のスクリプトを記述します
『目的地にイベントが移動すると、ゲームクリアのためのイベントが出現し、当イベントは実行禁止に、そして像とスイッチは反応しなくなる。』
#イベントの有効条件
getVariable("像1posX") == 12 && getVariable("像1posY") == 9 && !getFlag("くぼみに移動したか")

#イベントの実行内容
speak("像の位置移動完了!")
#実行内容で大事なのは↓の一行のみ
setFlag("くぼみに移動したか", true)
fadeOut(200, 200, 200)
fadeIn()

これによって、フラグ「くぼみに移動したか」が偽であることを条件にしている実行内容(像:押す、スイッチ:元の位置に戻す)が実行されなくなります。
同時にB-2のイベントは有効条件が満たされなくなり、消滅します。
最後にフラグ「くぼみに移動したか」が真であることを条件に出現する、ゲームクリアのためのイベントを作成します。

(おまけ)B-3.ゲームクリアイベント
#有効条件
getFlag("くぼみに移動したか")

#実行内容
speak("ゲームクリアです!\n押すスクリプト、試してみてね^^")
speak("ゲームを終了します")
goEnding()


以上で完了です。
試しにこのとおりに作ったゲームをプレイしてみてください。


ただし、この押すスクリプトは暫定版、とあるとおり、注意すべき不十分な点があります。
  • マップの構造によっては、戻るスイッチでも戻らない場合がある。
  • 壁際に何度もプッシュした後、別の方向から押すと斜め移動が起きる。
  • ユーザー定義関数で定義できていない(単に私の力不足かもですが)ので、複数個作る場合、煩雑であり面倒。

この押すスクリプトは、以前ゲームで取り入れたことがあるので、興味がありましたら遊んでみてください。
フェアリーテイル

このスクリプト説明に当たって使用したキャラクター画像も公開してありますので良かったら使ってください。
謎の像
くぼみ
スイッチ
Rmake鏡餅

長い文章に付き合ってくださって有難う御座いました!
皆さんのゲーム作りとRmakeの発展を心よりお祈り申し上げます
質問などありましたら答えられる範囲でお答えしますので気軽にコメントしてみてくださいノシ