在游戏的世界中存在着两种位置,一种叫做绝对位置,一种叫做相对位置。在不同的游戏开发工具中这两种位置分别有着不同的别名,绝对位置有时也叫世界位置,或者 world position,而相对位置也叫本地位置(局部位置),或者 local position。
理解这两种位置的不同对于游戏开发者来讲是很重要的,尤其是在处理与位置相关的问题时。
今天,我们就以一个示例来彻底的理解这两种位置的区别。
如图,是小游戏制作工具中的场景编辑区,在场景编辑区的两侧包含标尺,从标尺可以看出游戏屏幕的中点就是整个游戏世界坐标系的起点(不同的游戏开发工具起点可能不同,例如 CocosCreator 中的起点就是游戏屏幕的左下角)。通常我们所说的一个物体的位置,都是指的物体在游戏世界坐标系中的位置。例如当前的红色的小球的位置坐标为 (100, 100),指的就是红色小球在世界坐标系中位置。
接下来,我们做个小实验,下方有两个小方块,一个蓝色一个绿色的,我们会将蓝色的方块位置设置在红球的绝对位置,然后将绿色的方块的位置设置在红球的相对位置。看一下结果会怎么样。
蓝色方块的积木。
红色方块的积木。
运行一下看看结果。
蓝色方块和绿色方块都被设置到了相同的位置上,可见,此时不论是我们设置绝对位置还是相对位置,结果都一样。
接下来我们做一些调整。
如图,我又增加添加了一个绿色的小球,并且将这两个小球打包到了一个容器中。
修改一下蓝色和绿色方块的积木,这一次分别将它们设置到绿色的小球的绝对位置和相对位置上。
蓝色方块积木。
绿色方块积木。
再次运行一下看看结果。
这下出问题了,蓝色的方块(设置为小球的绝对位置)正确的设置在了小球的位置,但是绿色的方块(设置为小球的相对位置)却没有被设置到小球的位置。
这是为什么呢?为什么在第一个例子中,我们设置的绝对位置和相对位置都相同,但是在第二个例子中这两个位置却发生了差异呢?
这是因为在第二个例子中我们将球放进了容器中,这导致了计算相对位置的坐标系发生了了变化。
如图,绿球的相对位置变为了以容器中心为原点的坐标系中的位置。
其实可以这样理解,绝对位置就是物体在世界坐标系中的位置,而相对位置就是物体在本地坐标系中的位置。世界坐标系在游戏世界中是恒定不变的,但是本地坐标系是可能随时变化的。
所以第二个例子中的绿色的方块之所以位置会出现在那里,是因为我们将绿色方块在世界坐标中的位置设置成了绿球在本地坐标中的位置。
对于游戏开发新手来讲很容易搞混这两种位置的区别,因为当只有一个物体时,这个物体的相对位置和绝对位置是一样的,所以这两种位置经常会被混用,也不会出现问题。但是当需要处理容器中的物体位置时,就要格外注意区分这两者的区别了。一旦用错,游戏中的物体位置就会出现问题。