/// <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(); } }
/// <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); }
/// <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); }