理解游戏开发中的绝对位置和相对位置

简介: 本文主要内容带你彻底理解游戏开发中的绝对位置和相对位置的区别。如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列视频教程,它会手把手的教你做出自己的第一个小游戏。开始之前,推荐一下我的视频号,每天分享一点儿与做游戏有关的有用有趣的内容,欢迎大家关注一下。本文的内容主要也是对这期视频内容的应用和解释。

开始之前,推荐一下我的视频号,每天分享一点儿与做游戏有关的有用有趣的内容,欢迎大家关注一下。本文的内容主要也是对这期视频内容的应用和解释。


在游戏的世界中存在着两种位置,一种叫做绝对位置,一种叫做相对位置。在不同的游戏开发工具中这两种位置分别有着不同的别名,绝对位置有时也叫世界位置,或者 world position,而相对位置也叫本地位置(局部位置),或者 local position。


理解这两种位置的不同对于游戏开发者来讲是很重要的,尤其是在处理与位置相关的问题时。


今天,我们就以一个示例来彻底的理解这两种位置的区别。



如图,是小游戏制作工具中的场景编辑区,在场景编辑区的两侧包含标尺,从标尺可以看出游戏屏幕的中点就是整个游戏世界坐标系的起点(不同的游戏开发工具起点可能不同,例如 CocosCreator 中的起点就是游戏屏幕的左下角)。通常我们所说的一个物体的位置,都是指的物体在游戏世界坐标系中的位置。例如当前的红色的小球的位置坐标为 (100, 100),指的就是红色小球在世界坐标系中位置。


接下来,我们做个小实验,下方有两个小方块,一个蓝色一个绿色的,我们会将蓝色的方块位置设置在红球的绝对位置,然后将绿色的方块的位置设置在红球的相对位置。看一下结果会怎么样。



蓝色方块的积木。


红色方块的积木。


运行一下看看结果。


蓝色方块和绿色方块都被设置到了相同的位置上,可见,此时不论是我们设置绝对位置还是相对位置,结果都一样。



接下来我们做一些调整。



如图,我又增加添加了一个绿色的小球,并且将这两个小球打包到了一个容器中。


修改一下蓝色和绿色方块的积木,这一次分别将它们设置到绿色的小球的绝对位置和相对位置上。


蓝色方块积木。


绿色方块积木。


再次运行一下看看结果。



这下出问题了,蓝色的方块(设置为小球的绝对位置)正确的设置在了小球的位置,但是绿色的方块(设置为小球的相对位置)却没有被设置到小球的位置。


这是为什么呢?为什么在第一个例子中,我们设置的绝对位置和相对位置都相同,但是在第二个例子中这两个位置却发生了差异呢?


这是因为在第二个例子中我们将球放进了容器中,这导致了计算相对位置的坐标系发生了了变化。



如图,绿球的相对位置变为了以容器中心为原点的坐标系中的位置。



其实可以这样理解,绝对位置就是物体在世界坐标系中的位置,而相对位置就是物体在本地坐标系中的位置。世界坐标系在游戏世界中是恒定不变的,但是本地坐标系是可能随时变化的。


所以第二个例子中的绿色的方块之所以位置会出现在那里,是因为我们将绿色方块在世界坐标中的位置设置成了绿球在本地坐标中的位置。


对于游戏开发新手来讲很容易搞混这两种位置的区别,因为当只有一个物体时,这个物体的相对位置和绝对位置是一样的,所以这两种位置经常会被混用,也不会出现问题。但是当需要处理容器中的物体位置时,就要格外注意区分这两者的区别了。一旦用错,游戏中的物体位置就会出现问题。


如果你对游戏开发感兴趣,欢迎关注我,如果你有对游戏开发感兴趣的朋友,也欢迎把这个系列文章推荐给他。

欢迎玩一下我的小游戏作品:精致1010,一个很不错的小游戏哟~

精致1010

一个很不错的小游戏~

小程序


有任何的想法或者疑问,欢迎添加我的微信,我会尽可能的为你提供帮助。

相关文章
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
2568 0
|
算法 Java Linux
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
这篇文章讨论了在Linux环境下使用Java Graphics2D合成图片时遇到的中文显示问题,并提供了解决方案,包括如何在Linux系统中添加中文字体库。
218 1
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
|
算法 关系型数据库 MySQL
揭秘MySQL中的版本号排序:这个超级算法将颠覆你的排序世界!
【8月更文挑战第8天】在软件开发与数据管理中,正确排序版本号对软件更新及数据分析至关重要。因MySQL默认按字符串排序版本号,可能出现'1.20.0'在'1.10.0'之前的不合理情况。解决办法是将版本号各部分转换为整数后排序。例如,使用`SUBSTRING_INDEX`和`CAST`函数从`software`表的`version`字段提取并转换版本号,再按这些整数排序。这种方法可确保版本号按逻辑正确排序,适用于'major.minor.patch'格式的版本号。对于更复杂格式,需调整处理逻辑。掌握此技巧可有效应对版本号排序需求。
445 3
|
开发工具 git
git大小写规则造成的问题
git大小写规则造成的问题
git大小写规则造成的问题
|
Kubernetes 前端开发 API
微服务从代码到k8s部署应有尽有系列(十、错误处理)
微服务从代码到k8s部署应有尽有系列(十、错误处理)
|
存储 安全 搜索推荐
这些年在阿里学到的方法论
本文从做事方法、思维方式、目标管理、数据分析、用户增长几方面介绍了相关的方法论,希望能给读者带来一些帮助!
18563 15
|
存储 Linux
scRNA分析|多样本merge 和 harmony去批次
scRNA分析|多样本merge 和 harmony去批次
1270 0
|
传感器 边缘计算 运维
基于 OpenYurt & EdgeX Foundry 的云边端一体化解决方案
近日,OpenYurt 与 EdgeX Foundry 社区合作,完成了集成对接:从 v0.5.0 版本开始,OpenYurt 将正式支持部署和管理 EdgeX Foundry,并以云原生的方式管理端设备,双方将共同帮助开发者轻松、高效地解决物联网边缘计算场景下端设备管理和运维的挑战。
基于 OpenYurt & EdgeX Foundry 的云边端一体化解决方案
|
存储 物联网 人机交互
BT+WIFI双模芯片——W800开发板上手体验
开发资料获取方式:https://occ.t-head.cn/——搜索w800——点击搜搜出来的结果——资源下载——其中包含了所需要的主要资料。其中《W800快速上手手册》最为详细
BT+WIFI双模芯片——W800开发板上手体验
|
API PHP
PHP快递查询API接口,有需要的可直接用
PHP快递查询API接口,有需要的可直接用
383 0