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

投稿者:Material 185033 3 mini 光楼(114) 投稿日:2016/05/07 16:20

10連休が終わりそうって頃にやりたいことが出来る。

先ほど公開したトロッコ実験 - 【2DRPG】について語ろうかなと思います。

随分前にトロッコ走らせたいなんて言ってましたが、この頃に作ったスクリプトと、今回作ったスクリプトは、全くの別物です。

だって、どの座標にどの線路があるかを全て記述するのめんどいやん……

だからプレーヤー自体がトロッコになって、線路用イベントと重なったら移動処理を実行する方式に変えました。

直線レールの上に置かれてるイベントには直線レールの関数が、曲線レールのイベントには曲線レールの関数が記述されているんです。

これは順調に行きましたよ。 問題はここからです。

乗車の処理に悩まされました。

乗車の処理は簡単に言うと、
プレーヤーを隠す
↓
プレーヤーをトロッコに変身させる
↓
プレーヤーの向きを変える
↓
元からあったトロッコを何処かへ移動させる
↓
トロッコになったプレーヤー表示
↓
元トロッコを消す

ってなってるんです。

でも仕様なのかバグなのか、どの向きを指定しても、プレーヤーを変身させた直後は下を向いてるんです。

今はspeak文で、変な方向を向いたまま発車しないようにしてますが、どうにかなりませんかね~

降車や破損の処理は問題ありませんでした。

ただ、降車用のマスの上でトロッコに乗ると、案の定すぐ降りてしまうので、こんなスクリプトを書きました。
station_x = 4; station_y = 28 #降りる位置
come_direction = 4 #来るときの向き
start_direction = 3 #出発時の向き
straight_direction = 1 #トロッコが乗っている直進レールの向き

id = getVariable("乗車トロッコID")
drct = getVariable("トロッコ情報")[id][3]
if drct == come_direction
	GetOffTram(id, station_x, station_y) #降車

	tram_name = getVariable("トロッコ情報")[id][0]
	getVariable("トロッコ情報")[id][3] = start_direction #向き変更
	setEventDirection(tram_name, getVariable("トロッコ情報")[id][3])

elsif drct == start_direction
	Straight(id, straight_direction) #直線レール
end

降りる時と発車する時の処理を、トロッコの向きで分けてます。

向きが同じ時はどうするかって言われたら、新たなフラグを設定するか、乗るところと降りる所を変えるしかなさそうです。

ちなみに乗車時の処理はトロッコに記述しているので、ここには降車と直線レールの処理しか書いてません。


一番難しかったというか、時間がかかったのが、カメラ移動。

ほら、プレーヤーを連続ワープで移動させると画面がカクカクするんです。

これみたいに↓
カクカクカッソウ - 【2DRPG】

トロッコはスムーズに移動させたかったので、カメラ移動でなんとかならないかと思ってやってみたら、画面が上下にグワングワン動いて酔いそうになりました。

原因は、カメラがプレーヤーの何処を中心としているかを勘違いしてた事です。

普通に考えたら分かることなんですが、左上じゃなくて中心なんですよね。

warpEventでX座標を10に指定して、getPlayerPosX()で取得すると10*32pixelで320になると思いきや、16pixel足した336となる。

だからmoveCameraでX:320に移動してもmoveCamera(false)を実行した瞬間ガクッと画面が動くわけです。

原因はもう一つ、プレーヤーをワープさせた後に画面を移動させていた事です。

プレーヤーを移動させると、何やっても画面動いちゃうんですよね。

だから
プレーヤー移動で画面動く→カメラ移動で元いた位置に画面動く→現在位置まで画面移動→以後ループ

ってなってグワングワンなってたんです。

だから先に、プレーヤーを移動させる位置までカメラを移動させて、それからワープすることで、スムーズな移動が実現出来ました。

大変だったよ。


トロッコのスクリプトは線路が足りなかったりするので、まだ未完成です。

なので詳しい説明はしませんが、それでもやってみたいという人のためにスクリプト公開しときます。

実験ゲームのやつそのまま載せるので、そのまま使うとエラー出ますw

