游戏中对象选取的方法
来源:互联网 发布:免费种子解析软件 编辑:程序博客网 时间:2024/06/06 18:03
游戏中对象选取的方法发表日期:2007-03-28作者:[转贴] 出处:
-
对于PC游戏,在鼠标大行其道的今天,如何由鼠标的位置判定其下的对象是什么,是几乎所有游戏都必须面对的问题。
以下提供几种方法,仅供参考。
1、包围框法:
一般的,对游戏中的每个对象创建一个伴随的包围框,通过遍历所有可见对象,判定鼠标坐标点是否落在某个包围框的内部来获取其选取的对象。这种方法的优点是简单,算法容易理解,当使用矩形包围框,而对象数量又比较有限的时候,效率也是很好的。缺点是选取不够精确,无法对对象的细节做选取。在2D游戏中,包围框一般是矩形,或者是若干个矩形的组合,而3D游戏使用包围盒,或者包围球或其组合等方式。无论具体方式如何,其算法实质都是一样的。
2、枚举法:
效率最低的方法之一。和1,包围框法类似,它也需要遍历所有可见对象,但是由于缺少包围盒机制,只能检测对象位于鼠标下的那个位置是否有有效象素,或者有效的alpha值,对3D对象而言,就是检查鼠标点形成的选取射线是否穿越对象的某个面片。这种方法可以实现很精确的选取,但是由于效率太低,所以很少直接使用,一般先使用方法1减少遍历对象的数量之后,再使用这个方法达到精确的选取。
3、反馈法:
这是一个很有效,也很快捷的方法,尤其在3D游戏中,有无可比拟的优越性。反馈法的实现很简单,首先要维护一个后台缓冲区,当绘制目标对象的时候,同时将对象的可见信息(一般是对象图片的Alpha值,或者Z值) 写入后台缓冲,然后检测鼠标对应的缓冲区的位置的值是否有变化,如果变化了,表明刚才绘制的对象可以被鼠标选中。当缓冲使用了复杂一些的Z运算的时候,我们在绘制完成之后,就可以得到一个鼠标可以选取的对象列表,然后只要简单的根据一定的原则从这个列表中提取需要的对象就可以了。这个机制在2D下,一般不维护额外的缓冲区而直接使用绘图缓冲区。3D下,像OpenGL提供了内置的反馈方法,更方便了用户的使用。实际也可以利用Z buffer,模板缓冲等实现类似的机制。这种方法可以实现精确到象素级的选取,而几乎不影响运行效率。缺点是需要对绘制部分的代码有很高的控制权限。
4、直接映射法:
这也是一个高效算法,可以达到O(1)的时间复杂度。常见于2D战棋类游戏中。在这类游戏中,场景是用一个二维表存储的,表的每个项,保存着它上面的对象信息,我们可以通过一个简单的算法,由当前的鼠标位置得到表的索引,然后直接读取索引对应的项就完成了选取。在固定视角的3D游戏甚至非固定视角的 3D游戏中,也可以使用这种方法。这种方法的缺点是对象在场景中,只能是按二维表,或者多层二维表排布的。这种方法对内存空间的需求也比较大。棋牌类游戏比较适合使用这种方法。
由于每种方法都有其固有的优缺点,而对游戏而言,场景又千变万化,复杂纷繁。为了能适应实际的需求,上面的方法可以组合使用,从而扬长避短,更好的达成需求。其他一些复杂的选取,比如范围选取(框选)等,也可以由以上几种基本的方法演化而来。
以下提供几种方法,仅供参考。
1、包围框法:
一般的,对游戏中的每个对象创建一个伴随的包围框,通过遍历所有可见对象,判定鼠标坐标点是否落在某个包围框的内部来获取其选取的对象。这种方法的优点是简单,算法容易理解,当使用矩形包围框,而对象数量又比较有限的时候,效率也是很好的。缺点是选取不够精确,无法对对象的细节做选取。在2D游戏中,包围框一般是矩形,或者是若干个矩形的组合,而3D游戏使用包围盒,或者包围球或其组合等方式。无论具体方式如何,其算法实质都是一样的。
2、枚举法:
效率最低的方法之一。和1,包围框法类似,它也需要遍历所有可见对象,但是由于缺少包围盒机制,只能检测对象位于鼠标下的那个位置是否有有效象素,或者有效的alpha值,对3D对象而言,就是检查鼠标点形成的选取射线是否穿越对象的某个面片。这种方法可以实现很精确的选取,但是由于效率太低,所以很少直接使用,一般先使用方法1减少遍历对象的数量之后,再使用这个方法达到精确的选取。
3、反馈法:
这是一个很有效,也很快捷的方法,尤其在3D游戏中,有无可比拟的优越性。反馈法的实现很简单,首先要维护一个后台缓冲区,当绘制目标对象的时候,同时将对象的可见信息(一般是对象图片的Alpha值,或者Z值) 写入后台缓冲,然后检测鼠标对应的缓冲区的位置的值是否有变化,如果变化了,表明刚才绘制的对象可以被鼠标选中。当缓冲使用了复杂一些的Z运算的时候,我们在绘制完成之后,就可以得到一个鼠标可以选取的对象列表,然后只要简单的根据一定的原则从这个列表中提取需要的对象就可以了。这个机制在2D下,一般不维护额外的缓冲区而直接使用绘图缓冲区。3D下,像OpenGL提供了内置的反馈方法,更方便了用户的使用。实际也可以利用Z buffer,模板缓冲等实现类似的机制。这种方法可以实现精确到象素级的选取,而几乎不影响运行效率。缺点是需要对绘制部分的代码有很高的控制权限。
4、直接映射法:
这也是一个高效算法,可以达到O(1)的时间复杂度。常见于2D战棋类游戏中。在这类游戏中,场景是用一个二维表存储的,表的每个项,保存着它上面的对象信息,我们可以通过一个简单的算法,由当前的鼠标位置得到表的索引,然后直接读取索引对应的项就完成了选取。在固定视角的3D游戏甚至非固定视角的 3D游戏中,也可以使用这种方法。这种方法的缺点是对象在场景中,只能是按二维表,或者多层二维表排布的。这种方法对内存空间的需求也比较大。棋牌类游戏比较适合使用这种方法。
由于每种方法都有其固有的优缺点,而对游戏而言,场景又千变万化,复杂纷繁。为了能适应实际的需求,上面的方法可以组合使用,从而扬长避短,更好的达成需求。其他一些复杂的选取,比如范围选取(框选)等,也可以由以上几种基本的方法演化而来。
- 游戏中对象选取的方法
- 游戏中对象选取的方法
- 游戏中图片格式的选取
- 游戏中产生全局对象惟一ID的方法
- UE4中实例化游戏对象的方法
- 从数据库中动态选取下拉列表的方法
- JS对象的选取函数
- 随机选取weblist的方法
- 选取不同随机数的方法
- 网页中图片格式的选取
- Unity 游戏对象的移动方法总结
- 用面向对象继承的思想设定游戏中怪物的属性和方法
- numpy 中数据选取和切片选取的区别
- Struck算法中每个sample框中矩形框的选取采样方法详解
- Unity学习(七):Unity中游戏对象间的访问方法、脚本时间控制
- [Unity-25] Unity中让游戏对象消失或隐藏的几种方法
- Unity中让游戏对象消失或隐藏的几种方法
- 游戏中精灵对象的属性功能设计
- 嵌入式 Linux 产品的 safe mode 设计与实现
- 借我一生
- 拒绝插件wordpress首页利用代码进行文章字符串截取(转自www.jqueryba.com)
- Ubuntu中如何修复GRUB2 Boot Loader
- simple_html_dom使用小结
- 游戏中对象选取的方法
- 伤别
- 从“为什么不能直接打开PDF文件”说到“脚本攻击”
- 后缀树的构造方法-Ukkonen详解
- 悉数历史 英特尔历代经典CPU产品回顾
- 蝴蝶兰与鳞托菊
- 常用HTML标签元素结合及简介
- S3C6410 时钟初始化
- 对线性回归,logistic回归和一般回归的认识