05 - Sprite.lua

Last-modified: 2009-02-06 (金) 14:48:16

ここを読む前にスプライトの項目を読んで置いてください。


(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

フレームデータの方もメモリから解放しておきます
nilnullみたいなもの

 

コメント