ここでは壁に当たる度に反射するボールを表示するプログラムの解説をします。
せっかく画面が2つあるので上下画面を行ったり来たりさせてみることにしました。
サンプルコードはこちらからダウンロードしてください。
(BoundBall.lua)
01:SCR_TOP = 1 02:SCR_BOT = 0 03: 04:BGTop8Bit = Screen.Load8BitBG() 05:BGBot8Bit = Screen.Load8BitBG() 06: 07:Screen.Initialize(SCR_TOP, BGTop8Bit) 08:Screen.Initialize(SCR_BOT, BGBot8Bit) 09: 10:Ball = 1 11:R=31;G=31;B=31 12: 13:BGTop8Bit:SetPaletteColor(Ball, R, G, B) 14: 15:BGBot8Bit:SetPaletteColor(Ball, R, G, B) 16: 17:XFLAG=true 18:YFLAG=true 19:SFLAG=true 20: 21:iNewX=0;iNewY=180 22: 23:while true do 24: 25: if XFLAG then 26: iNewX=iNewX+1 27: if iNewX>255 then 28: iNewX=iNewX-2 29: XFLAG=not(XFLAG) 30: end 31: else 32: iNewX=iNewX-1 33: if iNewX<0 then 34: iNewX=iNewX+2 35: XFLAG=not(XFLAG) 36: end 37: end 38: 39: if YFLAG then 40: iNewY=iNewY-1 41: if iNewY<0 and SFLAG then 42: iNewY=191 43: SFLAG=not(SFLAG) 44: elseif iNewY<0 and not(SFLAG) then 45: iNewY=iNewY+2 46: YFLAG=not(YFLAG) 47: end 48: else 49: iNewY=iNewY+1 50: if iNewY>191 and not(SFLAG) then 51: iNewY=0 52: SFLAG=not(SFLAG) 53: elseif iNewY>191 and SFLAG then 54: iNewY=iNewY-2 55: YFLAG=not(YFLAG) 56: end 57: end 58: 59: 60: 61: BGBot8Bit:Clear() 62: BGTop8Bit:Clear() 63: 64: if SFLAG then 65: BGBot8Bit:Plot(iNewX , iNewY , Ball) 66: BGBot8Bit:Plot(iNewX+1, iNewY , Ball) 67: BGBot8Bit:Plot(iNewX , iNewY+1, Ball) 68: BGBot8Bit:Plot(iNewX+1, iNewY+1, Ball) 69: else 70: BGTop8Bit:Plot(iNewX , iNewY , Ball) 71: BGTop8Bit:Plot(iNewX+1, iNewY , Ball) 72: BGTop8Bit:Plot(iNewX , iNewY+1, Ball) 73: BGTop8Bit:Plot(iNewX+1, iNewY+1, Ball) 74: end 75: 76: if Pads.Start() then 77: break 78: end 79: 80: Screen.WaitForVBL() 81:end
プログラムの解説
01:SCR_TOP = 1 02:SCR_BOT = 0
04:BGTop8Bit = Screen.Load8BitBG() 05:BGBot8Bit = Screen.Load8BitBG()
07:Screen.Initialize(SCR_TOP, BGTop8Bit) 08:Screen.Initialize(SCR_BOT, BGBot8Bit)
このあたりは毎度恒例の初期化処理です。
今回はスプライトを使わずに8ビット背景でPlot()を使うことにします
10:Ball = 1 11:R=31;G=31;B=31
ボールのパレット番号(1番)とRGBを指定(白)しています
13:BGTop8Bit:SetPaletteColor(Ball, R, G, B)
15:BGBot8Bit:SetPaletteColor(Ball, R, G, B)
上下画面でボール用のパレットを設定しています
17:XFLAG=true 18:YFLAG=true 19:SFLAG=true
それぞれのフラグです
XFLAGがtrueなら右向き
YFLAGがtrueなら上向き
SFLAGがtrueなら現在下画面に表示中です
21:iNewX=0;iNewY=180
ボールの初期位置です
23:while true do
81行目までの無限ループ
ボールのX座標の管理処理
25: if XFLAG then 26: iNewX=iNewX+1 27: if iNewX>255 then 28: iNewX=iNewX-2 29: XFLAG=not(XFLAG) 30: end
XFLAGがtrue(右向き)なら255を超えた時にfalse(左向き)にしています
31: else 32: iNewX=iNewX-1 33: if iNewX<0 then 34: iNewX=iNewX+2 35: XFLAG=not(XFLAG) 36: end 37: end
falseの時は0を下回った時に同じようにtrueに変更してやっています
Y座標の管理処理
39: if YFLAG then 40: iNewY=iNewY-1 41: if iNewY<0 and SFLAG then 42: iNewY=191 43: SFLAG=not(SFLAG)
YFLAGがtrue(上向き)かつSFLAGがtrue(現在下画面)の時に0を下回ったら上画面にもっていきます
44: elseif iNewY<0 and not(SFLAG) then 45: iNewY=iNewY+2 46: YFLAG=not(YFLAG) 47: end
YFLAGがtrueかつSFLAGがfalseの時に0を下回ったら、今度はボールを下向きに反射するようにします
48: else 49: iNewY=iNewY+1 50: if iNewY>191 and not(SFLAG) then 51: iNewY=0 52: SFLAG=not(SFLAG)
YFLAGがfalse(下向き)かつSFLAGがfalse(現在上画面)の時に191を越えたら下画面にもっていきます
53: elseif iNewY>191 and SFLAG then 54: iNewY=iNewY-2 55: YFLAG=not(YFLAG) 56: end 57: end
YFLAGがfalseかつSFLAGがtrueの時に191を越えたら、今度はボールを上向きに反射するようにします
61: BGBot8Bit:Clear() 62: BGTop8Bit:Clear()
スクリーンをクリアしています
64: if SFLAG then 65: BGBot8Bit:Plot(iNewX , iNewY , Ball) 66: BGBot8Bit:Plot(iNewX+1, iNewY , Ball) 67: BGBot8Bit:Plot(iNewX , iNewY+1, Ball) 68: BGBot8Bit:Plot(iNewX+1, iNewY+1, Ball) 69: else 70: BGTop8Bit:Plot(iNewX , iNewY , Ball) 71: BGTop8Bit:Plot(iNewX+1, iNewY , Ball) 72: BGTop8Bit:Plot(iNewX , iNewY+1, Ball) 73: BGTop8Bit:Plot(iNewX+1, iNewY+1, Ball) 74: end
SFLAGがtrueなら下画面に描画、falseなら上画面に描画しています
また、1ドットでは見づらいので少しずらした座標にも描画して4ドットのボールにしています
76: if Pads.Start() then 77: break 78: end
いつものSTARTボタンで処理終了
80: Screen.WaitForVBL()
いつものFPS固定
81:end
23行目から続く無限ループの終端