【トロッコスクリプト公開】光楼のゲーム制作日記 No.5

投稿者:Material 185033 3 mini 光楼(114) 投稿日:2016/10/08 16:21

何かを終わらせるとやる気が出なくなる……


これは先週公開した実験ゲーム。

これにトロッコが登場しています。


トロッコを使ったゲームは以前にも公開してますが、その時はまだ完成とは言えない出来でした。

光楼のゲーム制作日記 No.2

これに改良を重ね、ついに完成しました!

ってなわけで解説付きでスクリプトを公開します。

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.素材の用意

素材はなんでも良いのですが、とりあえず実験で使ったものを用意しました。
クリップしてマップに登録して下さい。
キャラクタ


実験用トロッコ

マップチップ定義


トロッコ用レールver0.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引数は曲線レールの向き
左から順に0,1,2,3

  • 交差レールの場合
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(任意)
先ほど0と決めたので0にします。
  • 第2,第3引数はトロッコを隠しておく場所
プレーヤーから見えず、マップの通行設定が通行可の場所を選んで下さい。
今回はトロッコ用イベントを作成した座標(0,0)に設定します。


3.線路に乗せる

関数を記述するのはスイッチでも自動開始イベントでも構いません。
今回は楽なのでおじさんにします。
SetTram(0, "トロッコ試作機", 3, 3, 2, 31669, 31669, 2)

  • 第1引数は線路に乗せるトロッコのID
先ほど作成したトロッコを乗せるので0
  • 第2引数はトロッコ用イベントの名前
先ほど設定したイベント名("トロッコ試作機")
  • 第3,4引数はトロッコを乗せるレールの座標(X,Y)
  • 第5引数はトロッコの向き(下:0 左:1 右:2 上:3)
  • 第6,第7引数はトロッコに誰も乗っていない時と乗っている時のキャラクタID
乗ってるor乗ってないで変化させない場合は同じIDを入れる。
  • 第8引数は何分の1マスずつ進むか
1が最速 2で0.5ずつ進む


長くなってしまいましたが実装方法は以上です。


まだ紹介してない関数がありますので、そのうちWikiに関数リファレンスを書こうかなと思っています。

追記:Wiki書きました。
スクリプト/トロッコの走らせ方

コメントする

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

コメント一覧

Cdv30200 aoi icon mini aoihikawa(投稿日:2016/10/09 11:02, 履歴)
長文纏め記事
おつかれさまです
Material 185033 3 mini 光楼(114)(投稿日:2016/10/09 14:44, 履歴)
おつありです。