[広告]
 ★Sheet1(ゲーム)のマクロ「prcEnemyMove」
Sub prcEnemyMove ()

    'エクセルスマイル★シューティングゲームを作ろう
    '処理概要:敵の制御を行う
    '記述場所:ワークシート「ゲーム」

    Dim i As Long
    Dim blnWalk As Boolean
    Dim blnAttack As Boolean

    '待機飛行を行う時間になっているかを判定
    If GetTickCount() - lngEnemyAttackB > lngEnemyAttackS Then
       blnWalk = True '経過した
       lngEnemyAttackB = GetTickCount()
    Else
       blnWalk = False 'まだ
    End If

    '攻撃飛行を行う時間になっているかを判定
    If GetTickCount() - lngEnemyWalkB > lngEnemyWalkS Then
       blnAttack = True '経過した
       lngEnemyWalkB = GetTickCount()
    Else
       blnAttack = False 'まだ
    End If

    For i = 1 To 5

        '攻撃飛行処理の呼び出し
        'ただし、一定時間が経過している場合のみ
        If blnWalk = True Then
           GoSub EnemyAttack
        End If

        '待機飛行処理の呼び出し
        'ただし、一定時間が経過している場合のみ
        If blnAttack = True Then
           GoSub EnemyWalk
        End If

        '(@)撃墜状態処理の呼び出し
        If lngEnemySt(i) = cstEnemyHit Then
           GoSub EnemyHit
        End If

    Next

    'ステージクリアの判定
    '撃墜した敵の数(撃墜状態の敵の数)が5匹になったらステージクリア成立
    If lngEnemyCount = 5 Then
       lngGameStatus = cstStageClear
    End If

    Exit Sub

'-------------------------------------------------------
EnemyWalk: '待機飛行処理
'-------------------------------------------------------

    '敵が待機飛行のとき
    If lngEnemySt(i) = cstEnemyWalk Then
       '敵を表示
       rngEnemyWalk(lngEnemyPtn(i)).Copy _
           Destination:=Range(Cells(lngEnemyY(i), lngEnemyX(i)), _
                              Cells(lngEnemyY(i) + 7, lngEnemyX(i) + 15))
        

       '(A)ビーム砲が発射されているときは
       '敵とビーム砲が衝突チェック処理を呼び出す
       If blnBeamF = True Then
          Call fncBeamHitCheck(lngEnemyX(i), lngEnemyY(i), i)
       End If

    End If

    '敵の移動とパターンの切り替え (@)
    '待機飛行中と攻撃飛行中の場合のみ行う
    If lngEnemySt(i) = cstEnemyWalk Or _
       lngEnemySt(i) = cstEnemyAttack Then

       '敵を左へ移動する
       lngEnemyX(i) = lngEnemyX(i) - 1

       'rangeの指定でマイナスなどを指定すると400のエラーが出る
       '右端まで達したら、左端へ移動
       If lngEnemyX(i) < 1 Then
          rngClear16.Copy _
              Destination:=Range(Cells(lngEnemyY(i), 1), _
                                 Cells(lngEnemyY(i) + 7, 16))
          lngEnemyX(i) = 130
       End If

       'パターン番号の切り替え
       '4以上になったら1から
       lngEnemyPtn(i) = lngEnemyPtn(i) + 1
       If lngEnemyPtn(i) > 4 Then
          lngEnemyPtn(i) = 1
       End If

    End If

    Return

