游戏中对象选取的方法

2016-02-19 16:40 4 1 收藏

图老师小编精心整理的游戏中对象选取的方法希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - 编程语言 】

  对于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游戏中,也可以使用这种方法。这种方法的缺点是对象在场景中,只能是按二维表,或者多层二维表排布的。这种方法对内存空间的需求也比较大。棋牌类游戏比较适合使用这种方法。

  由于每种方法都有其固有的优缺点,而对游戏而言,场景又千变万化,复杂纷繁。为了能适应实际的需求,上面的方法可以组合使用,从而扬长避短,更好的达成需求。

  其他一些复杂的选取,比如范围选取(框选)等,也可以由以上几种基本的方法演化而来。

  以下是对前面反馈法的补充-反馈法的2D基本实现:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  这里直接使用后台绘制缓冲区作为选取缓冲区。

  首先规定一种透明色,这种颜色不允许出现在对象和背景的任何非透明部分,例如规定

  trans = RGB(0,0,0);

  为透明色。

  假设绘图缓冲区为一个二维数组:

  color buf[h][w];

  当前鼠标对应的缓冲区坐标为

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  (x,y)

  需要绘制的对象列表为一维数组

  object array[count];

  最终获取选中的对象的栈

  objstack;

伪代码如下:
color old = buf[y][x];buf[y][x] = trans; for( int i = 0; i  count; i++ ){ draw(array[i]); if( buf[y][x] != trans ) {   old = buf[y][x];   buf[y][x] = trans;     objstack.push(array[i]); }}buf[y][x] = old;

  完成这个步骤之后,objstack中保存的就是按照绘制顺序排序的,鼠标下面所有对象的集合。你只要从中提取需要的对象就可以了。

来源:http://www.tulaoshi.com/n/20160219/1612702.html

延伸阅读
可可游戏中心怎么充值   这里将是您专属的游戏乐园!为您提供最新最热的游戏下载;最火最前沿的游戏资讯;还有各种拿不完的游戏礼包和丰富多样的精彩活动。玩游戏、查攻略、赚N豆、赢可币,还能和全国各地的小伙伴一起分享你的喜悦。快乐就在指尖! 充值方法介绍 登录个人中心,选择充值后,应该是有如下图的界面的,如果...
手机QQ游戏中心在哪? 1)打开手机QQ软件,进放QQ主界面。    2)点击右下方的动态,打开后可以看到新增的游戏中心,目前登陆QQ手机版游戏中心的只有一款,据腾讯方介绍,后续还将陆续推出11款游戏,给用户更多游戏选择。    手机qq游戏玩耗流量吗? 使用手机qq在没有wifi环境的情况下是会消耗流量的,具体...
标签: 宝宝
如何在游戏中锻炼宝宝的小腿 宝宝的生活世界由三个镜头构成的,睡眠、饮食以及运动,彼此交替、昼夜上演。其中的运动画面,随着宝宝年龄的增加,出现频率越来越高,活动量也越来越惊人。育儿中小宝宝的动作如果发展得好,可以促进神经、肌肉以及骨骼的生长,对自我体形的建立,及对外在环境的认识均会有帮助。 训练小儿支撑身体的臂力,以及...
看了几小时绝命毒师后,我对这个电视剧产生了浓厚的兴趣,于是乎,自己动手做了一个简单的矢量图。嗯,没错,就是那辆大名鼎鼎的旧房车流动的实验室。 《绝命毒师》(Breaking Bad)又名《制毒师》、《超越罪恶》,是一部由美国AMC电视台制作的原创犯罪类系列电视剧。该剧讲述了一位普通高中化学老师,在得知自己身患绝症的情况下,为了给家人留...
标签: PS PS基础
先看看最终效果吧 我只是一个半路出家的学生.这些只是我平时画画多次尝试积累下来的经验.希望大家有用.同时假如大家有更好的表现手法或者我的作品里存在的问题.希望大家提出~~ 那么我们开始吧 首先用使用自己习惯的透明度的黑色画笔大概描绘出其形态.(我使用的是30%不透明度.30%填充度的喷枪钢笔不透明画笔 添加细节.画出其明暗.(...

经验教程

888

收藏

51
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部