|
|
★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
|
※このマクロは、ワークシート「ゲーム」へ記述してください。
灰色は既に作成済みの部分です。黒の部分を追加してください。
|
|
|
|
|