home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 January / VPR0101A.BIN / PROGRAM / Module1.bas < prev    next >
BASIC Source File  |  2000-10-24  |  9KB  |  357 lines

  1. Attribute VB_Name = "Module1"
  2. Option Explicit
  3.  
  4. 'ゲームエリアの定義
  5. Private Const FIELD_PX = 8       'ゲームエリアの位置
  6. Private Const FIELD_PY = 8       '  (X,Y)
  7. Private Const FIELD_SX = 480     'ゲームエリアの大きさ
  8. Private Const FIELD_SY = 304     '  (X,Y)
  9.  
  10. 'パドルのデータ
  11. Type TYPEPADL
  12.     px  As Integer              'パドルの座標
  13.     py  As Integer              '  (X,Y)
  14.     sx  As Integer              'パドルの大きさ
  15.     sy  As Integer              '  (X,Y)
  16. End Type
  17. Private paddle As TYPEPADL      'パドルのデータ
  18.  
  19. '干渉コード
  20. Private Const NO_INTERSECT = 0  '干渉していない
  21. Private Const OVER_BOTTOM = 1   '下が干渉
  22. Private Const OVER_TOP = 2      '上が干渉
  23. Private Const OVER_LEFT = 4     '左が干渉
  24. Private Const OVER_RIGHT = 8    '右が干渉
  25. Private Const OVER_INSIDE = 15  '包含
  26.  
  27. 'ボールのデータ
  28. Type TYPEBALL
  29.     px  As Integer              'ボールの座標
  30.     py  As Integer              '  (X,Y)
  31.     sx  As Integer              'ボールの大きさ
  32.     sy  As Integer              '  (X,Y)
  33.     vx  As Integer              '移動ベクター
  34.     vy  As Integer              '  (X,Y)
  35. End Type
  36. Private ball As TYPEBALL         'ボールのデータ
  37.  
  38. Public boPlaying As Boolean     'プレイ中を示すフラグ
  39.  
  40. 'Win32 API宣言
  41. Declare Function BitBlt Lib "gdi32" (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
  42.  
  43. Public Sub Main()
  44.     SetupForm1          'Form1をセットアップする
  45. End Sub
  46.  
  47. 'Form1をセットアップする
  48. Private Sub SetupForm1()
  49.     Load Form1          'フォームをロード
  50.  
  51.     SetupScreens        'スクリーンを初期化
  52.     SetupCombo1         '速度選択コンボを初期化
  53.  
  54.     GameInitialize      'ゲームを初期化する
  55.  
  56.     UpdateGameArea      'ゲームエリアを最新状態に更新
  57.  
  58.     Form1.Show          'フォームを表示
  59. End Sub
  60.  
  61. 'スクリーンを初期化する
  62. Private Sub SetupScreens()
  63.     'メインスクリーンを初期化する
  64.     With Form1.mainscr
  65.         .Left = FIELD_PX
  66.         .Top = FIELD_PY
  67.         .Width = FIELD_SX
  68.         .Height = FIELD_SY
  69.     End With
  70.  
  71.     'オフスクリーンを初期化する
  72.     With Form1.offscr
  73.         .Left = FIELD_PX
  74.         .Top = FIELD_PY
  75.         .Width = FIELD_SX
  76.         .Height = FIELD_SY
  77.         .BackColor = &HFFFFFF       '背景は白
  78.     End With
  79. End Sub
  80.  
  81. 'ゲームエリアを最新状態に更新する
  82. Private Sub UpdateGameArea()
  83.     DrawPaddle True     'パドルを描画
  84.     DrawBall True       'ボールを描画
  85.     
  86.     DrawGameArea        'ゲームエリアを描画
  87. End Sub
  88.  
  89. 'ゲームエリアを描画する
  90. Private Sub DrawGameArea()
  91.     Dim ret As Integer
  92.  
  93.     'オフスクリーンをメインスクリーンへ転送する
  94.     ret = BitBlt(Form1.mainscr.hDC, 0, 0, FIELD_SX, FIELD_SY, Form1.offscr.hDC, 0, 0, vbSrcCopy)
  95.     Form1.mainscr.Refresh
  96. End Sub
  97.  
  98. 'パドルを描画する
  99. Private Sub DrawPaddle(disp As Boolean)
  100.     Dim ret As Integer
  101.     Dim pos As Integer
  102.  
  103.     '表示か消去かでパターンを切り替える
  104.     pos = 0
  105.     If Not disp Then
  106.         pos = paddle.sy
  107.     End If
  108.  
  109.     'パドルをオフスクリーンへ転送する
  110.     ret = BitBlt(Form1.offscr.hDC, paddle.px, paddle.py, paddle.sx, paddle.sy, Form1.paddle.hDC, 0, pos, vbSrcCopy)
  111. End Sub
  112.  
  113. 'ボールを描画する
  114. Private Sub DrawBall(disp As Boolean)
  115.     Dim ret As Integer
  116.     Dim pos As Integer
  117.  
  118.     '表示か消去かでパターンを切り替える
  119.     pos = 0
  120.     If Not disp Then
  121.         pos = ball.sy
  122.     End If
  123.  
  124.     'ボールをオフスクリーンへ転送する
  125.     ret = BitBlt(Form1.offscr.hDC, ball.px, ball.py, ball.sx, ball.sy, Form1.ball.hDC, 0, pos, vbSrcCopy)
  126. End Sub
  127.  
  128. 'パドルを移動する
  129. Private Sub MovePaddle(mx As Integer)
  130.     Dim xmin As Integer
  131.     Dim xmax As Integer
  132.  
  133.     'パドルの移動可能範囲を求める
  134.     xmin = 0
  135.     xmax = FIELD_SX - paddle.sx
  136.  
  137.     'パドルの移動を制限する
  138.     If mx < xmin Then
  139.         mx = xmin
  140.     End If
  141.     If mx > xmax Then
  142.         mx = xmax
  143.     End If
  144.     
  145.     '古いパドルを消去する
  146.     DrawPaddle False
  147.     
  148.     If Not boPlaying Then
  149.         '古いボールを消去する
  150.         DrawBall False
  151.     End If
  152.     
  153.     '新しいパドル位置を計算する
  154.     paddle.px = mx
  155.  
  156.     If Not boPlaying Then
  157.         '新しいボール位置を計算する
  158.         ball.px = paddle.px + (paddle.sx - ball.sx) / 2
  159.     End If
  160.  
  161.     '表示を更新する
  162.     UpdateGameArea
  163. End Sub
  164.  
  165. 'ボールを移動する
  166. Private Sub MoveBall()
  167.     Dim refrect As Boolean
  168.     Dim action As Integer
  169.  
  170.     '古いボールを消去する
  171.     DrawBall False
  172.  
  173.     refrect = True
  174.     While (refrect)
  175.         refrect = False
  176.  
  177.         '新しいボール位置を計算する
  178.         ball.px = ball.px + ball.vx
  179.         ball.py = ball.py + ball.vy
  180.     
  181.         'ボールの壁干渉判定
  182.         action = TestBallWithWall
  183.         If (action > 0) Then
  184.             DoBallWithAny (action)
  185.             refrect = True
  186.         End If
  187.  
  188.         'ボールのパドル干渉判定
  189.         action = TestBallWithPaddle
  190.         If (action > 0) Then
  191.             DoBallWithAny (action)
  192.             refrect = True
  193.         End If
  194.     Wend
  195.  
  196.     '表示を更新する
  197.     UpdateGameArea
  198. End Sub
  199.  
  200. '速度選択コンボを初期化する
  201. Private Sub SetupCombo1()
  202.     With Form1.Combo1
  203.         .AddItem ("LOW")
  204.         .AddItem ("MID")
  205.         .AddItem ("HIGH")
  206.         .ListIndex = 0   '速度を、LOWに設定
  207.     End With
  208. End Sub
  209.  
  210. 'ゲームを初期化する
  211. Private Sub GameInitialize()
  212.     boPlaying = False   'プレイ中ではない
  213.  
  214.     StageInitialize     'ステージを初期化する
  215. End Sub
  216.  
  217. 'ステージを初期化する
  218. Private Sub StageInitialize()
  219.     SetupNextBall       '次のボールを用意する
  220. End Sub
  221.  
  222. '次のボールを用意する
  223. Private Sub SetupNextBall()
  224.     'パドルを初期化
  225.     With paddle
  226.         .sx = 40
  227.         .sy = 8
  228.         .px = 200
  229.         .py = 256
  230.     End With
  231.     
  232.     'ボールを初期化
  233.     With ball
  234.         .sx = 8
  235.         .sy = 8
  236.         .px = paddle.px + (paddle.sx - ball.sx) / 2
  237.         .py = paddle.py - ball.sy
  238.         .vx = 0
  239.         .vy = -5
  240.     End With
  241. End Sub
  242.  
  243. 'ボールの壁干渉判定
  244. Private Function TestBallWithWall()
  245.     Dim action As Integer
  246.     Dim X As Integer
  247.     Dim Y As Integer
  248.  
  249.     action = NO_INTERSECT
  250.     
  251.     '下チェック
  252.     Y = ball.py + ball.sy
  253.     If (Y >= FIELD_SY) Then
  254.         action = action Or OVER_BOTTOM
  255.     End If
  256.     
  257.     '上チェック
  258.     Y = ball.py
  259.     If (Y <= 0) Then
  260.         action = action Or OVER_TOP
  261.     End If
  262.     
  263.     '右チェック
  264.     X = ball.px + ball.sx
  265.     If (X >= FIELD_SX) Then
  266.         action = action Or OVER_RIGHT
  267.     End If
  268.     
  269.     '左チェック
  270.     X = ball.px
  271.     If (X <= 0) Then
  272.         action = action Or OVER_LEFT
  273.     End If
  274.  
  275.     TestBallWithWall = action
  276. End Function
  277.  
  278. 'ボールのパドル干渉判定
  279. Private Function TestBallWithPaddle()
  280.     Dim action As Integer
  281.  
  282.     action = NO_INTERSECT
  283.         
  284.     'ボールがパドルの範囲内かチェック
  285.     If (ball.px >= paddle.px) And (ball.px <= paddle.px + paddle.sx) Then
  286.         If (ball.vy > 0) Then
  287.             'パドルの上面で反射チェック
  288.             If (ball.py + ball.sy >= paddle.py) And (ball.py < paddle.py) Then
  289.                 action = action Or OVER_BOTTOM
  290.             End If
  291.         Else
  292.             'パドルの下面で反射チェック
  293.             If (ball.py <= paddle.py) And (ball.py + ball.sy > paddle.py) Then
  294.                 action = action Or OVER_TOP
  295.             End If
  296.         End If
  297.     End If
  298.  
  299.     TestBallWithPaddle = action
  300. End Function
  301.  
  302. 'ボールの反射処理
  303. Private Sub DoBallWithAny(action As Integer)
  304.     'ボールが上下ラインにかかったとき
  305.     If (action And OVER_TOP) Or (action And OVER_BOTTOM) Then
  306.         ' ボールの上下ベクターを反転
  307.         ball.vy = -ball.vy
  308.     End If
  309.  
  310.     'ボールが左右ラインにかかったとき
  311.     If (action And OVER_LEFT) Or (action And OVER_RIGHT) Then
  312.         ' ボールの左右ベクターを反転
  313.         ball.vx = -ball.vx
  314.     End If
  315. End Sub
  316.  
  317. '-----------------------------------------------------------------------
  318. ' インタフェース
  319. '-----------------------------------------------------------------------
  320.  
  321. 'インターバル処理
  322. Public Sub TimerProc()
  323.     'ボールを移動する
  324.     MoveBall
  325. End Sub
  326.  
  327. 'ステージ開始処理
  328. Public Sub StartStageProc()
  329.  
  330. End Sub
  331.  
  332. 'ステージクリア処理
  333. Public Sub ClearStageProc()
  334.  
  335. End Sub
  336.  
  337. 'ゲームオーバー処理
  338. Public Sub GameOverProc()
  339.  
  340. End Sub
  341.  
  342. 'ステージクリアかを調べる処理
  343. Public Function IsClearStage()
  344.     IsClearStage = False
  345. End Function
  346.  
  347. 'ゲームオーバーかを調べる処理
  348. Public Function IsGameOver()
  349.     IsGameOver = False
  350. End Function
  351.  
  352. 'マウス移動処理
  353. Public Sub MouseMoveProc(mx As Integer)
  354.     'パドルを移動
  355.     MovePaddle mx
  356. End Sub
  357.