输入系统

本贴最后更新于 2570 天前,其中的信息可能已经沧海桑田

流星的输入和招式的原理分析
以下都是个人推测并非事实

输入系统代码已经 OK,能正常使用

此文章是按照知乎
格斗游戏的招式指令实际代码是如何判断的? 提问里 Thinkraft 的回答来分析的,流星应该也是这个原理设计的

输入是 2 下 4 左 6 右 8 上 以及 攻击 J 组成的,在游戏开始的时候角色切换到 Idle 动作,在这个动作下,可以往很多动作切换
在 Idle 动作下可输入 8 8 让角色前冲 同理还有左闪 右闪 后闪 那么当按下 8 8 时 是如何识别到底是输入前冲 还是输入匕首的 88J 呢 88J 是 匕首上上攻击

从游戏测试,可得到 如果在输入 88 之后,等待几帧再输入 J,会出现,角色先前冲,之后在前冲动作结束前,切换到 88J 动作
这表明了,这二个招式,都满足而且识别了,更说明了,一个输入,对应的输出动作,可能是多个(因为 88 动作和 88J 动作 2 者共享了 2 个 8 按键),而如果像把输入缓冲区当作树处理那样,那么头节点确定了,子节点确定了,那么就唯一对应了一个输入,就不会同时触发 2 个动作
这个是有本质区别的,区别在于对输入的缓冲的识别
A 处理方式是集中处理,所有招式查询一个输入缓冲区,任意一个较短的输入(88)满足了,可能长的(88J)就会被截断而不执行了,如果短的满足了却不删除输入缓冲区,那么没办法确定什么时候该删除缓冲区并重置状态。
B 方式是每一个招式都有自己的输入状态,让输入状态按照每次的按键输入更新,那么当动作 88 自己的状态满足了,那么同时动作 88J 的状态处于等待 J 按键 也就是和 88 一样拥有 2 个 8 按键输入,而且这个时候会执行 88 动作,并且重置 88 动作的输入状态为初始状态
而若在 88J 动作等待 J 按键开始后的 N 帧之内,若输入了 J,那么 88J 满足,就输出 88J 动作,而若超过了限定的 N 帧,那么会重置 88J 动作的状态,也就是 88J 动作清除掉 88 的输入,因为在期望得到输入 J 的时间段内没有等到 J 输入

而原先设计的时候,是想针对当前动作包含的所有下一个可连接招式集合,做一个招式输入状态更新,也就是在任意当前动作下,能转到的目标动作会有一个集合,这个集合一共接收多少种输入招式,就用这些招式形成一个接受输入的,每一次输入,都遍历里面的每一招
让每一招更新自己的输入缓冲,任意一个长的招式识别了,就不在遍历,而直接输出。

有一个问题是(需要怒气的大招没有怒气时全部会变成普通攻击,这一点是在无怒气状态下,使用大绝或者小绝,都只会触发攻击,而不会触发其他招式推测的,类似匕首 288J 大招 与 88J 具有重叠,按常理,使用不出 288J 只会重置 288J 动作的状态,从而执行 88 与 88J,可是游戏里不是这样,那么只有当 288J 没有怒气的时候,重置全部招式的状态,并且执行普通攻击才符合游戏现在的样子)。

另外还有一个特殊例子,就是流星里一个防御取消跳的,原作应该是一个 bug,就是按住跳后不要松开很快按住防御键,那么防御按下后,就会立即切换到防御,如果松开防御,这时会自动的跳起来。而不用松开跳键
这说明跳具有一个延迟响应的设定,为什么这么说,因为其他动作,按下时刻就已经触发,而不会等待,而跳跃是比较特殊的动作,他有一个类似压力反馈的机制,就是原作里,跳跃是有轻重的,是通过按住跳,在很短的几帧内(10 帧左右)如果抬起跳,那么会进入低段跳或者小跳(最少等待这么多帧,并且松开了就立即执行低段跳),而按住时间超过了这个 10 帧,会认为是一个完整的跳,也会立即执行跳(完整跳最少要等这 10 帧),这也是说,按住跳的(OnKeyDown)时刻,系统在等,等你在 10 帧以内是否释放跳按键,如果释放了,就会有一个跳跃高度的缩放比例,来减少跳跃高度模拟一个低段跳,而超过这个 10 帧,则是一个完整的跳。
而原作的跳还有最极端的跳,就是 0 高度跳跃,这个就是小跳,这个小跳触发的情况,应该在按住跳之后,设定一个帧数,在经过这么多帧之前只要释放跳按键,就是小跳,而这个帧要比之前的 10 小,假设是 5,那么 按住跳之后 1-5 帧以内释放则产生小跳
6-10 帧之内就按照 比例算完整跳的缩放比,完整跳,高度是 75,小跳高度是 0 低段跳,按照比例算 75 的百分比
当释放防御键时,跳招式会恢复更新状态,那么延迟响应的动作跳,就会更新自己的计时器,判断,当前按住跳的时间已经超过了 10 帧,那么就会触发跳而不用抬起跳键,还有一点,是在按住防御的过程中,释放了跳 OnKeyUp,那么跳招式的输入缓冲区,会被刷新,要么识别了跳但是从当前防御动作是无法切到跳跃动作的,要么就是直接的重置了跳动作的输入缓冲区,从而使之后释放防御后,无法触发跳

