各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊。

在这一篇中,我们将会自顶向下地讨论本2D游戏中主角不可或缺的一个功能——移动控制。

首先我们简单分析一下2D游戏中主角与移动相关的需求。最主要的,主角应该接受玩家WD或者左右箭头的输入,以进行水平方向上的移动;应该接受玩家跳跃键的输入,以进行跳跃的动作;我们暂时把这一类移动需求称为玩家控制位移。除了玩家控制位移,主角还可能收到某种机关、怪物的被动位移,比如击退效果、牵引效果等等,这一部分,我们把它称为被动位移。同时,作为一个主打战斗的2D游戏,技能是必不可少的部分,部分技能可能也有位移效果,比如冲刺技能,跳跃技能,有后座力的技能等等,对于这一部分移动需求,我们把它称为技能位移。除了移动需求,与之类似的还可能有传送需求,不管是主动的还是被动的。上面所说的大概就是与位置移动有关的需求。当然,考虑一个游戏项目的需求是远远不够的,因为我们永远无法“确定”一个游戏究竟是什么样子的,我们现在所要做的,就是从上面所提到的主体需求提炼出一个有效且“可扩展”的框架,以便以后出现需求变更我们现有的框架能够比较容易的容纳之。

有了思路,我们就应该分析一下以上几种移动需求的异同点,并考虑一个实现方法。

对于玩家控制位移,主角根据玩家每一帧的输入进行响应移动;对于击退、击飞等被动位移,我们希望主角在一定时间内移动指定距离,并在这个时间内玩家无法进行操控;对于类似风场的牵引效果,我们希望能够在主角的现有位移上每帧叠加一个向心位移量;对于技能位移,我们也希望主角进入和击退等状态相同的状态。

从这种角度考量,主角的移动大致可以分成以帧为单位进行的,以及以给定时间位移量为单位进行的两种。同时,存在不同的位移状态之间存在互斥关系,比如在技能位移状态下,就无法进行玩家操控,也无法收到来自外界的被动位移效果等等;也存在位移状态是叠加生效的,比如牵引效果等。针对这种需求,我们使用四个数组列表来实现目标需求:

其中,两个互斥列表用来获得当前帧的“主要位移量”。主要位移量叠加两个叠加列表所有记录项的位移和,产生当前帧的总位移。

关于主要位移量的优先选择问题,我们应该存在一个优先级排序,使得当多个主要位移量需求同时存在时,我们可以选出一个优先级最高的位移。我们可以用一个指针列表表示:

除此之外,时间-距离位移量还需要一个计时器来保证这个位移状态在我们想要让他失效的时候不再生效,所以最后,我们的主要数据结构示意图变成了这样:

除了主要的数据结构,我们还应该定义一系列方法来操控这些数据结构,但是话都说到这个份上了,我们也不再往下分析了,各位看官各取所需,定义自己的管理方法就好~

在这个数据结构栈中,我们把位移需求抽象成两种主要的实现方式:每帧进行和按时间进行,对于这两种方式我们构建了若干个列表予以储存,当我们需要查看当前帧主角的移动情况时,我们通过找一个主要位移量并叠加若干个叠加位移量来实现。当我们的需求扩展,拥有更多种类的位移需求时,我们只需要扩展这些列表中的项,以及扩展优先级列表即可。

到此为止,我们有了一个相对完善设计和实现思路来达到我们的功能性和灵活性的需求。但是,考虑这样一个情况,当玩家在主角释放技能的状态下释放了另一个技能,我们的程序应该如何响应?应该允许其打断当前释放的技能吗?还是让这个输入无效?或者说,在一组互斥状态下,我们应该如何规定当前状态允许进入哪一种状态,不允许进入哪一种状态。在下一篇中,我们会说明与主角状态控制有关的组件设计,以及状态控制和位移控制是如何搭配对主角的移动及各种状态进行管理的。

那么今天的分享就是这些,欢迎访问:

整个项目原型github地址:

www.gitHub.com/yunshiyue/elementgame

看官有何见解,有何指点,欢迎留言,也欢迎私聊~

