ここを読む前にスプライトの項目を読んで置いてください。
(scrpts/05 - Sprite.lua)
01:SCREEN_BOTTOM = 0 02:SCREEN_TOP = 1 03:PALETTE_SHIP = 0 04:PALETTE_EXPL = 1 05: 06:BGTopText = Screen.LoadTextBG() 07:Screen.Initialize( SCREEN_TOP, BGTopText ) 08: 09:BGTopText:PrintXY( 0, 0, "Press any button to exit" ) 10: 11:Sprite.LoadPalette( SCREEN_BOTTOM, PALETTE_SHIP, "vaisseau.bmp.pal" ) 12:Sprite.LoadPalette( SCREEN_BOTTOM, PALETTE_EXPL, "explosion.bmp.pal" ) 13: 14:ShipFrames = FrameStrip.Create( SCREEN_BOTTOM, 32, 32, "256" ) 15: 16:ExplFrames = FrameStrip.Create( SCREEN_BOTTOM, 64, 64, "256" ) 17: 18:ShipFrames:LoadBin( "vaisseau.raw", 1 ) 19:ExplFrames:LoadBin( "explosion.raw", 7 ) 20: 21:nX = 29 22:nY = 13 23:nVX = 1 24:nVY = 1 25:nFrame = 0 26:nDelay = 0 27: 28:Expl = Sprite.Create( ExplFrames, 0, PALETTE_EXPL, 255-nX, nY ) 29:Ship = Sprite.Create( ShipFrames, 0, PALETTE_SHIP, nX, nY ) 30: 31: 32:while true do 33: Ship:MoveTo( nX, nY ) 34: Expl:MoveTo( 255-nX, nY ) 35: Expl:SetFrame( ExplFrames, nFrame ) 36: 37: nX = nX + nVX 38: if ( nX < 0 ) then 39: nX = -nX 40: nVX = -nVX 41: elseif ( nX > 255 ) then 42: nX = 255 - ( nX - 255 ) 43: nVX = -nVX 44: end 45: 46: nY = nY + nVY 47: if ( nY < 0 ) then 48: nY = -nY 49: nVY = -nVY 50: elseif ( nY > 171 ) then 51: nY = 171 - ( nY - 171 ) 52: nVY = -nVY 53: end 54: 55: nDelay = nDelay + 1 56: if ( nDelay >= 8 ) then 57: nDelay = 0 58: nFrame = nFrame + 1 59: if ( nFrame >= 7 ) then 60: nFrame = 0 61: end 62: end 63: 64: 65: if Pads.AnyKey() then 66: break 67: end 68: 69: Screen.WaitForVBL() 70:end 71: 72:Ship:Free() 73:Expl:Free() 74: 75:ShipFrames:FreeAll() 76:ShipFrames = nil 77:ExplFrames:FreeAll() 78:ExplFrames = nil
プログラムの解説
01:SCREEN_BOTTOM = 0 02:SCREEN_TOP = 1
いつもの上下スクリーン設定
03:PALETTE_SHIP = 0 04:PALETTE_EXPL = 1
戦闘機と爆発エフェクトのパレット番号
06:BGTopText = Screen.LoadTextBG() 07:Screen.Initialize( SCREEN_TOP, BGTopText )
上画面はテキストで初期化
09:BGTopText:PrintXY( 0, 0, "Press any button to exit" )
いずれかのボタンを押したら終了します
11:Sprite.LoadPalette( SCREEN_BOTTOM, PALETTE_SHIP, "vaisseau.bmp.pal" ) 12:Sprite.LoadPalette( SCREEN_BOTTOM, PALETTE_EXPL, "explosion.bmp.pal" )
上から順に戦闘機と爆発エフェクトのパレット読み込み
14:ShipFrames = FrameStrip.Create( SCREEN_BOTTOM, 32, 32, "256" )
16:ExplFrames = FrameStrip.Create( SCREEN_BOTTOM, 64, 64, "256" )
戦闘機と爆発エフェクトのフレーム設定
戦闘機は32×32のサイズ
爆発エフェクトは64×64のサイズ
18:ShipFrames:LoadBin( "vaisseau.raw", 1 ) 19:ExplFrames:LoadBin( "explosion.raw", 7 )
ここで実際にRAWファイルを読み込みます。
戦闘機はフレームが1つ
爆発エフェクトはフレームが7つです
21:nX = 29 22:nY = 13 23:nVX = 1 24:nVY = 1 25:nFrame = 0 26:nDelay = 0
各種変数の初期化処理
28:Expl = Sprite.Create( ExplFrames, 0, PALETTE_EXPL, 255-nX, nY ) 29:Ship = Sprite.Create( ShipFrames, 0, PALETTE_SHIP, nX, nY )
ここで画像を実際に表示しています。
32:while true do
無限ループの始まり。70行目まで
33: Ship:MoveTo( nX, nY )
戦闘機を動かしています
相対座標ではなく絶対座標なので注意
34: Expl:MoveTo( 255-nX, nY ) 35: Expl:SetFrame( ExplFrames, nFrame )
爆発エフェクトを動かしています。
また、フレームをひとつずつ動かして爆発しているように見せています。
(肝心のエフェクトは戦闘機とは関係ない位置をウロウロしていますが……ね)
37: nX = nX + nVX 38: if ( nX < 0 ) then 39: nX = -nX 40: nVX = -nVX 41: elseif ( nX > 255 ) then 42: nX = 255 - ( nX - 255 ) 43: nVX = -nVX 44: end
画面上を動かす処理
端っこに到達したら反射してまた戻ってきます
46: nY = nY + nVY 47: if ( nY < 0 ) then 48: nY = -nY 49: nVY = -nVY 50: elseif ( nY > 171 ) then 51: nY = 171 - ( nY - 171 ) 52: nVY = -nVY 53: end
画面上を動かす処理
こちらも同じですがY座標です
55: nDelay = nDelay + 1 56: if ( nDelay >= 8 ) then 57: nDelay = 0 58: nFrame = nFrame + 1
8回動かすごとにフレームを1つ動かします。
59: if ( nFrame >= 7 ) then 60: nFrame = 0 61: end
フレームが最後まで到達したらまた1からやり直し
62: end
56行目のIF
65: if Pads.AnyKey() then 66: break 67: end
今回はボタンを押したらどれでも終了します
69: Screen.WaitForVBL()
いつものFPS固定
70:end
32行目の無限ループの終わり
72:Ship:Free() 73:Expl:Free()
メモリの解放
75:ShipFrames:FreeAll() 76:ShipFrames = nil 77:ExplFrames:FreeAll() 78:ExplFrames = nil
フレームデータの方もメモリから解放しておきます
nilはnullみたいなもの