スクリプト/SpriteCameraサンプルコード

最終投稿者:Zararu128x128 mini dycoon 更新:2011/09/20 19:47:27
以下のゲームでsetSpriteCameraPositionなどスプライト用カメラの関数を使ってみています。
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は
飛行機のスプライトと同じ値を指定しています。
これによりカメラと飛行機が同じ位置になるようになります。
つまり、飛行機は画面上では動かないようになります。

コメントする

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

コメント一覧

Nyan mini rurun9(投稿日:2011/09/20 19:47, 履歴)
なるほど、透明色で囲っていない場合でもたまに表示変な事があるんですね。
小数点は、配列のインデックス指定でも自動で切り捨てでしたし、整数じゃなくてもエラーにならないのは利点と言えるかも。
waitTimeは聞いておいて良かったです。
詳しい説明を有難うございました
Zararu128x128 mini dycoon(投稿日:2011/09/20 11:01, 履歴)
> 背景画像のRect切り出し位置が 0.5,0.5,screenWidth-1,screenHeight-1 ですが

これは、スプライトが中途半端な位置に来た時に
反対側のピクセルが描画されることがあるため
この対処をおこなっています。

> また、座標に小数点以下を用いた場合のどのピクセルから含まれるのでしょうか…

0.5, 0.5ならば一番左上のピクセルの中心を表します。

> そして waitTime(0) に意味はありますか。とゆーかRPGなら0でも大丈夫なのでしょうか?

waitTimeが呼ばれた場合とりあえず1回のフレームが終わって次のフレームまで(33ms程度)
は少なくともスクリプトが実行されません。
ここでは、処理が軽くても多少重くても同じフレームレートで描画されます。
これはノベルゲームでも同じはずです。
Nyan mini rurun9(投稿日:2011/09/19 22:51, 履歴)
重要ではない部分が気になるのですが

背景画像のRect切り出し位置が 0.5,0.5,screenWidth-1,screenHeight-1 ですが
これを 0,0,screenWidth,screenHeight にしていない理由がワカリマセン。
また、座標に小数点以下を用いた場合のどのピクセルから含まれるのでしょうか…

そして waitTime(0) に意味はありますか。とゆーかRPGなら0でも大丈夫なのでしょうか?