嗨!大家好,我是小蚂蚁。
很多的小伙伴在做游戏的时候有这样的需求,如何在屏幕的任意位置按住拖拽,然后控制屏幕中指定的角色移动。这篇教程我们讲一下其中的原理,理解透了原理,其中的实现就很容易理解了。
如图,有一个小飞机,你可以点击屏幕上的任意位置,开始拖拽,控制飞机的移动,而且飞机不会移出屏幕区域。
我们来看一下其中的实现逻辑。
首先创建几个全局变量。
margin: 用于设置飞机可移动区域与屏幕边缘的间距。这个变量会在判断飞机能不能移出屏幕的计算中使用到。
plane_x: 计算出的飞机的 x 坐标。
plane_y: 计算出的飞机的 y 坐标。
pos_x: 飞机与手指的偏移位置 x。
pox_y: 飞机与手指的偏移位置 y。
接着,来看一下手指在屏幕上按下的逻辑。
什么是偏移位置呢?看下图。
假设绿色棱形表示的是飞机,红色圆点表示的手指在屏幕上按下的位置。此时,我们以红色的圆点为中心构建一个坐标系,那么绿色飞机相对于红色圆点的水平位置(pos_x)就可以使用“飞机的x坐标 - 红点的x坐标”,绿色飞机相对于红色圆点垂直位置(pos_y)就可以使用“飞机的y坐标 - 红点的y坐标”。
这个“偏移位置”或许叫做“相对位置”更确切一点儿,指的就是飞机相对于红点的位置。
因为它们两个之间的相对位置是固定的,所以不论红点移动到哪里,绿色飞机相对于红点的位置都始终不变。
不论手指移动到哪里,只要用手指当前的位置坐标加上“偏移位置”,就能够计算出飞机相对于手指的位置,这个就是点击屏幕任意位置控制飞机移动的原理了。
接着,我们来看一下,限制飞机不能飞出屏幕的原理是什么。
首先,看一下手指移动的积木逻辑。
其中对于屏幕边缘的判断比较难以理解,不过看个图就明白了。
如图,灰色的为屏幕区域,绿色的为可移动区域,屏幕边缘与可移动区域的边缘的间隙就叫做 margin,知道了屏幕的宽度高度,以及 margin 值,就能够计算出可移动区域的宽度和高度。
在游戏中,整个游戏世界的坐标系的中心位于屏幕的中心,也就是说屏幕中心的位置是(0,0),此时我们再来看一下判断条件的积木。
先来看一下左边的部分,plane_x 是飞机当前的位置坐标 x,它的数值可能是正的(在屏幕右侧)也可能是负的(在屏幕左侧),这里使用“绝对值”就可以把两种情况一并包含在里面。
为什么要乘以 2 呢?看下图。
判断公式右边的部分,计算的就是飞机可移动区域的宽度了,这里“场景的宽度”就是“屏幕宽度”。
最后,如果判断出飞机超出了可移动区域,根据飞机的位置坐标(plane_x),设置飞机是位于可移动区域的左侧还是右侧。
上下两侧的判断也是一样的道理,这个就是限制飞机在指定区域移动的原理了。当前示例的 margin 指的是屏幕四个边缘的间隙,你完全可以根据游戏的需要,单独设置左右两侧和上下两侧的间隙。
今天的内容就到这里了,你 get 到其中的实现原理了吗?