反射するボール

Last-modified: 2009-02-06 (金) 19:17:31

ここでは壁に当たる度に反射するボールを表示するプログラムの解説をします。
せっかく画面が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行目から続く無限ループの終端

 

コメント