示例#1
0
 //显示升级信息
 public void ShowUpgradePanel()
 {
     if (PagodaMenu.Instanc.readyToPlace == false)
     {
         if (upgradePanel.gameObject.activeInHierarchy && Vector3.Distance(upgradePanel.transform.position, Input.mousePosition) >= 300)
         {
             CloseUpgradePanel();
         }
         //从摄像机发射射线,检测防御塔地形
         Ray        ray = mainCamera.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
         if (Physics.Raycast(ray, out hit, 500, LayerMask.GetMask("Pagoda")))
         {
             //照射到的地形上有防御塔,显示升级信息
             if (hit.collider.transform.childCount > 0)
             {
                 hitTerrain = hit.collider.transform;
                 //得到防御塔信息
                 Pagoda pagoda = hitTerrain.GetComponentInChildren <Pagoda>();
                 //显示升级信息
                 upgradePanel.ShowPagodaInfo(pagoda);
             }
         }
     }
     else
     {
         upgradePanel.gameObject.SetActive(false);
     }
 }
示例#2
0
 //显示防御塔信息
 public void ShowPagodaInfo(Pagoda _pagoda)
 {
     gameObject.SetActive(true);
     pagoda = _pagoda;
     RefreshInfo();
     ShowattRange();
 }
示例#3
0
    Pagoda pagoda;   //防御塔信息

    //初始化
    public void InitBullet(Vector3 position, Quaternion rotation, Enemy _target, float _damage, Transform _pool, Pagoda _pagoda)
    {
        transform.SetParent(null);
        transform.position = position;
        transform.rotation = rotation;
        target             = _target;
        damage             = _damage;
        pool    = _pool;
        initPos = transform.position;
        pagoda  = _pagoda;
    }
示例#4
0
    //死亡方法
    public override void Death(Pagoda murderer)
    {
        base.Death(murderer);

        gameObject.layer = LayerMask.NameToLayer("DeadBody"); //层设置为"DeadBody"
        state            = EnemyState.death;
        anim.Play("death");
        Util.Instance.AddTimeTask(() => transform.SetParent(enemyPool), 5); //5秒后返回对象池
        GameData.Instance.AddGold(gold);                                    //获得金币奖励
        PagodaMenu.Instanc.RefreshMenu();                                   //刷新菜单

        //标记处决者
        murderer.PlayKill(murderer.transform.position, "击杀", Color.red);
    }
示例#5
0
 //初始化
 public void Init(Camera _mainCamera, Transform _attRange)
 {
     //自身图片的名字就是对应防御塔名字
     image                = GetComponent <Image>();
     pagodaName           = image.sprite.name;
     pagodaObj            = Resources.Load <Pagoda>("Prefab/Chara/PagodaChara/" + pagodaName);
     pagodaObj.pagodaPool = GameObjectPool.Instance.GetPool(pagodaName);
     gold          = pagodaObj.gold;
     goldTxet.text = gold.ToString();
     mainCamera    = _mainCamera;
     attRange      = _attRange;
     ria           = attRange.GetComponent <MeshRenderer>().material;
     layer         = LayerMask.GetMask("Ground") | LayerMask.GetMask("Way") | LayerMask.GetMask("Pagoda");
 }
示例#6
0
 public void Damage(float damage, Pagoda murderer) //受伤方法,参数为受到的伤害值和给予最后一击的防御塔
 {
     if (surHp > damage)                           //当前血量大于受伤血量,正常扣血
     {
         surHp -= damage;
         //受伤后开始显示血条
         if (surHp < totalHp)
         {
             hpObj.gameObject.SetActive(true);
         }
         Vector3 hpScale = redHp.localScale;
         hpScale.x        = surHp / totalHp;
         redHp.localScale = hpScale;
     }
     else //当前血量不够,调用死亡方法
     {
         Death(murderer);
     }
 }
示例#7
0
 //点击头像实例化防御塔
 public void OnPointerDown(PointerEventData eventData)
 {
     PagodaMenu.Instanc.readyToPlace = true;
     //实例化防御塔模型并命名
     obj = pagodaObj.pagodaPool.GetComponentInChildren <Pagoda>();
     if (obj != null)
     {
         obj.transform.SetParent(null);
     }
     else
     {
         obj      = Instantiate(pagodaObj);
         obj.name = pagodaName + Time.time;
     }
     //启用攻击范围显示器并将防御塔攻击方位反映在尺寸上
     attRange.gameObject.SetActive(true);
     attRange.localScale = new Vector3(obj.attactRange * 2, 1, obj.attactRange * 2);
     image.color         = new Color(0, 1, 0); //头像变色
 }
