本文首发于微信公众号: 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。

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

最近一直在录制视频教程,很少写图文教程,难免有些生疏。一项技能练习多了就会熟练,练习少了就会生疏,为了防止写作技能的生疏,还是隔三差五的写一点儿为好。

在屏幕的任意位置按住拖拽,然后控制屏幕中指定的精灵移动,这个前几天@stack发过一个示例,刚好最近又有几位同学来问,说是看不懂其中的逻辑。索性就在这里详细的讲一下,原理很简单,理解透了原理,其中的积木逻辑也就很容易理解了。

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

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

首先创建几个全局变量。

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 指的是屏幕四个边缘的间隙,你完全可以根据游戏的需要,单独设置左右两侧和上下两侧的间隙。

回顾一下,想要自主的实现这样的一个控制移动方法,对于开发者来讲都需要具备哪些东西。

首先,你要知道偏移位置,相对位置这些概念,然后才能看透其中相对移动的原理。

接着,你需要了解开发工具,知道在游戏世界中,坐标系的中心位于屏幕的中间,你需要知道哪些积木能处理手指在屏幕上事件,哪个积木能获得屏幕的宽度/高度,哪些积木能够进行数学运算等等。

第一点,对于原理的理解,需要你能将游戏进行简单的抽象化处理,找到其中的数据模型,再利用一些数学知识找到解决方法。

对于这一点,没有什么好的方法,只能通过多练习,另外要克服对于数学的恐惧,其实真的是没有多少高深的数学知识(尤其是对于2D游戏来说),加减乘除,加上个三角函数基本上就能应对大部分问题。

还有就是我之前反复提到过的,很多功能背后的原理都想通,做的多了你就能够发现这种规律,也就能够做到,即使是遇到一个从没做过的功能,你也能够发现它其实跟你曾经做过的某个功能是相似的,而它们背后原理大概率都是相通的。

第二点,对于开发工具的熟练度也非常的重要。当你原理懂了,方法也找到了,但是却发现工具不会用,这个还是很尴尬的。如果说原理方法是一件事情的前半部分,那对于工具的使用就是后半部分,两部分组合起来才能把一件事情做成,熟练的使用工具能够帮助你快速的验证和实现自己的想法。

至于工具如何熟练呢?就一个字“用”,或者三个字“使劲用” !

在屏幕的任意位置拖拽,控制精灵移动相关推荐

  1. Unity3D鼠标&Touch拖拽控制节点绕任意轴旋转的实现

    这个拖拽最明显的一个优点就是有阻尼的效果 阻尼(damping)是指摇荡系统或振动系统受到阻滞使能量随时间而耗散的物理现象 using UnityEngine; using System.Collec ...

  2. js实现表格列的位置拖拽

    转载请注明出处:http://blog.csdn.net/sllailcp/article 公司突然出了新需求,拖拽表格的列到指定的列,去网上找了下,没有合适产品需求的,就自己写了个小功能. 具体功能 ...

  3. three.js 控制动画进度 进度条拖拽控制

    2022-04-07 最新发现 之前的方案会因为拖拽过快 计算遗漏导致最后几帧的模型一直停留 解决方案也很让我难以接受只需要几行代码即可

  4. C语言在屏幕的任意位置输出字符

    初学编程的读者,肯定很想编写出一个游戏来秀一下,贪吃蛇就是C语言小游戏中经典的一个,本教程的目标也是带着大家做出这款游戏,你可以猛击<C语言贪吃蛇游戏演示和说明>了解更多. 编写游戏的第一 ...

  5. MovieClip实现拖拽等移动位置的功能

    今天我已经实现了对加载的MovieClip移动位置的功能,包括上.下.左.右移动功能.充满容器功能.1:1还原初始位置功能和鼠标拖拽移动功能.但是,移动位置的功能总体上仍旧存在一个问题:无法控制垂直滚 ...

  6. div内图片和文字水平垂直居中且在屏幕任意位置

    有这样一个需求: 要求将文字与icon作为一个盒子,盒子内文字与icon水平垂直居中,且盒子可以放在屏幕的任意位置:比如左侧或者右侧或者居中,且具有响应式的特点. 思路如下: 首先,用一个div包裹两 ...

  7. html手机模块化,jQuery 移动端拖拽(模块化开发,触摸事件,webpack)

    通过jquery可以很容易实现CP端的拖拽.但是在移动端却不好用了.于是我自己写了一个在移动端的拖拽demo,主要用到的事件是触摸事件(touchstart,touchmove和touchend). ...

  8. Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等

    Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等 目录 Unity 基础 之 在 UGUI 上简单实现VideoPl ...

  9. vue 组件封装——可自由拖拽移动的盒子

    最终效果 完整代码 关键性要点,详见注释 组件封装 superBox.vue <template><divref="box_Ref"class="box ...

最新文章

  1. 如何提高3D点云目标检测的难例精度?
  2. Nginx + Node + Vue 部署初试(修改)
  3. html打印边距影响内容大小,关于web打印的问题,如何控制纸张大小和页边距
  4. python类的属性和对象属性_python 类属性、对象属性-阿里云开发者社区
  5. [导入]ExtJs 2.0 公司工程化应用的最佳实践(二)
  6. UIViewController 之LoadView详解
  7. windows安装tensorflow GPU
  8. xftp找不到匹配的outgoing encryption 算法 怎么解决
  9. 谈谈你对TCP三次握手和四次挥手的理解
  10. 图像处理中的二阶矩矩阵(结构张量)
  11. matlab中beta是什么软件,软件版本中的beta是什么意思?
  12. html语言间距怎么设置,HTML文字的间距怎么设置
  13. QCC3040---system state module
  14. dell灵越笔记本后盖怎么拆_如何拆卸Dell Inspiron 15 5570笔记本电脑并安装M.2 SSD
  15. 关于VM开启黑屏的解决方法
  16. 提莫攻击 findPoisonedDuration
  17. android jdk和ndk下载地址,cocos2d-x Android(SDK,NDK,JDK,ANT)下载地址
  18. python报错ValueError: Found input variables with inconsistent numbers of samples: [x,y]
  19. Graphite详解
  20. flash_tools安装及使用完全教程

热门文章

  1. 微信小程序车辆登记+后台管理系统
  2. 关于零基础入门金融风控挑战赛的笔记系列
  3. Mysql8.0 子数据库账户及密码创建和赋权
  4. 第一篇:详细介绍三次握手和四次挥手
  5. python游戏辅助lol_Python爬虫实战,60行代码爬取英雄联盟全英雄全皮肤,找寻曾今那些被删除的绝版皮肤...
  6. 查看QQ空间秘密的发布时间
  7. chrome 查看日志
  8. java 版本区别,java SE是什么,下载JDK时各个名称的含义
  9. UE4 EQS C++自定义节点编写
  10. 浅谈framework之PowerManagerService