如何在屏幕的任意位置拖拽控制图片的移动?

简介: 如何在屏幕的任意位置拖拽控制图片的移动?

嗨!大家好,我是小蚂蚁。


很多的小伙伴在做游戏的时候有这样的需求,如何在屏幕的任意位置按住拖拽,然后控制屏幕中指定的角色移动。这篇教程我们讲一下其中的原理,理解透了原理,其中的实现就很容易理解了。


如图,有一个小飞机,你可以点击屏幕上的任意位置,开始拖拽,控制飞机的移动,而且飞机不会移出屏幕区域。

我们来看一下其中的实现逻辑。

首先创建几个全局变量。

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 到其中的实现原理了吗?

相关文章
|
6月前
【实现手机端上滑滚动加载列表】判断页面是否滚动到底部或者指定元素位置
【实现手机端上滑滚动加载列表】判断页面是否滚动到底部或者指定元素位置
|
6月前
|
Windows
Keil5中恢复默认布局-解决左边栏,底部栏位置不是默认布局
Keil5中恢复默认布局-解决左边栏,底部栏位置不是默认布局
581 0
|
6月前
VSCode如何自动换行,右侧换行间距长度,隐藏右侧代码预览(Minimap代码缩略图滚动条),比对代码差异窗口也自动换行
VSCode如何自动换行,右侧换行间距长度,隐藏右侧代码预览(Minimap代码缩略图滚动条),比对代码差异窗口也自动换行
|
6月前
|
定位技术 iOS开发
在地图页面,自动布局控件开始是隐藏或在屏幕外需要正常显示时再为正常的显示状态的,需要在显示之前加入
在地图页面,自动布局控件开始是隐藏或在屏幕外需要正常显示时再为正常的显示状态的,需要在显示之前加入
49 0
|
前端开发 JavaScript 容器
JavaScrpit如何实现弹出遮罩层后将页面固定到当前位置且无法继续滚动
JavaScrpit如何实现弹出遮罩层后将页面固定到当前位置且无法继续滚动
74 0
|
6月前
|
开发工具 开发者
在屏幕的任意位置拖拽,控制角色移动
在屏幕的任意位置拖拽,控制角色移动
65 0
|
6月前
【sgDragMove】自定义组件:自定义拖拽组件,仅支持拖拽、设置吸附屏幕边界距离。
【sgDragMove】自定义组件:自定义拖拽组件,仅支持拖拽、设置吸附屏幕边界距离。
|
编解码 前端开发 PHP
悬浮坐标解决方案:如何在图片获取xy鼠标位置和增加标注信息
悬浮坐标解决方案:如何在图片获取xy鼠标位置和增加标注信息
159 0
|
开发工具 开发者
在屏幕的任意位置拖拽,控制精灵移动
在屏幕的任意位置按住拖拽,然后控制屏幕中指定的精灵移动,这个前几天@stack发过一个示例,刚好最近又有几位同学来问,说是看不懂其中的逻辑。索性就在这里详细的讲一下,原理很简单,理解透了原理,其中的积木逻辑也就很容易理解了。
115 0
布局之悬浮显示更多文本并增加箭头指示效果
布局之悬浮显示更多文本并增加箭头指示效果
126 0
布局之悬浮显示更多文本并增加箭头指示效果