Unity2D项目-平台、解谜、战斗! 1.3移动组件的更多相关文章

  1. Unity2D项目-平台、解谜、战斗! 0.1 序言:团队、项目提出、初步设计、剧情大纲

    各位看官老爷们,这里是RuaiRuai工作室(以下简称RR社),一个做单机游戏的兴趣作坊. 本文跟大家聊一下社团内第一个游戏项目.算是从萌新项目组长的角度,从第一个里程碑的结点处,往前看总结一下项目之 ...

  2. Unity2D项目-平台、解谜、战斗! 1.2战斗组件Defence、Attack

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 接上文,我们定义了两个分别具有"攻击"和"被攻击"语义的组件CanFight和CanB ...

  3. Unity2D项目-平台、解谜、战斗! 1.1战斗底层组件CanFight-CanBeFighted

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文对该2D项目中战斗底层组件的开发及设计思路做一个总结,希望各路同行多多交流,各路大佬多多指点. 实例特征分析 首先对于各个 ...

  4. Unity2D项目-平台、解谜、战斗! 0.2 序言:团队在线协作方案、基线控制

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文跟大家聊一下笔者团队中所使用的在线协作的诸多工具,以及使用这些工具的目的和所记录的内容,希望这些内容在大家团队工作中有所帮 ...

  5. Unity2D项目-平台、解谜、战斗! 1.5 Player框架、技能管理组件

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 前文提到,凡是有"攻击"语义的对象,在游戏中,我们给予其一个"CanFight"组件予 ...

  6. eclipse里面构建maven项目详解(转载)

    本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1       环境安装及分配 Maven是基于项目对象模 ...

  7. [转帖](整理)GNU Hurd项目详解

    (整理)GNU Hurd项目详解 http://www.ha97.com/3188.html 发表于: 开源世界 | 作者: 博客教主 标签: GNU,Hurd,详解,项目 Hurd原本是要成为GNU ...

  8. 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)

    在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...

  9. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

随机推荐

  1. Techme Inc热心公益事业 积极开展公益活动

    从2015年起,Techme inc(公司编号:20151524696)便通过优质的产品和服务,帮助顾客实现营养与健康的目标.与此同时,Techme inc(公司编号:20151524696)多年来始 ...

  2. django学习-4.url动态传值

    1.前言 我们在浏览器访问一个网页A是通过一个指定的url地址去访问的.但在浏览器用一个不存在的url地址去执行访问是打不开正确的网页的,只会打开一个浏览器自带的有错误提示的网页. 在django框架 ...

  3. 一文学会Dockerfile语法

    接应上篇,续讲前文.今天咱来聊一下Dockerfile的使用 . 虽然可以通过docker commit命令来手动创建镜像,但是通过Dockerfile文件,可以帮助我们自动创建镜像,并且能够自定义创 ...

  4. winform导出csv

    public void ExportToSvc1(string strFileName) { string strPath = strFileName + ".csv"; Stri ...

  5. ImageApparate(幻影)镜像加速服务让镜像分发效率提升 5-10 倍

    作者介绍 李昂,腾讯高级开发工程师,主要关注容器存储和镜像存储相关领域,目前主要负责腾讯容器镜像服务和镜像存储加速系统的研发和设计工作. 李志宇,腾讯云后台开发工程师.负责腾讯云 TKE 集群节点和运 ...

  6. DRF的封装:APIView类及五大模块

    目录 一.drf框架的封装特点 1.APIView类 二.drf的基础组件 1.请求模块 1.1 请求模块做了什么 1.2 请求request参数 2.解析模块 3.响应模块 4.渲染模块(了解) 5 ...

  7. 【知识点】 gcc和g++的联系和区别

    目前(2020-09)GCC 编译器已经更新至 10.2版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ . 除此之外,当下的 GCC 编译器还支持编译 Go.O ...

  8. PAT-1119(Pre- and Post-order Traversals)+前序和后序遍历确定二叉树+判断二叉树是否唯一

    Pre- and Post-order Traversals PAT-1119 这题难度较大,主要需要考虑如何实现根据前序遍历和后序遍历来确定一颗二叉树 一篇好的文章: 题解 import java. ...

  9. centos安装rar

    wget https://www.rarlab.com/rar/rarlinux-x64-5.5.0.tar.gz tar -xzvf rarlinux-x64-5.5.0.tar.gz cd rar ...

  10. java 递归求二叉树深度

    给定二叉树,找到它的最大深度. 最大深度是从根节点到最远叶节点的最长路径上的节点数. 注意:叶子是没有子节点的节点. Example: Given binary tree [3,9,20,null,n ...