El proyecto completo de
"Magic Tower: Saving the White Lady"
enlace de descarga: "Magic Tower: Saving the White Lady" Análisis del proceso 5: Procesamiento de combate El sistema de batalla de este juego es relativamente simple, que consiste en comparar los datos de ambas partes, después de la pelea, mostrará el proceso de lucha. Indicación "no puede vencer", desvío ,,,, la
siguiente es la subrutina de manejo de batalla:
Sub 战斗处理(怪物编号 As Integer)
Dim k As Integer
Dim K2 As Long
Dim n() As String
'战斗
'①判断是否能打过,不能打过就提示:打不过
n = Split(怪物信息(怪物编号 - 79), ",") '读取怪物数据
怪物相关属性.怪物名 = n(0)
怪物相关属性.怪物生命值 = n(1)
怪物相关属性.怪物攻击力 = n(2)
怪物相关属性.怪物防御值 = n(3)
怪物相关属性.怪物持有的金币 = n(4)
怪物相关属性.怪物的经验值 = n(5)
k = 人物信息.角色攻击力 - 怪物相关属性.怪物防御值 ')Int(
If k < 0 Then Exit Sub
If k = 0 Then k = 1
'②可以打那就显示战斗画面(可以设置显示/关闭 战斗画面)
k = 怪物相关属性.怪物生命值 / k ')Int(
K2 = 怪物相关属性.怪物攻击力 - 人物信息.角色防御值
K2 = k * K2 + K2
If K2 > 人物信息.角色生命值 Then Exit Sub '打不过就提示
战斗开始标志 = True
Form_战斗.Show
延时 (1000)
Unload Form_战斗
提示信息 = "太厉害了,你赢得了一场战斗!"
通过标志 = True
战斗开始标志 = False
End Sub
Subventana de manejo de batalla: (interfaz de diseño)
Código:
Option Explicit
Private Sub Form_Load()
'获得主窗口的坐标
Me.Left = frmMain.Left + 1000
Me.Top = frmMain.Top + 3000
Dim rtn As Long
rtn = GetWindowLong(hWnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hWnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hWnd, 0, 200, LWA_ALPHA
'让窗口在顶层
rtn = SetWindowPos(Me.hWnd, -1, 0, 0, 0, 0, 3)
'取消窗口在顶层
'rtn = SetWindowPos(F_V.hwnd, -2, 0, 0, 0, 0, 3)
战斗信息显示
Timer1.Enabled = True
End Sub
Sub 战斗信息显示()
Label_怪物名字 = 怪物相关属性.怪物名
Label_怪物生命值 = "生命值:" & 怪物相关属性.怪物生命值
Label_怪物攻击力 = "攻击力:" & 怪物相关属性.怪物攻击力
Label_怪物防御力 = "防御力:" & 怪物相关属性.怪物防御值
Label_怪物金币 = "金 币:" & 怪物相关属性.怪物持有的金币
Label_怪物经验值 = "经验值:" & 怪物相关属性.怪物的经验值
Label_男主角生命 = "生命值:" & 人物信息.角色生命值
Label_男主角攻击力 = "攻击力:" & 人物信息.角色攻击力
Label_男主角防御力 = "防御力:" & 人物信息.角色防御值
End Sub
Sub 战斗过程()
'损失计算方法:
'【怪物生命÷(自己攻击力-怪物防御力)-1】×(怪物攻击力-自己防御力)=损失。
'如果怪物先攻就不-1了
Dim k As Long, K2 As Long
' Dim lLife As Long
' lLife = 怪物相关属性.怪物生命值
Do While 怪物相关属性.怪物生命值 > 0
DoEvents
k = 人物信息.角色攻击力 - 怪物相关属性.怪物防御值 '(自己攻击力-怪物防御力)
If k < 0 Then k = 0
k = Rndnum(k, k + 10)
怪物相关属性.怪物生命值 = 怪物相关属性.怪物生命值 - k '怪物失血(人物攻击带随机暴击属性)
If 怪物相关属性.怪物生命值 < 0 Then 怪物相关属性.怪物生命值 = 0 ': Exit Do
'If 怪物相关属性.怪物生命值 > 0 Then
K2 = 怪物相关属性.怪物攻击力 - 人物信息.角色防御值 '怪物攻击力-自己防御力
If K2 < 0 Then K2 = 0
人物信息.角色生命值 = 人物信息.角色生命值 - K2 '自己失血
Label_战斗记录显示 = ""
Label_战斗记录显示 = "怪物失去了" & k & "点生命!"
Label_战斗记录显示 = Label_战斗记录显示 & vbCrLf & "英雄失去了" & K2 & "点生命!"
' End If
战斗信息显示
延时 (20)
Loop
人物信息.角色持有的金币 = 人物信息.角色持有的金币 + 怪物相关属性.怪物持有的金币
人物信息.角色的经验值 = 人物信息.角色的经验值 + 怪物相关属性.怪物的经验值
战斗胜利标志 = True
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
战斗过程
End Sub
Private Sub Timer2_Timer()
If frmMain.WindowState = 1 Then
Me.Hide
Else
Me.Show
End If
If Me.Left - 1000 <> frmMain.Left Then Me.Left = frmMain.Left + 1000
If Me.Top - 3000 <> frmMain.Top Then Me.Top = frmMain.Top + 3000
End Sub