“排序贴图”是源自于物体远近呈现的一种贴图概念。回忆我们之前笔记的贴图思想,先进行距离比较远的物体的贴图操作,然后再进行近距离物体的贴图操作,一旦定出贴图的顺序之后就无法再改变了。
然而这样的作法在画面上物体会彼此遮掩的情况下就会不适用。也许会出现后面的物体反而遮住了前面的物体的这种不协调的画面。为了避免这种因为贴图顺序而固定而产生的错误画面,必须在每一次窗口重新显示时动态地重新决定画面上每一个物体的贴图顺序。
那么,如何动态决定贴图顺序呢?我们可以采用排序的方式。
为了演示排序如何运用在贴图中,我们举一个例子。假设现在有10只要进行贴图的小牛图案,先把它存在一个数组之中,从2D平面的远近角度来看,Y轴坐标比较小的是比较远的物体。如果我们以小牛的Y轴坐标(要排序的值被我们称作键值)来对小牛数组由小到大进行排序,最后会使得Y轴坐标小的小牛排在数组的前面,而进行画面贴图时则由数组由小到大一个个进行处理,这样便可实现“远的物体先贴图“的目的了。
这里我们使用气泡排序(BubbleSort)作为我们的排序法,因为此方法有程序代码简单,排序效率中等,属于稳定(stable)排序法的特点。这里的稳定排序法的特性,会使得Y轴坐标相同的物体,不必再去考虑它X坐标上的排序。
下面我们贴出以C/C++写出的气泡排序法的代码,对”pop[ ]“数组的各数据成员的Y值为键值来排序,输出的参数为”n“表示要排序的数组大小:
各种排序法为C/C++中比较核心的知识点,还不太熟悉的朋友,可以参看各种C++的教程进行深入学习。在这里我就不多做介绍了。
接下来,我们来利用一个范例来演示气泡排序法在画面上贴图的运用,让动画能呈现出接近真实的远近层次效果。这个范例比较有趣,会产生多只恐龙随机跑动,每次进行画面贴图前先完成排序操作,并对恐龙跑动进行贴图坐标的修正,呈现出比较顺畅真实的动画来。
废话这里就不多说了,直接上已经详细注释的代码(这回的代码量就有些大了,不过我专门注释得更详细了些,其实它比之前的代码还更好懂):
程序运行结果如下:
从图中可以看出,由于贴图前进行了排序操作,因此使得恐龙彼此之间没有错误的遮掩。
我们也可以按自己的喜好,通过设定程序中最前面定义的draNum常数值来改变画面上出现的恐龙数目。
笔记十一到这里就结束了。
本节源代码请点击这里下载: 【Visual C++】Code_Note_11
感谢一直支持【VisualC++】游戏开发笔记系列专栏的朋友们,也请大家继续关注我的博客,我一有空就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。
精通游戏开发的路还很长很长,非常希望能和大家一起交流,共同学习和进步。
大家看过后觉得有启发的话可以顶一下这篇文章,让更多的朋友有机会看到它。也希望大家可以多留言来和我探讨编程相关的问题。
最后,谢谢大家一直的支持~~~
Theend