'-------------------------------------------------------
EnemyAttack: '攻撃飛行処理
'-------------------------------------------------------

    '攻撃飛行に移る判定1「通常」
    '攻撃飛行中の敵がナシ、Rndの結果が5以下、
    '自機が爆発していないなら攻撃飛行へ移る
    '攻撃飛行の開始位置は待機飛行中の位置
    '横移動の方向は最初は0(横移動ナシ)
    If blnEnemyAttackSt = False And Int(Rnd * 1000) < 5 And _
       blnMyShipLock = False And _
       lngEnemySt(i) = cstEnemyWalk Then
       lngEnemySt(i) = cstEnemyAttack '攻撃飛行中
       blnEnemyAttackSt = True        '攻撃飛行中あり
       lngEnemyAttackX = lngEnemyX(i) '攻撃飛行開始横位置設定
       lngEnemyAttackY = lngEnemyY(i) '攻撃飛行開始縦位置設定
       lngEnemyAttackDir = 0 '横の移動方向 この値を移行中の横位置へ加算
    End If

    'D攻撃飛行に移る判定2「残り1匹」
    '自機が爆発していない、かつ
    '敵の数が残り1匹なら常に攻撃飛行をする
    If blnEnemyAttackSt = False And _
       lngEnemyCount = 4 And _
       blnMyShipLock = False And _
       lngEnemySt(i) = cstEnemyWalk Then
       lngEnemySt(i) = cstEnemyAttack '攻撃飛行中
       blnEnemyAttackSt = True        '攻撃飛行中あり
       lngEnemyAttackX = lngEnemyX(i) '攻撃飛行開始横位置設定
       lngEnemyAttackY = lngEnemyY(i) '攻撃飛行開始縦位置設定
       lngEnemyAttackDir = 0 '横の移動方向 この値を移行中の横位置へ加算
    End If

    '攻撃飛行処理
    If lngEnemySt(i) = cstEnemyAttack Then
       '攻撃飛行の敵を表示
       rngEnemyAttack.Copy _
           Destination:=Range(Cells(lngEnemyAttackY, lngEnemyAttackX), _
                              Cells(lngEnemyAttackY + 7, lngEnemyAttackX + 15))

       '25%の確立で横移動方向を変化
       If Int(Rnd * 100) < 25 Then
          '-1 , 0, 1の結果が得られる
          lngEnemyAttackDir = Int(Rnd * 3) - 1
       End If

       '糞攻撃の実行を決定
       '条件1:糞攻撃をしていない
       '条件2:7%未満
       '条件3:攻撃飛行中の敵の高さが120未満
       If blnFunAttack = And _
           < 7 And _
          lngEnemyAttackY < Then

          '攻撃飛行中ON
          blnFunAttack =

          '糞の状態は落下中
          lngFunSt = cstFunAttack

          '糞の初期位置
          lngFunX = +
          lngFunY = +

          '糞の横移動方向
          lngFunDirect = lngEnemyAttackDir

          '移動速度関連(前回処理時刻)
          lngFunB = GetTickCount()

       End If

       '縦位置へ1加算(下へ移動)
       lngEnemyAttackY = lngEnemyAttackY + 1

       '縦位置が143を超えたら最下段到達
       '攻撃飛行を終了し待機飛行へ戻る
       If lngEnemyAttackY > 143 Then
          rngClear16.Copy _
              Destination:=Range(Cells(143, lngEnemyAttackX), _
                                 Cells(150, lngEnemyAttackX + 15))
          lngEnemySt(i) = cstEnemyWalk
          blnEnemyAttackSt = False
       End If

       '横位置へlngEnemyAttackDirを加算
       'lngEnemyAttackDirの内容は -1 , 0, 1
       lngEnemyAttackX = lngEnemyAttackX + lngEnemyAttackDir
          
       '横位置が1未満になったらそれ以上左へ移動しない
       If lngEnemyAttackX < 1 Then
          lngEnemyAttackX = 1
       End If

       '横位置が130以上になったらそれ以上右へ移動しない
       If lngEnemyAttackX > 130 Then
          lngEnemyAttackX = 130
       End If

       'B敵とビーム砲が衝突しているか判定処理を呼び出す
       '衝突していれば、fncBeamHitCheckの戻り値にcstEnemyHitの値が返り
       'その場合は攻撃飛行中のステータスをFalse(攻撃飛行中の敵ナシ)にする
       If blnBeamF = True Then
          If fncBeamHitCheck(lngEnemyAttackX, lngEnemyAttackY, i) = True Then
             blnEnemyAttackSt = False
          End If
       End If

       '自機と敵の衝突判定処理の呼び出し
       '自機が爆発していないときだけ判定する
       If blnMyShipLock = False Then
          Call prcMyShipHitCheck
       End If    

    End If

    Return

'-------------------------------------------------------
EnemyHit: '爆発処理(C)
'-------------------------------------------------------

    '爆発パターンを描画する時間になっているかを判定
    If GetTickCount() - lngEnemyHitB(i) > lngEnemyHitS Then

       '爆発パターンの描画回数をカウント
       lngEnemyHitC(i) = lngEnemyHitC(i) + 1

       '5回描画したら爆発パターンを消去し、その敵のステータスを
       '撃墜(cstEnemyDown)に設定し、撃墜数をカウント
       If lngEnemyHitC(i) = 5  Then
          rngClear16.Copy _
              Destination:=Range(Cells(lngEnemyY(i), lngEnemyX(i)) _
                               , Cells(lngEnemyY(i) + 7, lngEnemyX(i) + 15))
          lngEnemySt(i) = cstEnemyDown
          lngEnemyCount = lngEnemyCount + 1
       Else
          '描画回数が5回に達していないときは爆発パターンを描画
          rngEnemyHit.Copy _
              Destination:=Range(Cells(lngEnemyY(i), lngEnemyX(i)) _
                               , Cells(lngEnemyY(i) + 7, lngEnemyX(i) + 15))
       End If

       '前回処理時刻の保存
       lngEnemyHitB(i) = GetTickCount()

    End If

    Return

End Sub
 ※このマクロは、ワークシート「ゲーム」へ記述してください。
  灰色は既に作成済みの部分です。黒の部分を追加してください。

Copyright(C) 1999-2006 結城圭介。 All rights reserved