スクリプト/SpriteCameraサンプルコード
最終投稿者: 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は聞いておいて良かったです。
詳しい説明を有難うございました