SRPG游戏开发(六十一)第十一章 地图动作与地图事件 - 十 NPC操作(NPC Control)

返回《SRPG游戏开发》导航

第十一章 地图动作与地图事件(Map Action and Map Event)

我们已经有了剧本,而且可以运行剧本,但我们还缺少对地图的操作控制。

我们这一章来完成地图上的操作,地图的操作将全部由MapAction控制。



十 NPC操作(NPC Control)

自动化操作NPC是SRPG游戏必须有的。

我们使用的是MapActionUpdate方法来执行这些。


1 准备工作(Preparation)

我们需要对NPC逐个操作,这就需要一个变量来告知MapAction,我们进行到了哪里。

添加字段:

        private int m_NpcIndex = 0;

而在切换阵营时,我们需要将下标重置:

        /// <summary>
        /// 转换回合
        /// </summary>
        protected void NextTurn()
        {
   
            // 重置npc下标
            npcIndex = 0;

            // 省略其它代码
        }

而在Update中,就如同我们的输入一样,必须满足以下条件:

  • 阵营不能是玩家;

  • 地图不能播放动画;

  • 地图不能执行事件。

所以,我们的基本方法:

        /// <summary>
        /// 每帧刷新
        /// </summary>
        /// <returns></returns>
        public override bool Update()
        {
   
            // 省略MapScenarioAction操作

            if (turn != AttitudeTowards.Player)
            {
   
                if (mapStatus == MapStatus.Animation 
                    || mapStatus == MapStatus.Event 
                    || mapStatus == MapStatus.Menu || mapStatus == MapStatus.SubMenu)
                {
   
                    return true;
                }

                // TODO 具体NPC操作

                return true;
            }

            return false;
        }

我们对每个NPC进行的操作无外乎“移动”与“其它行动”;而“其它行动”又包含“攻击”、“对话”等等。这取决于我们的AI。我们目前并没有对AI进行编写,所以暂只考虑“移动”与“攻击”

首先,我们先建立两个空的方法:

        /// <summary>
        /// NPC移动,
        /// </summary>
        /// <param name="npc"></param>
        /// <returns></returns>
        public void NpcMove(MapClass npc)
        {
   
            // TODO
        }

        /// <summary>
        /// NPC攻击
        /// </summary>
        /// <param name="npc"></param>
        public void NpcAttack(MapClass npc)
        {
   
            // TODO
        }

2 每帧动作(Update)

要让NPC进行行动,必须先有NPC,所以我们要先获取它。

同时,如果阵营所有NPC行动结束,则要下一个阵营。

Update方法中,获取NPC:

                // 获取npc
                List<MapClass> units;
                if (!m_UnitDict.TryGetValue(turn, out units) || npcIndex >= units.Count)
                {
   
                    NextTurn();
                    return true;
                }
                MapClass unit = units[npcIndex];

其次,我们让光标追随NPC(这在以后运动摄像机时,让摄像机跟随光标即可)。

                // 光标跟随
                if (map.mouseCursor.cellPosition != unit.cellPosition)
                {
   
                    MoveCursorCommand(unit.cellPosition, 0.5f);
                    return true;
                }

最后,是我们NPC的行动,初步行动是移动,规定使用MapStatus.AttackCursor来表示是否攻击。

注意:在玩家时,MapStatus.AttackCursor表示是否显示攻击范围;而在NPC时,表示移动后是否对目标进行攻击。你也可以不使用它,而单独建立一个变量表示NPC的行动。

即NPC行动:

                // npc移动
                if (mapStatus != MapStatus.AttackCursor)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值