调查对象的选取:游戏中对象选取的思路方法

  对于PC游戏在鼠标大行其道今天如何由鼠标位置判定其下对象是什么是几乎所有游戏都必须面对问题

以下提供几种思路方法仅供参考

1、包围框法:
   对游戏中每个对象创建个伴随包围框通过遍历所有可见对象判定鼠标坐标点是否落在某个包围框内部来获取其选取对象这种思路方法优点是简单算法容易理解当使用矩形包围框而对象数量又比较有限时候效率也是很好缺点是选取不够精确无法对对象细节做选取在2D游戏中包围框般是矩形或者是若干个矩形组合而3D游戏使用包围盒或者包围球或其组合等方式无论具体方式如何其算法实质都是

2、枚举法:
   效率最低思路方法的和1包围框法类似它也需要遍历所有可见对象但是由于缺少包围盒机制只能检测对象位于鼠标下那个位置是否有有效象素或者有效alpha值对3D对象而言就是检查鼠标点形成选取射线是否穿越对象某个面片这种思路方法可以实现很精确选取但是由于效率太低所以很少直接使用般先使用思路方法1减少遍历对象数量的后再使用这个思路方法达到精确选取

3、反馈法:
   这是个很有效也很快捷思路方法尤其在3D游戏中有无可比拟优越性反馈法实现很简单首先要维护个后台缓冲区当绘制目标对象时候同时将对象可见信息(般是对象图片Alpha值或者Z值) 写入后台缓冲然后检测鼠标对应缓冲区位置值是否有变化如果变化了表明刚才绘制对象可以被鼠标选中当缓冲使用了复杂Z运算时候我们在绘制完成的后就可以得到个鼠标可以选取对象列表然后只要简单根据原则从这个列表中提取需要对象就可以了这个机制在2D下般不维护额外缓冲区而直接使用绘图缓冲区3D下像OpenGL提供了内置反馈思路方法更方便了用户使用实际也可以利用Z buffer模板缓冲等实现类似机制这种思路方法可以实现精确到象素级选取而几乎不影响运行效率缺点是需要对绘制部分代码有很高控制权限

4、直接映射法:
   这也是个高效算法可以达到O(1)时间复杂度常见于2D战棋类游戏中在这类游戏中场景是用个 2维表存储每个项保存着它上面对象信息我们可以通过个简单算法由当前鼠标位置得到表索引然后直接读取索引对应项就完成了选取在固定视角3D游戏甚至非固定视角3D游戏中也可以使用这种思路方法这种思路方法缺点是对象在场景中只能是按 2维表或者多层 2维表排布这种思路方法对内存空间需求也比较大棋牌类游戏比较适合使用这种思路方法

   由于每种思路方法都有其固有优缺点而对游戏而言场景又千变万化复杂纷繁为了能适应实际需求上面思路方法可以组合使用从而扬长避短更好达成需求其他些复杂选取比如范围选取(框选)等也可以由以上几种基本思路方法演化而来
Tags:  面向对象开发方法 面向对象的方法 面向对象方法 调查对象的选取

延伸阅读

最新评论

发表评论