zoukankan      html  css  js  c++  java
  • PacMan 04——道具生成吃下道具怪物的移动

    版权申明:

    • 本文原创首发于以下网站:
    1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
    2. 优梦创客的官方博客:https://91make.top
    3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
    4. 『优梦创客』的微信公众号:umaketop
    • 您可以自由转载,但必须加入完整的版权声明

    目标

    实现功能

    道具会在豆子的坐标上随机出现
    玩家吃下道具时怪物会改变颜色

    道具的随机出现

    在AStar算法中可以获得所有豆子的坐标集合
    将该坐标集合储存起来
    在创建道具时在豆子坐标集合中随机获取一个坐标最为道具创建的位置达到随机创建豆子的目的

      public void SpawnPowerUp()
        {
            //游戏结束后将不创建道具
            if (gameOver)
                return;
            //使用预制体创建道具
            GameObject powerUp = Instantiate(powerUpPrefab);
            //道具创建的位置
            powerUp.transform.position = walkableList[Random.Range(0,walkableList.Count-1)]-liftBottom;
            //道具创建时设置父节点
            powerUp.transform.SetParent(powerUpParent.transform);
        }
    

    怪物的改变颜色

    在游戏控制器中有一个isPowerUp来决定玩家是否得到了PowerUp的道具

    //获得道具时
     if (GameController.gameController.isPowerUp)
    {
    	//将怪物的颜色设置淡一些
    	this.GetComponent<SpriteRenderer>().material.color = new Color(0.5f,0.5f,0.8f,1.0f);
    }
    else
    {
    	//道具失效后怪物的颜色将变为原来的颜色
    	this.GetComponent<SpriteRenderer>().material.color = Color.white;
    }
    

    完成了怪物在玩家吃到道具的时候逃跑

    逻辑:
    在玩家吃掉道具时,怪物会选择一个角落进行寻路,也是要转到路点移动状态。
    选择一个角落时,计算怪物到角落的距离,计算玩家到角落的距离,如果是怪物的距离比较短,就放入候选角落,最后在候选角落里随机选择一个目标点。
    实现:
    选择角落代码:

        public Vector2 GetEscapeCorner(Vector3 monsterPos)
        {
            //获得逃跑目标点
            List<Vector2> escapable = new List<Vector2>();
            for(int i=0;i<v3corners.Length;i++)
            {
                Vector3 playerPos = playerTrans.position;
                float dPlayer = (playerPos - v3corners[i]).magnitude;
                float dMonster = (monsterPos - v3corners[i]).magnitude;
                if(dMonster<dPlayer)
                {
                    escapable.Add(corners[i].position);
                }
            }
            Vector2 selectCorner = escapable[UnityEngine.Random.Range(0, escapable.Count)];
            return selectCorner;
        }
    

    怪物内,发现玩家时的状态:

        class SeekState : WaypointState
        {
            public SeekState(List<Vector2> path): base(path)
            {
    
            }
            public override void Update(Monster e)
            {
                if(GameController.instance.isPlayerPowerUp)
                {
                    Vector2 corner = GameController.instance.GetEscapeCorner(e.transform.position);
                    Vector2 p = GameController.instance.leftBottom;
                    List<Vector2> path = e.finder.Find((Vector2)e.transform.position-p, corner-p);
                    for (int i = 0; i < path.Count; i++)
                    {
                        path[i] += p;
                    }
                    e.stateMaginer.ChangeState(new EscapeState(path));
                    return;
                }
                base.Update(e);
            }
        }
    
  • 相关阅读:
    软件工程第四次作业-题目2
    oracle数据库本地网络服务名配置常见问题
    2020软件工程第三次作业
    2020软件工程第二次作业
    2020软件工程第一次作业
    20145208 蔡野 《网络攻防》 后门原理与实践
    20145208蔡野 《网络对抗》逆向及BOF基础实践
    密码分析学学习总结
    20145208 《信息安全系统设计基础》课程总结
    20145208 《信息安全系统设计基础》第十四周学习总结
  • 原文地址:https://www.cnblogs.com/raymondking123/p/11596127.html
Copyright © 2011-2022 走看看