游戏AI中我们的怪物需要追击我们的玩家,那么怎么样的追击方法更好呢?

对于一般的3D游戏,基本都是动态改变start到target的朝向,然后对转向做一些平滑的插值或者调整,最后再对这个朝向施加相应的速度来实现追击,实现这个过程需要一定的计算量。

但是对于2D游戏,尤其是砖块地板的2D游戏,每一个人物角色只能在地砖的中心移动而不能移动到边界线等位置,这样对于如何实现追击就有一定的要求——如何让角色有效的在横纵坐标都为整数点上不断向玩家靠近。

当然这里有很多简单的办法,例如通过判断x,y轴坐标值,如果小于则靠近,因而角色会先斜着移动然后沿着某一个轴靠近玩家,这难免显得有些笨拙,Bresenham算法就可以很好的应用在这里。

Bresenham算法是一种直线算法,常用于在位图图像中绘制基元,因为它可以使用简单的加减和位移等廉价的方式完成直线的近似表示。

在unity中,我们来模拟这个过程,首先根据start和target的位置差别,生成一系列仅由整数构成的xy坐标,然后再根据这个坐标绘制出路径:

 public Transform startPos;public Transform targetPos;public List<Vector2> line;public float curx;public float cury;void Start(){line = new List<Vector2>();}void Update(){if(targetPos.position.x - curx < 10f && targetPos.position.y - cury < 10f){return;}line = MakeLine(startPos, targetPos);DrawLine(line);curx = targetPos.position.x;cury = targetPos.position.y;}
 public void DrawLine(List<Vector2> line){for(int i = 0; i< line.Count; i++){GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);cube.transform.position = new Vector3(line[i].x, line[i].y, 0);}}
public List<Vector2> MakeLine(Transform startpos,Transform targetpos){float sx = startPos.position.x;float sy = startPos.position.y;float tx = targetpos.position.x;float ty = targetpos.position.y;float k1 = (ty - sy) / (tx - sx);float k2 = (tx - sx) / (ty - sy);line.Add(new Vector2(sx,sy));float sum = 0;if ( k1 >0 && k1 <= 1){float tempy = sy;for (float tempx = sx; tempx <= tx; tempx++){sum += k1;if (sum >= 0.5f){tempy+=1;sum -= 1;}line.Add(new Vector2(tempx, tempy));}}else{//斜率大于1暂未计算,原理相同}return line;}

这样在场景中移动target时,当移动范围较大时,则会自动生成新的路径:

bresenham算法的原理很简单,就是通过一个参数来计算斜率的积累程度,当斜率积累超过0.5说明需要对坐标进行改变。

具体内容可以参考博文:https://www.cnblogs.com/feiquan/archive/2018/03/04/8506283.html

bresenham算法模拟游戏中的追踪路线相关推荐

  1. 排序算法在游戏中的应用,你确定你了解吗?(详细的图解带你实战)

    排序算法在游戏中的应用,你确定你了解吗?(详细的图解带你实战) 目录 排序算法在游戏中的应用,你确定你了解吗?(详细的图解带你实战) 1. 归并排序 1.1 作为一种典型的分而治之思想的算法应用,归并 ...

  2. C++模拟游戏中鼠标点击和键盘按键

    游戏中模拟键盘输入,有时回被系统屏蔽,Java等语言都试过很多方法,好像都没用,所以下面给出一种C++实现方法 #include <iostream> #include <windo ...

  3. 模拟游戏中的装备强化过程

    模拟游戏中的装备强化过程 提示1: DNF装备强化在+1-+3 不会失败: +4-+7,失败后物品原有强化等级降低1级: +8-+10,失败后掉3级: 10上11或以上就爆了. 提示2: DNF装备强 ...

  4. 射线检测算法在游戏中应用

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  5. java 寻路算法_游戏中的寻路算法解析

    游戏角色的自动寻路,已经是游戏中一个历史比较悠久的领域,较为成熟也有很多种实现.这里摘录一句后面所提的参考资料中的描述:"业内AI开发者中有一句话:"寻路已不是问题."我 ...

  6. 机器学习算法在游戏中的一些具体应用

    Unite Beijing 2018国家会中心,Unity AI与机器学习副总裁Danny Lange分享了ML-Agents的新进展. 谈到了机器学习在游戏中的一些应用 具体游戏场景中,可以有以下应 ...

  7. MIT教授: 世界就是《黑客帝国》,人类在模拟游戏中扮演角色

      转载于 新智元   编辑:元子 MIT教授认为我们目前有50%-100%的概率生活在<黑客帝国>那样的计算机模拟世界中,所谓现实可能不过是一种幻觉.而距离我们创建自己的模拟世界,最多需 ...

  8. 优秀课程案例:使用Scratch模拟游戏中的血条显示-血条模拟器!

    点击上面微信号关注我关注我哟每天坚持推送文章,争取做到日更,喜欢的可以设置星标,并分享点赞我们的文章,非常感谢大家的支持,您的点击的在看就是我们的动力! 最近两天我们分享了抽奖大转盘的案例:优秀课程案 ...

  9. 在一款恋爱模拟游戏中,男主角进入了某个女主角的线路,现在遵循“与其约会,使其娇羞”的战略,共有9个约会场所提供使用。其中,有四个约会场景,较为浪漫,男主可以取得好感度+2或者好感度+0,五个约会场景较

    import itertoolss = [[2,0],[2,0],[2,0],[2,0],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1]]a=[] b=[] c=0 d=0 fo ...

最新文章

  1. linux update更新源
  2. lograotate 配置常用配置
  3. sudo apt-get install 安装软件总是出现“404 NOT FOUND” 错误的解决方案 !
  4. 增加 addDataScheme(file) 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略...
  5. linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )...
  6. Spring AOP 的日志管理实现
  7. C#面向对象系列(2):构造函数的用法
  8. 2021 年各家大厂的 AI Lab 现状如何?
  9. php_connect_nonb,net2ftp无法显示文件列表输出为空
  10. MySQL8.0忘记密码了如何修改密码
  11. 利用vs10和opencv识别图片类型身份证的号码
  12. linux安装moodle最新版,在linux下安装moodle
  13. 论单片机程序固件保护的重要性和方法
  14. js 如何实现拖动滑块
  15. Ubuntu安装基础教程(No Zuo No Die)
  16. vhs预设_vhs vs beta原始格式大战的故事
  17. 这三个方法让你实现手写字扫描成电子版
  18. 探索测试-大富翁KYM练习笔记
  19. 旧金山州立大学计算机科学专业,美国留学旧金山州立大学 最受欢迎的十大专业...
  20. Unity Shader 之 简单实现物体被黑洞吸收吞噬(或者从黑洞中出来)的效果

热门文章

  1. 一个基于pycuda的矩阵乘法实现,它使用CUDA核心来加速计算。
  2. go遍历目录对lua进行xxtea加密工具
  3. 嵌入式常用网站一站式汇总
  4. 通达信公式转python为什么很难_[转]N年Python老司机,血泪总结新手常见10大错误...
  5. 抓住本质问题:读《戒嗔的白粥馆》 有感
  6. Eclipse搭建DL4J项目
  7. 哔哩哔哩视频弹幕爬取
  8. plc实验报告流程图_PLC实验报告——交通灯控制
  9. 基于FPGA的引导滤波并行加速实现
  10. 嵌入式课设-基于GPS模块的校园定位程序