示例#8
0
    Transform terrain; //可放置地形
    //抬起鼠标放置或删除防御塔
    public void OnPointerUp(PointerEventData eventData)
    {
        PagodaMenu.Instanc.readyToPlace = false;
        image.color = new Color(1, 1, 1); //头像变色
        if (isPlace)                      //可放置时
        {
            //放置在该地形并成为地形子物体,然后初始化
            obj.transform.position = terrain.position;
            obj.transform.SetParent(terrain);
            obj.initPagoda();

            //消耗金币和刷新菜单
            GameData.Instance.SubGold(pagodaObj.gold);
            PagodaMenu.Instanc.RefreshMenu();
        }
        else //不可放置则销毁重置
        {
            obj.transform.SetParent(obj.pagodaPool);
        }
        obj = null;
        attRange.gameObject.SetActive(false); //禁用范围显示器
        ria.color = new Color(0, 1, 0, 0.3f);
    }
示例#9
0
 public virtual void Death(Pagoda murderer) //死亡方法
 {
     surHp = 0;
     hpObj.gameObject.SetActive(false); //血条不再显示
 }
示例#10
0
 public override void Death(Pagoda murderer) //重写死亡方法
 {
     base.Death(murderer);
     anim.enabled = false;
     GameMain.instance.GameOver();
 }
示例#11
0
        public Village GenerateVillage(List <Path> paths, int seed)
        {
            var random = new Random(seed);
            var points = Lines
                         .SelectMany((maxY, x) => Enumerable.Range(0, maxY).Select(y => new Point(x + 1, y + 1, X0, Y0)))
                         .OrderBy(p => p.Dist)
                         .ToList();

            var pagodas   = new List <Pagoda>();
            var pathMetas = new List <PathMeta>();
            var allDays   = new List <(Day, int)>();

            foreach (var path in paths)
            {
                if (path == null || string.IsNullOrEmpty(path.Data.Name))
                {
                    continue;
                }

                var nonEmptyDays = path.Days
                                   .Where(d => d.Type != DateType.N && d.Type != DateType.Link && d.Type != DateType.Checkpoint)
                                   .Select(d => (d, path.Data.Color))
                                   .ToList();

                // calculate last unbreakable chain length
                var daysLast = nonEmptyDays.AsEnumerable()
                               .Reverse()
                               .TakeWhile(d => d.Item1.Type == DateType.Done || d.Item1.Type == DateType.DoneLink)
                               .Count();

                pathMetas.Add(path.Data.ToMeta(daysLast));

                // store days
                allDays.AddRange(nonEmptyDays);
            }

            // enumerate all days
            allDays = allDays.OrderBy(d => d.Item1.Date).ToList();

            // generate pagodas
            foreach (var(day, color) in allDays)
            {
                var isBreak        = day.Type == DateType.Break;
                var pagodasOfColor = pagodas.Where(p => p.Color == color).ToList();
                if (isBreak && pagodasOfColor.Count > 0)
                {
                    // on break destroy random pagoda
                    var pIndex = random.Next(0, pagodasOfColor.Count);
                    pagodas.Remove(pagodasOfColor[pIndex]);
                }
                else if (!isBreak)
                {
                    // level up random pagoda or create a new one
                    var levelUp       = random.Next(100) <= 25;
                    var notMaxPagodas = pagodasOfColor.Where(p => p.Level < MaxLevel).ToList();
                    if ((levelUp || points.Count == 0) && notMaxPagodas.Count > 0)
                    {
                        var nmIndex = random.Next(0, notMaxPagodas.Count);
                        notMaxPagodas[nmIndex].Level++;
                    }
                    else if (points.Count > 0)
                    {
                        // create a new one
                        var pointIndex = random.Next(0, Math.Min(NewPagodaPointRange, points.Count));
                        var point      = points[pointIndex];
                        points.RemoveAt(pointIndex);

                        var pagoda = new Pagoda
                        {
                            X     = point.X,
                            Y     = point.Y,
                            Color = color,
                            Level = 1
                        };
                        pagodas.Add(pagoda);
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(new Village
            {
                Pagodas = pagodas.OrderBy(p => p.X).ThenBy(p => p.Y).ToList(),
                Paths = pathMetas
            });
        }