スクリプトに簡単な使い方の説明があるので、それを参考にして下さい。
#デバッグ用
#setVariable("Text", createText(10, 10, 300, 300))
playBGM(187657)

##配列かどうかを調べる関数
#aoihikawaさん作
def isArray(arr)
  return getArrayLength(splitString(toString(arr),",")) != 1
end

####トロッコセット
def SetTram(id, eventname, x, y, direction, image_id, ride_image_id, speed) #任意のID, トロッコ用イベントの名前, 配置座標, 向き(左1 右2 上3 下4) 通常・乗車時キャラクタID トロッコの速度(何分の1マスずつ進むか)
	if !isArray(getVariable("トロッコ情報"))
		setVariable("トロッコ情報", createArray())
	end
	getVariable("トロッコ情報")[id] = createArray()
	getVariable("トロッコ情報")[id][0] = eventname #イベントの名前
	getVariable("トロッコ情報")[id][1] = x #座標
	getVariable("トロッコ情報")[id][2] = y
	getVariable("トロッコ情報")[id][3] = direction #向き
	getVariable("トロッコ情報")[id][4] = image_id #キャラクタID
	getVariable("トロッコ情報")[id][5] = ride_image_id #乗車時キャラクタID
	getVariable("トロッコ情報")[id][6] = speed #トロッコの速度
	warpEvent(getVariable("トロッコ情報")[id][0], x, y)
	setEventDirection(getVariable("トロッコ情報")[id][0], direction)
	setEventCharacter(getVariable("トロッコ情報")[id][0], getVariable("トロッコ情報")[id][4]) #トロッコ表示
	setFlag("トロッコ消去:" + id, false)
end

###乗車時処理2
#記述自由
def RideProcessing()
	fadeOutMusicStop(1000)
	speak("発車します")
	playBGM(148268)
end
###降車時処理2
def GetOffProcessing()
	fadeOutMusicStop(1000)
	speak("到着しました。")
	playBGM(187657)
end
###破損時処理2
def CorruptionProcessing()
	fadeOutMusicStop(1000)
	speak("トロッコが壊れてしまった!")
	playBGM(187657)
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)
		GetOffProcessing()
	end
end

###トロッコ削除
def DellTram(id)
	setEventCharacter(getVariable("トロッコ情報")[id][0], "default")
	getVariable("トロッコ情報")[id] = createArray()
	setFlag("トロッコ消去:" + id, true)
end

###トロッコ破損
def CorruptionTram(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

###トロッコ移動
def MoveTram(id, x, y) #処理を行うトロッコ,移動先
	#setEventTarget("playerCharacterEvent", x, y); runEventMove()
	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 = 10 #カメラ移動速度 小さいほど早い
		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
			#setText(getVariable("Text"), "X : " + cmr_x + "  Y : " + cmr_y,
			#							"\n実際X : " + floor(cmr_x) + "  Y : " + floor(cmr_y),
			#							"\n現在X : " + getPlayerPosX() + "  Y : " + getPlayerPosY(),
			#							"\n移動先X : " + player_x + "  Y : " + player_y)
			moveCamera(true, floor(cmr_x), floor(cmr_y)) #カメラ移動
			if x_over && y_over
				cmr_i = cmr_speed + 1
			else
				cmr_i = cmr_i + 1
			end
		end
		warpEvent("playerCharacterEvent", tram_x, tram_y)
		moveCamera(false)
		m_c_x = player_x; m_c_y = player_y #元カメラ位置
		i = i + 1
	end
	getVariable("トロッコ情報")[id][1] = x #座標
	getVariable("トロッコ情報")[id][2] = y
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 3 #上
				MoveTram(id, x, y - 1)
			when 4 #下
				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 1 #左
				MoveTram(id, x - 1, y)
			when 2 #右
				getVariable("トロッコ情報")[id][3] = 3
				MoveTram(id, x, y - 1)
			when 3 #上
				MoveTram(id, x, y - 1)
			when 4 #下
				getVariable("トロッコ情報")[id][3] = 1
				MoveTram(id, x - 1, y)
			end
		when 1 #左下
			case getVariable("トロッコ情報")[id][3]
			when 1 #左
				MoveTram(id, x - 1, y)
			when 2 #右
				getVariable("トロッコ情報")[id][3] = 4
				MoveTram(id, x, y + 1)
			when 3 #上
				getVariable("トロッコ情報")[id][3] = 1
				MoveTram(id, x - 1, y)
			when 4 #下
				MoveTram(id, x, y + 1)
			end
		when 2 #右上
			case getVariable("トロッコ情報")[id][3]
			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)
			when 4 #下
				getVariable("トロッコ情報")[id][3] = 2
				MoveTram(id, x + 1, y)
			end
		when 3 #右下
			case getVariable("トロッコ情報")[id][3]
			when 1 #左
				getVariable("トロッコ情報")[id][3] = 4
				MoveTram(id, x, y + 1)
			when 2 #右
				MoveTram(id, x + 1, y)
			when 3 #上
				getVariable("トロッコ情報")[id][3] = 2
				MoveTram(id, x + 1, y)
			when 4 #下
				MoveTram(id, x, y - 1)
			end
		end
	end
