スクリプト/トロッコの走らせ方
最終投稿者: 光楼(114)
更新:2016/10/09 10:28:37
1.スクリプトの用意
まずは以下のスクリプトを開始スクリプトにコピペします。
※このスクリプトには『AddArrayUp関数』,『BinarySearchUp関数』,『DeleteArray関数』,そしてaoihikawa様の『isArray関数』を使用しています。重複する場合はどちらか片方を消して下さい。
##########↓トロッコ実装用スクリプトver1.0↓########## ##========バグ防止用処理========## def CorruptionTram() end ##========汎用関数========## def isArray(arr) return getArrayLength(splitString(toString(arr),",")) != 1 end def AddArrayUp(array, v) i = 0 l = getArrayLength(array) while i < l if v < array[i] sort_i = l - 1 while sort_i >= i array[sort_i + 1] = array[sort_i] sort_i = sort_i - 1 end array[i] = v i = l end i = i + 1 end if i == l pushArray(array, v) end return array end def BinarySearchUp(array, v) low = 0 high = getArrayLength(array) - 1 while low <= high i = floor((low + high) / 2) if v == array[i] return i elsif v < array[i] high = i - 1 else low = i + 1 end end return -1 end def DeleteArray(array, a) i = a l = getArrayLength(array) - 1 while i < l array[i] = array[i + 1] i = i + 1 end popArray(array) return array end ##========トロッコ用関数========## #-----システム用関数-----# #<乗車時追加処理># #記述自由 def RideProcessing() speak("発車します。") end #<降車時追加処理># def GetOffProcessing() speak("到着しました。") end #<破損時追加処理># def CorruptionProcessing() speak("トロッコが壊れてしまった!") end #<トロッコ削除># def DellTram(id) DeleteArray(getVariable("トロッコリスト"), BinarySearchUp(getVariable("トロッコリスト"), id)) setEventCharacter(getVariable("トロッコ情報")[id][0], "default") getVariable("トロッコ情報")[id] = createArray() setFlag("トロッコ消去:" + id, true) end #<トロッコ移動># def MoveTram(id, x, y) i = 0 while i < getArrayLength(getVariable("トロッコリスト")) tram_id = getVariable("トロッコリスト")[i] if tram_id != id if (getVariable("トロッコ情報")[tram_id][1] == x) && (getVariable("トロッコ情報")[tram_id][2] == y) CorruptionTram(id) return 0 end end i = i + 1 end setEventDirection("playerCharacterEvent", getVariable("トロッコ情報")[id][3]) mx = getVariable("トロッコ情報")[id][1]; my = getVariable("トロッコ情報")[id][2] m_c_x = mx * 32 + 16; m_c_y = my * 32 + 16 speed = getVariable("トロッコ情報")[id][6] move_x = (x - mx) / speed; move_y = (y - my) / speed i = 1 while i <= speed tram_x = move_x * i + mx; tram_y = move_y * i + my player_x = tram_x * 32 + 16; player_y = tram_y * 32 + 16 s_x = player_x - m_c_x; s_y = player_y - m_c_y cmr_speed = 20 move_cmr_x = s_x / cmr_speed; move_cmr_y = s_y / cmr_speed cmr_i = 0; x_over = false; y_over = false while cmr_i < cmr_speed cmr_x = move_cmr_x * cmr_i + m_c_x; cmr_y = move_cmr_y * cmr_i + m_c_y if ((s_x < 0) && (cmr_x <= player_x)) || ((s_x >= 0) && (cmr_x >= player_x)) cmr_x = player_x x_over = true elsif ((s_y < 0) && (cmr_y <= player_y)) || ((s_y >= 0) && (cmr_y >= player_y)) cmr_y = player_y y_over = true end moveCamera(true, floor(cmr_x), floor(cmr_y)) if x_over && y_over cmr_i = cmr_speed else cmr_i = cmr_i + 1 end end warpEvent("playerCharacterEvent", tram_x, tram_y) m_c_x = player_x; m_c_y = player_y i = i + 1 end getVariable("トロッコ情報")[id][1] = x getVariable("トロッコ情報")[id][2] = y getVariable("トロッコ情報")[id][7] = 1 end #-----設定関数-----# #<トロッコの向きを表す値を取得># def GetDirectionNumber(d) #引数:左右上下 case d when "左" n = 1 when "右" n = 2 when "上" n = 3 when "下" n = 0 end return n end #<トロッコの向きを取得># def GetTramDirection(id) return getVariable("トロッコ情報")[id][3] end #<トロッコ配置># def SetTram(id, eventname, x, y, direction, image_id, ride_image_id, speed) #任意のID, トロッコ用イベントの名前, 配置座標, 向き(下0 左1 右2 上3) 通常・乗車時キャラクタID トロッコの速度(何分の1マスずつ進むか) if !isArray(getVariable("トロッコ情報")) setVariable("トロッコ情報", createArray()) end if !getFlag("トロッコリスト設定フラグ") setVariable("トロッコリスト", createArray()) setFlag("トロッコリスト設定フラグ", true) end AddArrayUp(getVariable("トロッコリスト"), id) getVariable("トロッコ情報")[id] = createArray() getVariable("トロッコ情報")[id][0] = eventname getVariable("トロッコ情報")[id][1] = x getVariable("トロッコ情報")[id][2] = y getVariable("トロッコ情報")[id][3] = direction getVariable("トロッコ情報")[id][4] = image_id getVariable("トロッコ情報")[id][5] = ride_image_id getVariable("トロッコ情報")[id][6] = speed getVariable("トロッコ情報")[id][7] = 0 i = 0 while i < getArrayLength(getVariable("トロッコリスト")) tram_id = getVariable("トロッコリスト")[i] if tram_id != id if (getVariable("トロッコ情報")[tram_id][1] == x) && (getVariable("トロッコ情報")[tram_id][2] == y) DellTram(tram_id) end end i = i + 1 end warpEvent(getVariable("トロッコ情報")[id][0], x, y) setEventDirection(getVariable("トロッコ情報")[id][0], direction) setEventCharacter(getVariable("トロッコ情報")[id][0], getVariable("トロッコ情報")[id][4]) setFlag("トロッコ消去:" + id, false) end #-----乗降関数-----# #<乗車関数># #基本的にトロッコ用イベントに記載 ##トロッコ用イベント↓ #キャラクタを設定しない #当たり判定あり, 向き固定, はなす/調べるの実行 #有効条件 !getFlag("トロッコ消去:id") idが0なら !getFlag("トロッコ消去:0") def RideTram(id, x, y) #処理を行うトロッコ,使用済みトロッコイベント隠し場所 tram_x = getVariable("トロッコ情報")[id][1] tram_y = getVariable("トロッコ情報")[id][2] #プレーヤーをトロッコに hidePlayer() warpEvent("playerCharacterEvent", tram_x, tram_y) setEventCharacter("playerCharacterEvent", getVariable("トロッコ情報")[id][5]) setEventDirection("playerCharacterEvent", getVariable("トロッコ情報")[id][3]) #トロッコを隠す tram_name = getVariable("トロッコ情報")[id][0] warpEvent(tram_name, x, y) showPlayer() setEventCharacter(tram_name, "default") setFlag("乗車", true) setVariable("乗車トロッコID", id) RideProcessing() end #<降車関数># #基本的にレール用イベントに記載 #idのところは基本 getVariable("乗車トロッコID") でよい def GetOffTram(id, x, y) #処理を行うトロッコ,降車場所 if getVariable("乗車トロッコID") == id #指定トロッコが乗ってるトロッコなら tram_x = getVariable("トロッコ情報")[id][1] tram_y = getVariable("トロッコ情報")[id][2] tram_name = getVariable("トロッコ情報")[id][0] setEventCharacter(tram_name, getVariable("トロッコ情報")[id][4]) setEventDirection(tram_name, getVariable("トロッコ情報")[id][3]) hidePlayer() warpEvent(tram_name, tram_x, tram_y) setEventCharacter("playerCharacterEvent", "default") warpEvent("playerCharacterEvent", x, y) showPlayer() setFlag("乗車", false) setVariable("乗車トロッコID", -1) getVariable("トロッコ情報")[id][7] = 0 GetOffProcessing() end end #<トロッコ破損># def CorruptionTram(id) #処理を行うトロッコ if getVariable("乗車トロッコID") == id tram_x = getVariable("トロッコ情報")[id][1] tram_y = getVariable("トロッコ情報")[id][2] hidePlayer() DellTram(id) setEventCharacter("playerCharacterEvent", "default") warpEvent("playerCharacterEvent", tram_x, tram_y) showPlayer() setFlag("乗車", false) setVariable("乗車トロッコID", -1) CorruptionProcessing() end end #-----レール関数-----# #レール用のイベントに記載する ##レール用イベントについて #キャラクタを設定しない #当たり判定なし, 向き固定, 重なった時 #有効条件 getFlag("乗車") #idのところは基本 getVariable("乗車トロッコID") でよい #<直線レール># def Straight(id, d) #処理を行うトロッコ,向き(横0 縦1) if getVariable("乗車トロッコID") == id x = getVariable("トロッコ情報")[id][1] y = getVariable("トロッコ情報")[id][2] case d when 0 case getVariable("トロッコ情報")[id][3] when 1 MoveTram(id, x - 1, y) when 2 MoveTram(id, x + 1, y) else CorruptionTram(id) end when 1 case getVariable("トロッコ情報")[id][3] when 0 MoveTram(id, x, y + 1) when 3 MoveTram(id, x, y - 1) else CorruptionTram(id) end end end end #<曲線レール># def Curve(id, d) #処理を行うトロッコ,向き(左~上0 左~下1 右~上2 右~下3) if getVariable("乗車トロッコID") == id x = getVariable("トロッコ情報")[id][1] y = getVariable("トロッコ情報")[id][2] case d when 0 case getVariable("トロッコ情報")[id][3] when 0 getVariable("トロッコ情報")[id][3] = 1 MoveTram(id, x - 1, y) when 1 MoveTram(id, x - 1, y) when 2 getVariable("トロッコ情報")[id][3] = 3 MoveTram(id, x, y - 1) when 3 MoveTram(id, x, y - 1) end when 1 case getVariable("トロッコ情報")[id][3] when 0 MoveTram(id, x, y + 1) when 1 MoveTram(id, x - 1, y) when 2 getVariable("トロッコ情報")[id][3] = 0 MoveTram(id, x, y + 1) when 3 getVariable("トロッコ情報")[id][3] = 1 MoveTram(id, x - 1, y) end when 2 case getVariable("トロッコ情報")[id][3] when 0 getVariable("トロッコ情報")[id][3] = 2 MoveTram(id, x + 1, y) when 1 getVariable("トロッコ情報")[id][3] = 3 MoveTram(id, x, y - 1) when 2 MoveTram(id, x + 1, y) when 3 MoveTram(id, x, y - 1) end when 3 case getVariable("トロッコ情報")[id][3] when 0 MoveTram(id, x, y + 1) when 1 getVariable("トロッコ情報")[id][3] = 0 MoveTram(id, x, y + 1) when 2 MoveTram(id, x + 1, y) when 3 getVariable("トロッコ情報")[id][3] = 2 MoveTram(id, x + 1, y) end end end end #<交差レール># def Cross(id) #処理を行うトロッコ if getVariable("乗車トロッコID") == id x = getVariable("トロッコ情報")[id][1] y = getVariable("トロッコ情報")[id][2] case getVariable("トロッコ情報")[id][3] when 0 MoveTram(id, x, y + 1) when 1 MoveTram(id, x - 1, y) when 2 MoveTram(id, x + 1, y) when 3 MoveTram(id, x, y - 1) end end end #<分岐レール># def Branch(id, l, r, u, d) #処理を行うトロッコ ,左右上下から来た時の処理(選択(進む方向):"左,右……" 下へ:0 左へ:1 右へ:2 上へ:3 破損:4) if getVariable("乗車トロッコID") == id x = getVariable("トロッコ情報")[id][1] y = getVariable("トロッコ情報")[id][2] case getVariable("トロッコ情報")[id][3] when 0 move = u when 1 move = r when 2 move = l when 3 move = d end loop = true while loop loop = false if (0 <= move) && (move < 4) getVariable("トロッコ情報")[id][3] = move end case move when 0 MoveTram(id, x, y + 1) when 1 MoveTram(id, x - 1, y) when 2 MoveTram(id, x + 1, y) when 3 MoveTram(id, x, y - 1) when 4 CorruptionTram(id) else selct_list = splitString(move, ",") slct = speakWithSelectArray(selct_list, "どちらへ行きますか?") move = GetDirectionNumber(selct_list[slct]) loop = true end end end end #-----駅関数-----# #<中間駅># def WayStation(id, station_x, station_y, straight_direction, text) #処理を行うトロッコ 降りる位置 トロッコが乗っている直進レールの向き 言葉 if getVariable("乗車トロッコID") == id d = false if (getVariable("トロッコ情報")[id][7] == 1) if speakWithSelect(2,"はい","いいえ", text) == 0 d = true end end if d GetOffTram(id, station_x, station_y) else Straight(id, straight_direction) end end end #<終着駅># def TerminalStation(id, station_x, station_y, straight_direction, come_direction, start_direction, Reversal) #処理を行うトロッコ 降りる位置 トロッコが乗っている直進レールの向き 来るときの向き 出発時の向き 到着時トロッコの向きを変えるか if getVariable("乗車トロッコID") == id drct = getVariable("トロッコ情報")[id][3] if drct == come_direction GetOffTram(id, station_x, station_y) if Reversal tram_name = getVariable("トロッコ情報")[id][0] getVariable("トロッコ情報")[id][3] = start_direction setEventDirection(tram_name, getVariable("トロッコ情報")[id][3]) end elsif drct == start_direction Straight(id, straight_direction) end end end ##########↑トロッコ実装用スクリプト↑##########
2.素材の用意
素材はなんでも良いのですが、とりあえず実験で使ったものを用意しました。
クリップしてマップに登録して下さい。
3.レールの配置
1.マップに描く
自由に配置して下さい。
とりあえず説明用に配置してみました。
2.イベントを作成する
レールの上にイベントを作成します。
イベントの設定を以下のように変えます。
項目 | 内容 |
---|---|
あたり判定 | なし |
移動タイプ | 固定 |
開始方法 | 重なった時 |
有効条件 | getFlag("乗車") |
3.処理を記述する
線路に合った関数を記述します。
1.レール関数
- 直線レールの場合
Straight(getVariable("乗車トロッコID"), 0)
- 第1引数は処理を行うトロッコのID(基本getVariable("乗車トロッコID")でよい)
- 第2引数は直線レールの向き(横0 縦1)
- 曲線レールの場合
Curve(getVariable("乗車トロッコID"), 1)
- 第1引数はトロッコID
- 第2引数は曲線レールの向き
- 交差レールの場合
Cross(getVariable("乗車トロッコID"))
- 第1引数はトロッコID
- 分岐レールの場合
Branch(getVariable("乗車トロッコID"), "右,下", 1, 4, 1)
- 第1引数はトロッコID
- 第2引数からは左,右,上,下方向から来た時の処理
処理 | 値 |
---|---|
下へ行かせる | 0 |
左へ行かせる | 1 |
右へ行かせる | 2 |
上へ行かせる | 3 |
破損させる | 4 |
選択させる | 向きを","で区切る(例:"上,下,右") |
基本的なレールはここまで
2.駅関数
駅関数はレールの処理(直線限定)と降車等の処理が1つになった便利な関数です←
書き方はレールの時と同じです。
- 終着駅の場合
TerminalStation(getVariable("乗車トロッコID"), 3, 2, 0, 1, 2, true)
- 第1引数はトロッコID
- 第2,第3引数はプレーヤーを降ろす座標(X,Y)
- 第4引数は直線レールの向き(横0 縦1)
- 第5引数はトロッコ到着時の向き(下:0 左:1 右:2 上:3)
- 第6引数はトロッコ発車時の向き(〃)
- 第7引数は降車後トロッコの向きを発車時の向きに変えるか(true or false)
- 中間駅の場合
WayStation(getVariable("乗車トロッコID"), 3, 2, 0, "降りますか?")
- 第1引数はトロッコID
- 第2,第3引数はプレーヤーを降ろす座標(X,Y)
- 第4引数は直線レールの向き(横0 縦1)
- 第5引数はメッセージ
4.トロッコの配置
1.トロッコ用イベントを作成
とりあえず入れないところへ作成。
以下のように設定します。
項目 | 内容 |
---|---|
イベント名 | 自由(出来れば分かりやすいもの) |
キャラクタ | 設定しないでね |
当たり判定 | あり |
移動タイプ | 固定(向きも固定) |
開始方法 | はなす/調べるの実行 |
有効条件 | !getFlag("トロッコ消去:このトロッコのID(任意)")(例:!getFlag("トロッコ消去:0")) |
2.乗車処理
実行内容のところに記述します。
RideTram(0, 0, 0)
- 第1引数はこのトロッコのID(任意)
- 第2,第3引数はトロッコを隠しておく場所
今回はトロッコ用イベントを作成した座標(0,0)に設定します。
3.線路に乗せる
関数を記述するのはスイッチでも自動開始イベントでも構いません。
今回は楽なのでおじさんにします。
SetTram(0, "トロッコ試作機", 3, 3, 2, 31669, 31669, 2)
- 第1引数は線路に乗せるトロッコのID
- 第2引数はトロッコ用イベントの名前
- 第3,4引数はトロッコを乗せるレールの座標(X,Y)
- 第5引数はトロッコの向き(下:0 左:1 右:2 上:3)
- 第6,第7引数はトロッコに誰も乗っていない時と乗っている時のキャラクタID
- 第8引数は何分の1マスずつ進むか
実装方法は以上です。
5.その他関数
GetDirectionNumber関数
TerminalStation関数など、トロッコの向きを指定する時に使える関数。
- 第1引数はトロッコの向き("左","右","上","下"のいずれか)
- 使用例
SetTram(0, "トロッコ試作機", 3, 3, GetDirectionNumber("右"), 31669, 31669, 2)
GetTramDirection関数
トロッコの向きを取得する関数。
ゲームをロードするとキャラクタが下を向いてしまうので、この関数を使って元に戻そう。
- 第1引数はトロッコのID
- 使用例
setEventDirection("トロッコ試作機", GetTramDirection(0))
GetOffTram関数
トロッコから降車させる関数。
駅関数とは違いレール関数が無いので扱いには注意。
GetOffTram(getVariable("乗車トロッコID"), 20, 35)
- 第1引数はトロッコのID
- 第2,第3引数はプレーヤーを降ろす座標(X,Y)
CorruptionTram関数
トロッコを破損させる関数。プレーヤーは強制的に降ろされる。
破損したレールなどに使うと良い。
CorruptionTram(getVariable("乗車トロッコID"))
- 第1引数はトロッコのID
RideProcessing関数, GetOffProcessing関数, CorruptionProcessing関数
順に乗車時、降車時、トロッコ破損時に表示するメッセージ。
好きなように書き換えよう。
- 変更例
#<乗車時追加処理># def RideProcessing() speak("出発進行!") end #<降車時追加処理># def GetOffProcessing() speak("無事到着!") end #<破損時追加処理># def CorruptionProcessing() speak("うわっ、トロッコが壊れた!") end
6.トロッコによって処理を変える
以下のようにgetVariable("乗車トロッコID")を使わずIDを指定すれば、if文を使わなくても処理を分ける事ができる。
WayStation(0, 11, 39, 1, "降りますか?") Straight(10, 1)
この場合、ID:0のトロッコなら中間駅の処理、ID:10のトロッコなら直線レールの処理のみを行う。
つまりID:10のトロッコはこの駅を通過する。
この方法を使えばトロッコによって分岐で曲がる方向を変えたり出来るので、色々試してみよう!
7.障害物
当たり判定のあるイベントの有効条件を
!getFlag("乗車")
にすれば、トロッコに乗っていない時には存在し、乗っている時には存在しない障害物が作れます。
トロッコしか通れない場所(橋など)を作る時に使おう!
8.トロッコを使ったゲーム
今までに実験でトロッコを使ったゲームです。
コメントする
コメントするには、ログインする必要があります。
コメント一覧
コメントはありません。