Beispiel #1
0
        /// <summary>
        /// 使用破墙镐消除使用者前方的障碍物,如果消去成功,物品数量减1
        /// </summary>
        public override void Use(IPropUser user)
        {
            //打破前面的一堵墙
            Coord station = user.Station;

            station.Offset(user.FaceTo);
            if (MotaWorld.GetInstance().MapManager.Destroy(station))
            {
                //如果破坏成功,减掉道具
                this.CutDown();
            }
        }
Beispiel #2
0
        /// <summary>
        /// 获取楼层对象中两点之间的路径(用坐标队列表示)
        /// </summary>
        /// <returns>返回从起点到终点的移动方向的队列,如果没有通行的路线,返回null</returns>
        public Queue <Coord> Compute()
        {
            if (!InMap(StartPos) || !InMap(TargetPos))
            {
                return(null);
            }

            //设置起始搜索路径开始搜索
            PathQueue.Enqueue(StartPath);

            //只要搜索队列中存在一条路径,就继续搜索
            while (PathQueue.Count > 0)
            {
                //从路径队列中获取当前搜索的路线
                Queue <Coord> curPath = PathQueue.Dequeue();

                //从当前路线中获取当前的搜索点
                Coord curPos = curPath.ElementAt(curPath.Count - 1);

                //检查是否为终点坐标,如果搜索到终点,退出循环
                if (curPos.CompareTo(TargetPos) == 0)
                {
                    TargetPath = curPath;
                    break;
                }

                //向四个方向扩展搜索
                foreach (var searchDirection in Around)
                {
                    Coord newPos = curPos;
                    newPos.Offset(searchDirection);

                    //如果新的搜索点未曾搜索过,加入队列以待之后的搜索
                    if (InMap(newPos) && !Passed[newPos.Row, newPos.Col] && Passable(newPos, searchDirection))
                    {
                        Passed[newPos.Row, newPos.Col] = true;

                        Queue <Coord> newPath = new Queue <Coord>(curPath);
                        newPath.Enqueue(newPos);
                        PathQueue.Enqueue(newPath);
                    }
                }
            }

            return(TargetPath);
        }
Beispiel #3
0
        /// <summary>
        /// 触发推箱子事件
        /// </summary>
        /// <param name="player">触发者</param>
        public override void TriggerEvent(Hero player)
        {
            //要推到的坐标
            Coord desPoint = this.Station;

            desPoint.Offset(player.FaceTo);

            PushWaitCount++;
            if (PushWaitCount <= GameIni.BoxPushWait)
            {
                return;
            }

            //如果箱子的前方为空,则推动那个位置
            if (MotaWorld.GetInstance().MapManager.ShiftEvent(this.Station, desPoint, player.FaceTo))
            {
                StartMove(player.FaceTo);
                SoundsList.PlaySound(SoundType.推箱子);
                this.MoveCount -= GameIni.BoxMoveTimes;
            }

            base.TriggerEvent(player);
        }