end

###交差レール
def Cross(id) #処理を行うトロッコ
	if getVariable("乗車トロッコID") == id
		x = getVariable("トロッコ情報")[id][1]
		y = getVariable("トロッコ情報")[id][2]
		case getVariable("トロッコ情報")[id][3]
		when 1 #左
			MoveTram(id, x - 1, y)
		when 2 #右
			MoveTram(id, x + 1, y)
		when 3 #上
			MoveTram(id, x, y - 1)
		when 4 #下
			MoveTram(id, x, y + 1)
		end
	end
end

###分岐レール
def Branch(id, l, r, u, d) #処理を行うトロッコ ,左右上下から来た時の処理(選択"?,?……" 左へ1 右へ2 上へ3 下へ4 破損5)
	if getVariable("乗車トロッコID") == id
		x = getVariable("トロッコ情報")[id][1]
		y = getVariable("トロッコ情報")[id][2]
		#処理選択
		case getVariable("トロッコ情報")[id][3]
		when 1 #左向き(右から来た)
			move = r
		when 2 #右
			move = l
		when 3 #上
			move = d
		when 4 #下
			move = u
		end
		loop = true
		while loop
			loop = false
			if (1 <= move) && (move < 5) #向き設定
				getVariable("トロッコ情報")[id][3] = move
			end
			case move
			when 1 #左へ行く処理
				MoveTram(id, x - 1, y)
			when 2 #右へ行く処理
				MoveTram(id, x + 1, y)
			when 3 #上へ行く処理
				MoveTram(id, x, y - 1)
			when 4 #下へ行く処理
				MoveTram(id, x, y + 1)
			when 5 #破損
				CorruptionTram(id)
			else #選択
				loop = true
				selct_list = splitString(move, ",")
				drct = splitString("左,右,上,下", ",")
				list = createArray() #実際の選択肢
				i = 0
				while i < getArrayLength(selct_list)
					pushArray(list, drct[toNumber(selct_list[i]) - 1])
					i = i + 1
				end
				move = toNumber(selct_list[speakWithSelectArray(list, "どちらへ行きますか?")])
			end
		end
	end
end


未完成だけど素材も
キャラクタ


実験用トロッコ

マップチップ定義


実験用レール

コメントする

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

コメント一覧

            mini mosmoss(投稿日:2016/05/10 18:45, 履歴)
setEventTargetでプレイヤーを動かすのと
スピードが若干ちがうからか新鮮な感じがしました。
ちょっとコトコトしてるところがトロッコぽいですね。
Material 185033 3 mini 光楼(114)(投稿日:2016/05/14 11:25, 履歴)
コトコトしているのは意図してやったのではないんですが、トロッコっぽかったのでそのままにしてありますw
Cdv30200 aoi icon mini aoihikawa(投稿日:2016/05/09 01:35, 履歴)
何か特殊なことを行おうとすると
出てくる新たな問題、
あるある、ですね

ここまでの完成形の制作
おめでとうございます
Material 185033 3 mini 光楼(114)(投稿日:2016/05/14 11:22, 履歴)
仕様を理解していないというか、勘違いしてるとよく問題にぶち当たりますね。

>ここまでの完成形の制作
>おめでとうございます
ありがとうございます~