home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 February / VPR0102A.BIN / PROGRAM / Module1.bas < prev    next >
BASIC Source File  |  2000-11-18  |  21KB  |  748 lines

  1. Attribute VB_Name = "Module1"
  2. '---------------------------------------------------------
  3. ' ブロック消しゲーム
  4. ' All rights reserved. Copyright (c) Toshiya Moto, 2000.
  5. '---------------------------------------------------------
  6. Option Explicit
  7.  
  8. 'ブロックマップファイル数
  9. Private Const MAP_NUM = 3       '=ステージ数
  10.  
  11. 'ゲームエリアの定義
  12. Private Const FIELD_PX = 8      'ゲームエリアの位置
  13. Private Const FIELD_PY = 8      '  (X,Y)
  14. Private Const FIELD_SX = 480    'ゲームエリアの大きさ
  15. Private Const FIELD_SY = 304    '  (X,Y)
  16.  
  17. 'パドルのデータ
  18. Private Type TYPEPADL
  19.     px  As Integer              'パドルの座標
  20.     py  As Integer              '  (X,Y)
  21.     sx  As Integer              'パドルの大きさ
  22.     sy  As Integer              '  (X,Y)
  23. End Type
  24. Private paddle As TYPEPADL      'パドルのデータ
  25.  
  26. 'ボールのデータ
  27. Private Type TYPEBALL
  28.     px  As Integer              'ボールの座標
  29.     py  As Integer              '  (X,Y)
  30.     sx  As Integer              'ボールの大きさ
  31.     sy  As Integer              '  (X,Y)
  32.     vx  As Integer              '移動ベクター
  33.     vy  As Integer              '  (X,Y)
  34. End Type
  35. Private ball As TYPEBALL        'ボールのデータ
  36.  
  37. Private Const MV_VALUE = 5      'ボールの移動量
  38.  
  39. ' マップ上のブロックの数
  40. Private Const BLOCK_COL = 15    'ブロックの数
  41. Private Const BLOCK_ROW = 10    '  (X,Y)
  42.  
  43. ' ブロックのデータ
  44. Private Type TYPEBLOCK
  45.     px  As Integer              'ブロックの座標
  46.     py  As Integer              '  (X,Y)
  47.     sx  As Integer              'ブロックの大きさ
  48.     sy  As Integer              '  (X,Y)
  49.     broken As Boolean           '破壊されていたらTrue
  50.     score As Integer            '破壊時の得点
  51.     fontindex As Integer        'ブロックパターン
  52. End Type
  53. Private blocks(BLOCK_COL, BLOCK_ROW) As TYPEBLOCK
  54.                                 'ブロックのデータ配列
  55.  
  56. ' ゲームの制御のための変数
  57. Private nTotalBlock As Integer  'ブロックの総数
  58. Private nStage As Integer       'ステージ番号
  59. Private nBallNum As Integer     '持ちボール数
  60. Private nScore As Integer       'スコア
  61. Private nHighScore As Integer   'ハイスコア
  62. Private boLostBall As Boolean   'ミスしたらTrue
  63.  
  64. '干渉コード
  65. Private Const NO_INTERSECT = 0  '干渉していない
  66. Private Const OVER_BOTTOM = 1   '下が干渉
  67. Private Const OVER_TOP = 2      '上が干渉
  68. Private Const OVER_LEFT = 4     '左が干渉
  69. Private Const OVER_RIGHT = 8    '右が干渉
  70. Private Const COMP_INSIDE = 15  '包含
  71.  
  72. '頂点包含コード
  73. Private Const VTX_NONE = 0      '包含なし
  74. Private Const VTX_LT = 1        '1点包含
  75. Private Const VTX_RT = 2
  76. Private Const VTX_LB = 4
  77. Private Const VTX_RB = 8
  78. Private Const VTX_LEFT = 5      '2点包含
  79. Private Const VTX_TOP = 3
  80. Private Const VTX_RIGHT = 10
  81. Private Const VTX_BOTTOM = 12
  82. Private Const VTX_ALL = 15      '4点包含
  83.  
  84. Public boPlaying As Boolean     'プレイ中を示すフラグ
  85.  
  86. 'Win32 API宣言
  87. Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  88. Private Declare Function PlaySound Lib "winmm.dll" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
  89.  
  90. Public Sub Main()
  91.     SetupForm1          'Form1をセットアップする
  92. End Sub
  93.  
  94. 'Form1をセットアップする
  95. Private Sub SetupForm1()
  96.     Load Form1          'フォームをロード
  97.  
  98.     SetupScreens        'スクリーンを初期化
  99.     SetupCombo1         '速度選択コンボを初期化
  100.  
  101.     nHighScore = 0      'ハイスコアをクリア
  102.     Form1.lblhiscore.Caption = Format(nHighScore, "00000")
  103.  
  104.     GameInitialize      'ゲームを初期化する
  105.  
  106.     UpdateGameArea      'ゲームエリアを最新状態に更新
  107.  
  108.     Form1.Show          'フォームを表示
  109. End Sub
  110.  
  111. 'スクリーンを初期化する
  112. Private Sub SetupScreens()
  113.     'メインスクリーンを初期化する
  114.     With Form1.mainscr
  115.         .Left = FIELD_PX
  116.         .Top = FIELD_PY
  117.         .Width = FIELD_SX
  118.         .Height = FIELD_SY
  119.     End With
  120.  
  121.     'オフスクリーンを初期化する
  122.     With Form1.offscr
  123.         .Left = FIELD_PX
  124.         .Top = FIELD_PY
  125.         .Width = FIELD_SX
  126.         .Height = FIELD_SY
  127.         .BackColor = &HFFFFFF       '背景は白
  128.     End With
  129. End Sub
  130.  
  131. 'ゲームエリアを最新状態に更新する
  132. Private Sub UpdateGameArea()
  133.     DrawPaddle True     'パドルを描画
  134.     DrawBall True       'ボールを描画
  135.     
  136.     DrawGameArea        'ゲームエリアを描画
  137. End Sub
  138.  
  139. 'ゲームエリアを描画する
  140. Private Sub DrawGameArea()
  141.     Dim ret As Integer
  142.  
  143.     'オフスクリーンをメインスクリーンへ転送する
  144.     ret = BitBlt(Form1.mainscr.hDC, 0, 0, FIELD_SX, FIELD_SY, Form1.offscr.hDC, 0, 0, vbSrcCopy)
  145.     Form1.mainscr.Refresh
  146. End Sub
  147.  
  148. 'パドルを描画する
  149. Private Sub DrawPaddle(disp As Boolean)
  150.     Dim ret As Integer
  151.     Dim pos As Integer
  152.  
  153.     '表示か消去かでパターンを切り替える
  154.     pos = 0
  155.     If Not disp Then
  156.         pos = paddle.sy
  157.     End If
  158.  
  159.     'パドルをオフスクリーンへ転送する
  160.     With paddle
  161.         ret = BitBlt(Form1.offscr.hDC, .px, .py, .sx, .sy, Form1.paddle.hDC, 0, pos, vbSrcCopy)
  162.     End With
  163. End Sub
  164.  
  165. 'ボールを描画する
  166. Private Sub DrawBall(disp As Boolean)
  167.     Dim ret As Integer
  168.     Dim pos As Integer
  169.  
  170.     '表示か消去かでパターンを切り替える
  171.     pos = 0
  172.     If Not disp Then
  173.         pos = ball.sy
  174.     End If
  175.  
  176.     'ボールをオフスクリーンへ転送する
  177.     With ball
  178.         ret = BitBlt(Form1.offscr.hDC, .px, .py, .sx, .sy, Form1.ball.hDC, 0, pos, vbSrcCopy)
  179.     End With
  180. End Sub
  181.  
  182. 'ブロックを描画する
  183. Private Sub DrawBlock(col As Integer, row As Integer)
  184.     Dim ret As Integer
  185.     Dim pos As Integer
  186.     
  187.     With blocks(col, row)
  188.         If .broken Then     'ブロックが破壊されていたら
  189.             pos = 8 * 16    '消去パターンにする
  190.         Else
  191.             pos = .fontindex * 16
  192.         End If
  193.     
  194.         'ボールをオフスクリーンへ転送する
  195.         ret = BitBlt(Form1.offscr.hDC, .px, .py, .sx, .sy, Form1.blocks.hDC, 0, pos, vbSrcCopy)
  196.     End With
  197. End Sub
  198.  
  199. '全ブロックを描画する
  200. Private Sub DrawAllBlocks()
  201.     Dim i As Integer
  202.     Dim j As Integer
  203.     
  204.     'オフスクリーンを背景色で消去する
  205.     With Form1.offscr
  206.         .FillColor = vbWhite
  207.         .FillStyle = vbFSSolid
  208.         Form1.offscr.Line (-1, -1)-(.Width, .Height), , B
  209.     End With
  210.     
  211.     '全部のブロックを順次描画する
  212.     For j = 0 To BLOCK_ROW - 1
  213.         For i = 0 To BLOCK_COL - 1
  214.             DrawBlock i, j
  215.         Next i
  216.     Next j
  217. End Sub
  218.  
  219. 'パドルを移動する
  220. Private Sub MovePaddle(mx As Integer)
  221.     Dim xmin As Integer
  222.     Dim xmax As Integer
  223.  
  224.     'パドルの移動可能範囲を求める
  225.     xmin = 0
  226.     xmax = FIELD_SX - paddle.sx
  227.  
  228.     'パドルの移動を制限する
  229.     If mx < xmin Then
  230.         mx = xmin
  231.     End If
  232.     If mx > xmax Then
  233.         mx = xmax
  234.     End If
  235.     
  236.     '古いパドルを消去する
  237.     DrawPaddle False
  238.     
  239.     If Not boPlaying Then
  240.         '古いボールを消去する
  241.         DrawBall False
  242.     End If
  243.     
  244.     '新しいパドル位置を計算する
  245.     paddle.px = mx
  246.  
  247.     If Not boPlaying Then
  248.         '新しいボール位置を計算する
  249.         ball.px = paddle.px + (paddle.sx - ball.sx) / 2
  250.     End If
  251.  
  252.     '表示を更新する
  253.     UpdateGameArea
  254. End Sub
  255.  
  256. 'ボールを移動する
  257. Private Sub MoveBall()
  258.     Dim refrect As Boolean
  259.     Dim action As Integer
  260.     Dim ret As Long
  261.  
  262.     '古いボールを消去する
  263.     DrawBall False
  264.  
  265.     refrect = True
  266.     While (refrect)
  267.         refrect = False
  268.  
  269.         '新しいボール位置を計算する
  270.         ball.px = ball.px + ball.vx
  271.         ball.py = ball.py + ball.vy
  272.     
  273.         'ボールの壁干渉判定
  274.         action = TestBallWithWall
  275.         If (action = NO_INTERSECT) Then
  276.             'ボールのパドル干渉判定
  277.             action = TestBallWithPaddle
  278.             If (action = NO_INTERSECT) Then
  279.                 'ボールのブロック干渉判定
  280.                 action = TestBallWithAllBlocks
  281.                 If (action <> NO_INTERSECT) Then
  282.                     'ボールが壁と干渉していたら反射処理
  283.                     DoBallWithAny (action)
  284.                     refrect = True
  285.                     '反射音
  286.                     ret = PlaySound("Se_l043.wav", 0&, &H20001)
  287.                 End If
  288.             Else
  289.                 'パドルに当たった位置で反射角度変更
  290.                 ChangeRefAngle
  291.                 refrect = True
  292.                 '反射音
  293.                 ret = PlaySound("Se_l044.wav", 0&, &H20001)
  294.             End If
  295.         Else
  296.             'ボールが壁と干渉していたら反射処理
  297.             DoBallWithAny (action)
  298.             refrect = True
  299.             If (boLostBall) Then
  300.                 'ミス音
  301.                 ret = PlaySound("Se_l047.wav", 0&, &H20001)
  302.             Else
  303.                 '反射音
  304.                 ret = PlaySound("Se_l044.wav", 0&, &H20001)
  305.             End If
  306.         End If
  307.     Wend
  308.  
  309.     '表示を更新する
  310.     UpdateGameArea
  311. End Sub
  312.  
  313. '速度選択コンボを初期化する
  314. Private Sub SetupCombo1()
  315.     With Form1.Combo1
  316.         .AddItem ("LOW")
  317.         .AddItem ("MID")
  318.         .AddItem ("HIGH")
  319.         .ListIndex = 0   '速度を、LOWに設定
  320.     End With
  321. End Sub
  322.  
  323. 'ゲームを初期化する
  324. Private Sub GameInitialize()
  325.     boPlaying = False   'プレイ中ではない
  326.  
  327.     'ゲーム情報の初期化
  328.     nStage = 0          'ステージ#0から開始
  329.     Form1.lblstage.Caption = Format(nStage + 1, "00")
  330.     StageInitialize     'ステージを初期化する
  331.     nScore = 0          '得点をクリア
  332.     Form1.lblscore.Caption = Format(nScore, "0000")
  333.     
  334.     '全ブロックを描画する
  335.     DrawAllBlocks
  336. End Sub
  337.  
  338. 'ステージを初期化する
  339. Private Sub StageInitialize()
  340.     Dim i As Integer
  341.     Dim j As Integer
  342.  
  343.     'マップデータの初期化
  344.     nTotalBlock = 0     '総ブロック数をクリア
  345.     LoadBlockMap nStage 'ブロックマップファイルをロード
  346.       
  347.     SetupNextBall       '次のボールを用意する
  348.     
  349.     'ゲーム制御情報の初期化
  350.     nBallNum = 3        '持ちボール数をセット
  351.     Form1.lblball.Caption = Format(nBallNum, "0")
  352. End Sub
  353.  
  354. '次のボールを用意する
  355. Private Sub SetupNextBall()
  356.     'パドルを初期化
  357.     With paddle
  358.         .sx = 40
  359.         .sy = 8
  360.         .px = 200
  361.         .py = 256
  362.     End With
  363.     
  364.     'ボールを初期化
  365.     With ball
  366.         .sx = 8
  367.         .sy = 8
  368.         .px = paddle.px + (paddle.sx - ball.sx) / 2
  369.         .py = paddle.py - ball.sy
  370.         .vx = MV_VALUE
  371.         .vy = -MV_VALUE
  372.     End With
  373.     
  374.     'ボールのミスをリセット
  375.     boLostBall = False
  376. End Sub
  377.  
  378. 'ボールの壁干渉判定
  379. Private Function TestBallWithWall() As Integer
  380.     Dim action As Integer
  381.     Dim X As Integer
  382.     Dim Y As Integer
  383.  
  384.     action = NO_INTERSECT
  385.     
  386.     '下チェック
  387.     Y = ball.py + ball.sy
  388.     If (Y >= FIELD_SY) Then
  389.         action = action Or OVER_BOTTOM
  390.         boLostBall = True   'ミス
  391.     End If
  392.     
  393.     '上チェック
  394.     Y = ball.py
  395.     If (Y <= 0) Then
  396.         action = action Or OVER_TOP
  397.     End If
  398.     
  399.     '右チェック
  400.     X = ball.px + ball.sx
  401.     If (X >= FIELD_SX) Then
  402.         action = action Or OVER_RIGHT
  403.     End If
  404.     
  405.     '左チェック
  406.     X = ball.px
  407.     If (X <= 0) Then
  408.         action = action Or OVER_LEFT
  409.     End If
  410.  
  411.     TestBallWithWall = action
  412. End Function
  413.  
  414. 'ボールのパドル干渉判定
  415. Private Function TestBallWithPaddle() As Integer
  416.     Dim action As Integer
  417.  
  418.     action = NO_INTERSECT
  419.         
  420.     'ボールがパドルの範囲内かチェック
  421.     If (ball.px >= paddle.px) And (ball.px <= paddle.px + paddle.sx) Then
  422.         If (ball.vy > 0) Then
  423.             'パドルの上面で反射チェック
  424.             If (ball.py + ball.sy >= paddle.py) And (ball.py < paddle.py) Then
  425.                 action = action Or OVER_BOTTOM
  426.             End If
  427.         Else
  428.             'パドルの下面で反射チェック
  429.             If (ball.py <= paddle.py) And (ball.py + ball.sy > paddle.py) Then
  430.                 action = action Or OVER_TOP
  431.             End If
  432.         End If
  433.     End If
  434.  
  435.     TestBallWithPaddle = action
  436. End Function
  437.  
  438. 'ボールがパドルのどの位置にあるかで反射角度を変える
  439. Private Sub ChangeRefAngle()
  440.     Dim org As Single
  441.     Dim span As Single
  442.     Dim bx As Single
  443.     
  444.     org = paddle.px
  445.     bx = ball.px + (ball.sx / 2)
  446.     span = paddle.sx / 10
  447.     If (bx < org + span * 2) Then
  448.         ball.vx = -MV_VALUE
  449.         ball.vy = -(MV_VALUE / 2 + 1)
  450.     Else
  451.         If (bx < org + span * 4) Then
  452.             ball.vx = -MV_VALUE
  453.             ball.vy = -MV_VALUE
  454.         Else
  455.             If (bx < org + span * 5) Then
  456.                 ball.vx = -(MV_VALUE / 2 + 1)
  457.                 ball.vy = -MV_VALUE
  458.             Else
  459.                 If (bx < org + span * 6) Then
  460.                     ball.vx = (MV_VALUE / 2 + 1)
  461.                     ball.vy = -MV_VALUE
  462.                 Else
  463.                     If (bx < org + span * 8) Then
  464.                         ball.vx = MV_VALUE
  465.                         ball.vy = -MV_VALUE
  466.                     Else
  467.                         ball.vx = MV_VALUE
  468.                         ball.vy = -(MV_VALUE / 2 + 1)
  469.                     End If
  470.                 End If
  471.             End If
  472.         End If
  473.     End If
  474.     
  475. End Sub
  476.  
  477. '点がブロック内かを判定
  478. Private Function IsPtInBlock(blk As TYPEBLOCK, tx As Integer, ty As Integer) As Boolean
  479.     IsPtInBlock = False
  480.     With blk
  481.         If (.px <= tx) And (.py <= ty) And (tx <= .px + .sx) And (ty <= .py + .sy) Then
  482.             IsPtInBlock = True
  483.         End If
  484.     End With
  485. End Function
  486.  
  487. 'ボールのどの頂点がブロック内に包含しているか調べる
  488. Private Function TestVertex(blk As TYPEBLOCK) As Integer
  489.     TestVertex = VTX_NONE
  490.     
  491.     With ball
  492.         '左上点の包含
  493.         If IsPtInBlock(blk, .px, .py) Then
  494.             TestVertex = TestVertex Or VTX_LT
  495.         End If
  496.         
  497.         '左下点の包含
  498.         If IsPtInBlock(blk, .px, .py + .sy - 1) Then
  499.             TestVertex = TestVertex Or VTX_LB
  500.         End If
  501.         
  502.         '右上点の包含
  503.         If IsPtInBlock(blk, .px + .sx - 1, .py) Then
  504.             TestVertex = TestVertex Or VTX_RT
  505.         End If
  506.         
  507.         '右下点の包含
  508.         If IsPtInBlock(blk, .px + .sx - 1, .py + .sy - 1) Then
  509.             TestVertex = TestVertex Or VTX_RB
  510.         End If
  511.     End With
  512. End Function
  513.  
  514. 'ボールのブロック干渉判定
  515. Private Function TestBallWithBlock(blk As TYPEBLOCK) As Integer
  516.     Dim vertex As Integer
  517.     Dim action As Integer
  518.     
  519.     action = NO_INTERSECT
  520.     
  521.     With blk
  522.         'ブロックが破壊されていたら処理しない
  523.         If .broken Then
  524.             Exit Function
  525.         End If
  526.         
  527.         'ボールのどの頂点がブロックに包含されているかテスト
  528.         vertex = TestVertex(blk)
  529.         Select Case vertex
  530.             Case VTX_LEFT:
  531.                 action = OVER_LEFT
  532.             Case VTX_TOP:
  533.                 action = OVER_TOP
  534.             Case VTX_RIGHT:
  535.                 action = OVER_RIGHT
  536.             Case VTX_BOTTOM:
  537.                 action = OVER_BOTTOM
  538.             Case VTX_LT:
  539.                 action = COMP_INSIDE
  540.             Case VTX_RT:
  541.                 action = COMP_INSIDE
  542.             Case VTX_LB:
  543.                 action = COMP_INSIDE
  544.             Case VTX_RB:
  545.                 action = COMP_INSIDE
  546.             Case VTX_ALL:
  547.                 action = COMP_INSIDE
  548.             Case Else
  549.                 action = NO_INTERSECT
  550.         End Select
  551.     End With
  552.     
  553.     TestBallWithBlock = action
  554. End Function
  555.  
  556. 'ボールの全ブロック干渉処理
  557. Private Function TestBallWithAllBlocks() As Integer
  558.     Dim action As Integer
  559.     Dim i As Integer
  560.     Dim j As Integer
  561.     
  562.     action = NO_INTERSECT
  563.  
  564.     For j = 0 To BLOCK_ROW - 1
  565.         For i = 0 To BLOCK_COL - 1
  566.             action = TestBallWithBlock(blocks(i, j))
  567.             If (action <> NO_INTERSECT) Then
  568.                 '干渉したブロックを消去
  569.                 blocks(i, j).broken = True      '破壊サイン
  570.                 nTotalBlock = nTotalBlock - 1   '総ブロック数
  571.                 DrawBlock i, j
  572.                 '得点を加算
  573.                 nScore = nScore + blocks(i, j).score
  574.                 Form1.lblscore.Caption = Format(nScore, "0000")
  575.                 Exit For
  576.             End If
  577.         Next i
  578.         If (action <> NO_INTERSECT) Then
  579.             Exit For
  580.         End If
  581.     Next j
  582.  
  583.     TestBallWithAllBlocks = action
  584. End Function
  585.  
  586. 'ボールの反射処理
  587. Private Sub DoBallWithAny(action As Integer)
  588.     'ボールが上下ラインにかかったとき
  589.     If (action And OVER_TOP) Or (action And OVER_BOTTOM) Then
  590.         ' ボールの上下ベクターを反転
  591.         ball.vy = -ball.vy
  592.     End If
  593.  
  594.     'ボールが左右ラインにかかったとき
  595.     If (action And OVER_LEFT) Or (action And OVER_RIGHT) Then
  596.         ' ボールの左右ベクターを反転
  597.         ball.vx = -ball.vx
  598.     End If
  599. End Sub
  600.  
  601. 'マップの行をブロックデータに設定する
  602. Private Sub SetMapLine(row As Integer, mline As String)
  603.     Dim col As Integer
  604.     Dim mapchar As String
  605.     
  606.     For col = 0 To BLOCK_COL - 1
  607.         '1ブロックのデータを設定する
  608.         mapchar = Mid(mline, col + 1, 1)
  609.         With blocks(col, row)
  610.             .sx = 32
  611.             .sy = 16
  612.             .px = col * .sx
  613.             .py = row * .sy
  614.             If mapchar = "-" Then
  615.                 .broken = True  '最初から破壊されている
  616.                 .score = 0
  617.                 .fontindex = 8
  618.             Else
  619.                 .broken = False
  620.                 .score = BLOCK_ROW + 1 - row
  621.                 .fontindex = CInt(mapchar)
  622.                 nTotalBlock = nTotalBlock + 1
  623.             End If
  624.         End With
  625.     Next col
  626. End Sub
  627.  
  628. 'ブロックマップファイルを読みこむ
  629. Private Sub LoadBlockMap(mapno As Integer)
  630.     Dim fs As Object
  631.     Dim mapfile As Object
  632.     Dim mapname As String
  633.     Dim buff As String
  634.     Dim row As Integer
  635.     
  636.     'ファイルを開く
  637.     mapname = "Map" + CStr(mapno) + ".txt"
  638.     Set fs = CreateObject("Scripting.FileSystemObject")
  639.     Set mapfile = fs.OpenTextFile(mapname)
  640.     
  641.     'マップファイルを1行づつ読む
  642.     row = 0
  643.     Do Until mapfile.AtEndOfStream
  644.         buff = mapfile.ReadLine
  645.         
  646.         '読み込んだ1行をマップデータへ変換
  647.         SetMapLine row, buff
  648.         row = row + 1
  649.     Loop
  650.     
  651.     'ファイルを閉じる
  652.     mapfile.Close
  653.     Set fs = Nothing
  654.     Set mapfile = Nothing
  655. End Sub
  656.  
  657. 'メッセージウィンドウを表示する
  658. Private Sub DispMsg(msgstr As String)
  659.     'フォームの操作を禁止する
  660.     Form1.Enabled = False
  661.  
  662.     'ダイアログを表示する
  663.     Load Dialog         'ダイアログをロード
  664.     Dialog.Label1.Caption = msgstr
  665.     Dialog.Show         'ダイアログを表示
  666. End Sub
  667.  
  668. '-----------------------------------------------------------------------
  669. ' インタフェース
  670. '-----------------------------------------------------------------------
  671.  
  672. 'インターバル処理
  673. Public Sub TimerProc()
  674.     'ボールを移動する
  675.     MoveBall
  676. End Sub
  677.  
  678. 'ステージ開始処理
  679. Public Sub StartStageProc()
  680.  
  681. End Sub
  682.  
  683. 'ステージクリア処理
  684. Public Sub ClearStageProc()
  685.     '次のステージへ進む
  686.     nStage = nStage + 1
  687.     If (nStage < MAP_NUM) Then
  688.         DispMsg "ステージをクリアしました."
  689.         
  690.         '次のステージの準備
  691.         StageInitialize     'ステージを初期化する
  692.     Else
  693.         DispMsg "ゲームをクリアしました!!"
  694.         
  695.         'ハイスコアを更新
  696.         If (nScore > nHighScore) Then
  697.             nHighScore = nScore
  698.             Form1.lblhiscore.Caption = Format(nHighScore, "00000")
  699.         End If
  700.         
  701.         GameInitialize      'ゲームを初期化する
  702.     End If
  703.     Form1.lblstage.Caption = Format(nStage + 1, "00")
  704.  
  705.     DrawAllBlocks       '全ブロックを描画する
  706.     UpdateGameArea      'ゲームエリアを最新状態に更新
  707. End Sub
  708.  
  709. 'ゲームオーバー処理
  710. Public Sub GameOverProc()
  711.     'ボール数を減らす
  712.     nBallNum = nBallNum - 1
  713.     Form1.lblball.Caption = Format(nBallNum, "0")
  714.     If (nBallNum > 0) Then
  715.         DispMsg "ミスしちゃいました."
  716.         SetupNextBall       '次のボールを用意する
  717.     Else
  718.         DispMsg "ゲームオーバーです."
  719.                 
  720.         'ハイスコアを更新
  721.         If (nScore > nHighScore) Then
  722.             nHighScore = nScore
  723.             Form1.lblhiscore.Caption = Format(nHighScore, "00000")
  724.         End If
  725.         
  726.         GameInitialize      'ゲームを初期化する
  727.     End If
  728.     
  729.     DrawAllBlocks       '全ブロックを描画する
  730.     UpdateGameArea      'ゲームエリアを最新状態に更新
  731. End Sub
  732.  
  733. 'ステージクリアかを調べる処理
  734. Public Function IsClearStage() As Boolean
  735.     IsClearStage = (nTotalBlock = 0)
  736. End Function
  737.  
  738. 'ゲームオーバーかを調べる処理
  739. Public Function IsGameOver() As Boolean
  740.     IsGameOver = boLostBall
  741. End Function
  742.  
  743. 'マウス移動処理
  744. Public Sub MouseMoveProc(mx As Integer)
  745.     'パドルを移動
  746.     MovePaddle mx
  747. End Sub
  748.