Skip to content

重构: Game_NPC 设计 #13

@heartcase

Description

@heartcase
  1. 移除SelfData依赖
  2. 拓展一个专用的Game_NPCEvent
  3. 整理了之前讨论的场景外NPC活动规则
    ====
    对象属性
属性名 说明 类型
offSceneCounter 场景外 NPC 移动计数 number
routine 路径队列 Queue<Game_PathNode>
patrol 巡逻队列 Queue<Game_PathNode>
pos NPC 位置 [MapId, x, y, d]
name NPC 事件标识 string
event 场景内事件对象 Game_NPCEvent
patterns 行为模式组 List<Pattern>
dialogueName NPC 对话模式标识 (事件页条件) string
behaviorName NPC 移动模式标识 string
actionName NPC 动作模式标识 (待更新) string

初始化

在加载完$dataEventMap后:

  1. 遍历$dataEventMap.events里所有的事件e:
    1. 如果e.meta.GameNPCtrue
      • (待更新) 读取e.pages[0].list的注释, 遍历每一行初始化数据

时间驱动: updateOffScene

对于每个场景外 NPC, 每经过周期 x 执行:

  1. 设置队列l的值:

    • 如果routine不为空 则设lroutine
    • 如果patrol不为空 则设lpatrol
    • 否则跳过剩余动作
  2. l的列头为目标点p

  3. offSceneCounter增加 x

  4. 重复offSceneCounter 大于 p.cost:

    1. offSceneCounter 减少 p.cost
    2. pl中出队
    3. 如果lpatrol:
      • p加入队列l
    4. 如果lroutine且为空
      • 设置lpatrol
    5. 如果l为空
      • 跳过剩余动作
    6. 重新设p的值为l列头
  5. p.pos赋给pos

  6. 如果pos所在的mapId$gameMap._mapId

    • 创建标识符为nameGame_NPCEvent实例, 并赋值给event
    • 加载Sprite_CharacterScene

地图移动驱动: updateOnSceneMovement

对于每个在场景内的 NPC, 每次刷新时若没有其他行动则:

  1. 设置队列l的值:

    • 如果routine不为空 则设lroutine
    • 如果patrol不为空 则设lpatrol
    • 否则跳过剩余动作
  2. l的列头为目标点p

    • 如果posp.pos相等:

      1. pl中出队
      2. 如果lpatrol:
        • p加入队列l
      3. 如果lroutine且为空
        • 设置lpatrol
      4. 如果l为空
        • 跳过剩余动作
      5. 重新设p的值为l列头
  3. 如果p所在的mapId不为$gameMap._mapId

    • 则移除event
    • 移除event对应的sprite
    • 跳过剩余动作
  4. 设置devent.findDirectionTo求到p.pos位置的方向

  5. 执行event.moveforward

  6. pos设置为pos位移 d 方向 1 格的坐标


地图动作: updateOnSceneAction

(待更新)

行为模式切换

对于所有 NPC, 当外界状态发生变化时, 或对某一 NPC, 自身状态发生变化时:

  1. 遍历patterns中的每一个pattern:

    1. 如果pattern中的conditions均满足条件

      • newPattern为 pattern
    2. 如果behaviorName不相等

      • 更新routine, patrol (跨地图寻路)
    3. 更新dialogueNameactionName

  2. 刷新地图, $gameMap.requestRefresh()


Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions