经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
PacMan 04——道具生成吃下道具怪物的移动
来源:cnblogs  作者:优梦创客  时间:2019/9/27 10:25:37  对本文有异议

版权申明:

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

目标

实现功能

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

道具的随机出现

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

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

怪物的改变颜色

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

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

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

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

  1. public Vector2 GetEscapeCorner(Vector3 monsterPos)
  2. {
  3. //获得逃跑目标点
  4. List<Vector2> escapable = new List<Vector2>();
  5. for(int i=0;i<v3corners.Length;i++)
  6. {
  7. Vector3 playerPos = playerTrans.position;
  8. float dPlayer = (playerPos - v3corners[i]).magnitude;
  9. float dMonster = (monsterPos - v3corners[i]).magnitude;
  10. if(dMonster<dPlayer)
  11. {
  12. escapable.Add(corners[i].position);
  13. }
  14. }
  15. Vector2 selectCorner = escapable[UnityEngine.Random.Range(0, escapable.Count)];
  16. return selectCorner;
  17. }

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

  1. class SeekState : WaypointState
  2. {
  3. public SeekState(List<Vector2> path): base(path)
  4. {
  5. }
  6. public override void Update(Monster e)
  7. {
  8. if(GameController.instance.isPlayerPowerUp)
  9. {
  10. Vector2 corner = GameController.instance.GetEscapeCorner(e.transform.position);
  11. Vector2 p = GameController.instance.leftBottom;
  12. List<Vector2> path = e.finder.Find((Vector2)e.transform.position-p, corner-p);
  13. for (int i = 0; i < path.Count; i++)
  14. {
  15. path[i] += p;
  16. }
  17. e.stateMaginer.ChangeState(new EscapeState(path));
  18. return;
  19. }
  20. base.Update(e);
  21. }
  22. }

原文链接:http://www.cnblogs.com/raymondking123/p/11596127.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号