现在的代码招式识别都是写死的,是按照行号,对应招式,来进行一个判定的,也没有对每个招式维护一个自己的缓冲,所以说代码架构非常的垃圾,就是不知道能不能改成上面说的这样,首先的问题是,原作里 character.act 文件里的行号,到底意味着什么。
因为一个行号,可以对应一个 group,这个 group 是一个招式,或者多个招式,也就是说,某一行,既能算作输入 A 招式,也可以算作输入 B 招式,只有当前动作的可切换动作集合里包含了当前输入的招式,才可以切换
而且不同行号,可能输入也会一致,就是因为武器系统的原因,拿刀的下上 A 28J 和拿剑的 下上 A 28J 还有拿匕首的 都是同一个输入,但是行号却不一样,所以对应的招式输出也不一样
如果要改成每个招式都维护自己的输入状态,那么是针对每个 pose 维护自己的输入状态,还是每个行号维护自己的输入状态,还是对每一种输入维护自己的输入状态呢
在这个游戏里的输入 忽略防御 跳跃 只看攻击招式有(单个方向键或者仅方向键构成的招式,是由普通输入识别方式识别的,连招和普通攻击另外用连招输入识别方式 ,因为攻击会依据武器来算 Pose)
J
2J
4J
6J
8J
22 删
44 删
66 删
88 删
22J
88J
28J
82J
46J
64J
462J (刀大绝)
246J(双刺大绝)
468J (剑大绝)
228J (枪前砸)
288J (枪匕首大招)
888J (枪破防绝)
似乎就这么多了
但是每一个呢,又可能包含不同的行号
不同的行号,可能对应同样的输出,因为武器不同,这使得如果装备了不同的武器用同样的输入,得到的是不同的行号。
关键是现在怎么解决这个问题

想到的解决办法是,用输入项 就是以上列举的这么多项,把每个符合此输入的行号放到一个集合里(这一步是人工的),当有此输入时,一个个集合里的行号就依次去测试这个行号包含的全部动作。而每个行号拥有多个动作,就会从第一个动作遍历到最后一个,查到任意一个动作,在当前动作的可切换目标动作中,那么就调用此动作,同时还要重置此输入项的状态

还有一个问题就是,输入帧限定,限定的是任意时刻都允许更新连招缓冲区,但是出招前必须看是否在输入限定帧范围内,这样会使得能够成功输入招式,但是无法使用招式,而不会出现没法办成功输入招式。
还有一个问题就是,可以缓存输入指令,让一些动作一旦到达切换帧,就可以立即识别,类似格斗游戏里的提前输入,等前一个动作刚完,就立即使用招式。

那现在首先要做的是 把招式对应的行号,写到 xls 表里,程序开始读取这张表,然后根据表的每一行,创建一个输入状态,整个表的所有行构成整个输入状态构成输入模块,在动作的限定输入帧之间,更新输入模块的每一项的输入状态。一旦有一个满足了输入,那么就会遍历输入状态里所有行号的所有动作,去测试当前动作是否含有切换到所有行号包含的任意一个动作,如果含有,那么就测试该动作能否执行(怒气值,武器等外部条件的判断),(不存在一个动作可以调用同样招式的 2 个动作,设计阶段避免)

那么现在思路一切清晰,下一步开始写代码

调了一天代码终于 OK,动作输入能准确识别了
遇见的问题还是多个动作都成立的问题
类似 288A 同时会使 288A 动作 88 动作 88A 动作 3 个动作都成立,怎么知道想调用的到底是哪个动作,现在的做法是,一旦长动作识别了,就不会继续对短动作进行识别,这个方法可能会有问题

武器行号使用表
飞镖
1, 2, 3, 4, 85, 87, 143, 144
火铳
5,6,7,8,147
飞轮
9, 10, 11, 12,145,146
双刺
[13-24], 148,149
匕首
[25-34],84,88,150

[35-47],151, 152

[48-60],153,154

[61-72],155,156
锤子
[73-83],157,158
乾坤
[89-106],159,160
指虎
[107-121]
忍刀
[122-142]
中间缺少了 86【爆气 pose 367】
一共 160 个行号,每个武器有自己对应的行号,每个行号负责这个武器的一部分招式
这样子,当处于一个攻击 Pose 的时候,完全可以知道这个 Pose 在哪一行,这行归属于哪一种武器处理

现在的动作问题
1,远程武器的处理
枪需要进入预备姿态才能开始发出招式
飞轮需要用代码控制攻击过程
2,动画位移是自己控制,还是从动画读取,要怎么配合重力
现在从动画读取位移,发现动作表现和实际游戏不一致,匕首原地跳空中下刺,动画位移 Y 轴下 68,向前 18,游戏中原地跳下刺 Y 轴一直到地面约 75,向前 3 左右.可见若读动画位移,那么是错的
可是若自己设定,原游戏中仅有 Menu.res 存储了招式的攻击力,却没有说明位移多少,是否忽略重力等。难道每个动作的各个阶段都是程序里写死的。我想应该不会吧。
3 乾坤刀涉及到 3 个武器姿态的转换,会导致同武器不同模型切换

而最大的问题是重力和动作位移。还有轻功。这部分解决了就可以打怪了,再后面就是怪物 AI,关卡剧本,关卡的机关,怪物设定,关卡与关卡间的连接
主线和支线,道具和装备,buff,技能,佣兵,职业,相机特写,赏金首设定,(合成,强化,重铸)可能加一部分,商店,Npc,固定功能点(武器店(武器及其他装备),杂货店(材料-药品),客栈)
(合成,重铸,强化都需要 NPC 和建筑),还有存档点,还有这么多,啊西吧

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 51 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 724 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖 • 1 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    408 引用 • 3574 回帖
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 2 关注
  • abitmean

    有点意思就行了

    29 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 2 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    85 引用 • 139 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 488 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 6 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 47 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 510 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 700 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    75 引用 • 1737 回帖 • 5 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖 • 1 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 73 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 670 关注
  • 导航

    各种网址链接、内容导航。

    40 引用 • 173 回帖
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 4 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 595 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 1 关注