VisualFreeBasic游戏趣味编程_9.4_元素更新的实现

2026-1-22 / 0 评论 / 80 阅读

假设键盘控制游戏角色向右移动,根据其右侧目标位置、再右侧位置的元素,有表9-2所示情况。

根据用户的不同输入,变量goal_i、goal_j存储游戏角色移动的目标位置, goalNext_i、goalNext_j存储目标位置再向前的一个位置。根据表9-2,共有6种情况会移动游戏角色及更新关卡元素,在update()函数中实现相应的处理:

Sub updateWithInput(hWndForm As hWnd, gg As ygdi) ' 和输入有关的更新
   Static pp As Long '预防一直按下,造成一直移动
   If pp = 1 Then
      If IsKeyPress(&H57) = 0 And IsKeyPress(&H53) = 0 And IsKeyPress(&H41) = 0 And IsKeyPress(&H44) = 0 Then
         pp = 0
      End If
   Else
      If IsKeyPress(&H57) Then ' 上
         pp = 1
      ElseIf IsKeyPress(&H53) Then ' 下
         pp = 1
      ElseIf IsKeyPress(&H41) Then ' 左
         pp = 1
      ElseIf IsKeyPress(&H44) Then '  右
         pp = 1
      End If
      If pp = 1 Then
         Dim goal_i     As Long = players.i ' 移动的目标位置
         Dim goal_j     As Long = players.j
         Dim goalNext_i As Long = goal_i '目标位置再向前的一个位置
         Dim goalNext_j As Long = goal_j
         ' 根据用户的不同按键输入,获得目标位置、再向前的一个位置
         If IsKeyPress(&H57) Then ' 上
            goal_i     = Players.i - 1 ' 目标位置在玩家位置的下边
            goalNext_i = goal_i    - 1 ' 目标的下一个位置,在其再下边
         ElseIf IsKeyPress(&H53) Then ' 下
            goal_i     = Players.i + 1 ' 目标位置在玩家位置的下边
            goalNext_i = goal_i    + 1 ' 目标的下一个位置,在其再下边
         ElseIf IsKeyPress(&H41) Then ' 左
            goal_j     = Players.j -1 ' 目标位置在玩家位置的左边
            goalNext_j = goal_j -1    ' 目标的下一个位置,在其再左边
         ElseIf IsKeyPress(&H44) Then '  右
            goal_j     = Players.j + 1 ' 目标位置在玩家位置的右边
            goalNext_j = goal_j    + 1 ' 目标的下一个位置,在其再右边
         End If
         '根据不同地图元素的情况,判断如何移动角色和更新地图元素
         If Mid(level(goal_i), goal_j + 1, 1) = "e" Or Mid(level(goal_i), goal_j + 1, 1) = "t" Then
            '如果目标位置是empty,或者target
            Players.i = goal_i
            Players.j = goal_j
         ElseIf Mid(level(goal_i), goal_j + 1, 1) = "b" And Mid(level(goalNext_i), goalNext_j + 1, 1) = "e" Then
            ' 如果目标位置是box,再前面一个是empty
            Players.i = goal_i ' 玩家移动到目标位置
            Players.j = goal_j
            Mid(level(goal_i), goal_j + 1, 1)         = "e" ' 目标位置变成empty
            Mid(level(goalNext_i), goalNext_j + 1, 1) = "b" ' 再前面变成box
         ElseIf Mid(level(goal_i), goal_j + 1, 1) = "b" And Mid(level(goalNext_i), goalNext_j + 1, 1) = "t" Then
            ' 如果目标位置是box,再前面一个是target
            Players.i = goal_i ' 玩家移动到目标位置
            Players.j = goal_j
            Mid(level(goal_i), goal_j + 1, 1)         = "e" ' 目标位置变成empty
            Mid(level(goalNext_i), goalNext_j + 1, 1) = "a" '再前面变成achieved
         ElseIf Mid(level(goal_i), goal_j + 1, 1) = "a" And Mid(level(goalNext_i), goalNext_j + 1, 1) = "e" Then
            '如果目标位置是achieved,再前面一个是empty
            Players.i = goal_i ' 玩家移动到目标位置
            Players.j = goal_j
            Mid(level(goal_i), goal_j + 1, 1)         = "t" ' 目标位置变成target
            Mid(level(goalNext_i), goalNext_j + 1, 1) = "b" ' 再前面变成box
         ElseIf Mid(level(goal_i), goal_j + 1, 1) = "a" And Mid(level(goalNext_i), goalNext_j + 1, 1) = "t" Then
            '如果目标位置是achieved,再前面一个是target
            Players.i = goal_i ' 玩家移动到目标位置
            Players.j = goal_j
            Mid(level(goal_i), goal_j + 1, 1)         = "t" ' 目标位置变成target
            Mid(level(goalNext_i), goalNext_j + 1, 1) = "a" ' 再前面变成achieved
         Else '其他情况都推不动
            Return ' 不做任何处理,函数直接返回
         End If
      End If
   End If
End Sub

读者可以自己更改代码,看看是否和预料的结果一样。如果不同,自己试着排除错误。

评论一下?

OωO
取消