スクリプト/SpriteCameraサンプルコード
最終投稿者:
dycoon
更新:2011/09/20 19:47:27
dycoon
更新:2011/09/20 19:47:27
以下のゲームでsetSpriteCameraPositionなどスプライト用カメラの関数を使ってみています。
SpriteCameraサンプル
ソースコードは以下の通りで、
自動的に始まるイベントから実行しています。
ここでは、スプライトカメラを
飛行機の位置や向きに合わせて動くようにしています。
以下の部分が特にそれに関連する部分です。
setSpriteCameraOffsetは回転の中心であり、
飛行機が画面のどこに表示されるかを指定しています。
setSpriteCameraPositionとsetSpriteRotationは
飛行機のスプライトと同じ値を指定しています。
これによりカメラと飛行機が同じ位置になるようになります。
つまり、飛行機は画面上では動かないようになります。
ツイート
SpriteCameraサンプル
ソースコードは以下の通りで、
自動的に始まるイベントから実行しています。
#
hidePlayer()
#
textHandle = createText(8, 32, 256, 256)
setText(textHandle, "カーソルキーで移動、\nEキーで終了")
#
setCanvasVisible(true)
#画面サイズ
screenWidth = 512
screenHeight = 384
#背景スプライト
sp0 = createSprite(2)
setSpriteRect(sp0, 0.5, 0.5, screenWidth - 1, screenHeight - 1, -screenWidth / 2, -screenHeight / 2, screenWidth, screenHeight)
setSpritePosition(sp0, screenWidth / 2, screenHeight / 2)
setSpriteRotation(sp0, 0.0)
setSpriteScale(sp0, 1.0, 1.0)
setSpriteZOrder(sp0, 0)
#カメラのパラメーター設定
rot = 0.0
posX = screenWidth / 2
posY = screenHeight / 2 + 64
v = 0.0
rv = 0.0
setSpriteCameraRotation(rot)
setSpriteCameraPosition(posX, posY)
setSpriteCameraOffset(posX, posY)
setSpriteCameraScale(1.0, 1.0)
#飛行機スプライト(カメラと同じ位置)
sp1 = createSprite(23271)
setSpriteRect(sp1, 0.5, 32 * 3 + 0.5, 32 - 1, 32 - 1, -32 / 2, -32 / 2, 32, 32)
setSpritePosition(sp1, posX, posY)
setSpriteRotation(sp1, rot)
setSpriteScale(sp1, 1.0, 1.0)
setSpriteZOrder(sp1, 1)
#入力系
pressUp = false
pressDown = false
pressLeft = false
pressRight = false
#
startInput()
loop = true
while loop
#speak("test " + toString(posX) + " " + toString(posY))
while hasInput()
#内部にたまっている入力を処理対象とします。
takeInput()
if isKeyDown("UP")
pressUp = true
elsif isKeyDown("DOWN")
pressDown = true
elsif isKeyDown("LEFT")
pressLeft = true
elsif isKeyDown("RIGHT")
pressRight = true
elsif isKeyUp("UP")
pressUp = false
elsif isKeyUp("DOWN")
pressDown = false
elsif isKeyUp("LEFT")
pressLeft = false
elsif isKeyUp("RIGHT")
pressRight = false
elsif isKeyDown("E")
loop = false
end
end
if pressUp
v = v + 0.05
end
if pressDown
v = v - 0.05
end
rv = 0.0
if pressLeft
rv = -0.05
end
if pressRight
rv = 0.05
end
posX = posX + sin(rot) * v
posY = posY - cos(rot) * v
rot = rot + rv
setSpriteCameraPosition(posX, posY)
setSpriteCameraRotation(rot)
setSpritePosition(sp1, posX, posY)
setSpriteRotation(sp1, rot)
#
drawCanvas()
waitTime(0)
end
endInput()
setCanvasVisible(false)
deleteText(textHandle)
showPlayer()
goEnding()
ここでは、スプライトカメラを
飛行機の位置や向きに合わせて動くようにしています。
以下の部分が特にそれに関連する部分です。
#カメラのパラメーター設定 rot = 0.0 posX = screenWidth / 2 posY = screenHeight / 2 + 64 v = 0.0 rv = 0.0 setSpriteCameraRotation(rot) setSpriteCameraPosition(posX, posY) setSpriteCameraOffset(posX, posY) setSpriteCameraScale(1.0, 1.0)
posX = posX + sin(rot) * v posY = posY - cos(rot) * v rot = rot + rv setSpriteCameraPosition(posX, posY) setSpriteCameraRotation(rot) setSpritePosition(sp1, posX, posY) setSpriteRotation(sp1, rot)
setSpriteCameraOffsetは回転の中心であり、
飛行機が画面のどこに表示されるかを指定しています。
setSpriteCameraPositionとsetSpriteRotationは
飛行機のスプライトと同じ値を指定しています。
これによりカメラと飛行機が同じ位置になるようになります。
つまり、飛行機は画面上では動かないようになります。
コメントする
コメントするには、ログインする必要があります。
コメント一覧
> 背景画像のRect切り出し位置が 0.5,0.5,screenWidth-1,screenHeight-1 ですが
これは、スプライトが中途半端な位置に来た時に
反対側のピクセルが描画されることがあるため
この対処をおこなっています。
> また、座標に小数点以下を用いた場合のどのピクセルから含まれるのでしょうか…
0.5, 0.5ならば一番左上のピクセルの中心を表します。
> そして waitTime(0) に意味はありますか。とゆーかRPGなら0でも大丈夫なのでしょうか?
waitTimeが呼ばれた場合とりあえず1回のフレームが終わって次のフレームまで(33ms程度)
は少なくともスクリプトが実行されません。
ここでは、処理が軽くても多少重くても同じフレームレートで描画されます。
これはノベルゲームでも同じはずです。
これは、スプライトが中途半端な位置に来た時に
反対側のピクセルが描画されることがあるため
この対処をおこなっています。
> また、座標に小数点以下を用いた場合のどのピクセルから含まれるのでしょうか…
0.5, 0.5ならば一番左上のピクセルの中心を表します。
> そして waitTime(0) に意味はありますか。とゆーかRPGなら0でも大丈夫なのでしょうか?
waitTimeが呼ばれた場合とりあえず1回のフレームが終わって次のフレームまで(33ms程度)
は少なくともスクリプトが実行されません。
ここでは、処理が軽くても多少重くても同じフレームレートで描画されます。
これはノベルゲームでも同じはずです。
小数点は、配列のインデックス指定でも自動で切り捨てでしたし、整数じゃなくてもエラーにならないのは利点と言えるかも。
waitTimeは聞いておいて良かったです。
詳しい説明を有難うございました