我认为ACT游戏开发必用的程序设计模式!!!
ACT游戏以它流畅的游玩体验、华丽的招式和炸裂的打击反馈被人所喜爱,那么在开发ACT游戏的时候如何做到这一点呢???这一篇博客就来说说我认为在开发ACT游戏过程中一定要用到的程序设计模式!
模式_1:状态模式
一般的ACT游戏玩家能做的事情抽象出来无外乎就这几种
举个例子:
《战神4》中玩家能进行的操作全部分解出来:走、奔跑、轻攻击、重攻击、丢斧子、放技能、防御…这些所有操作都可以抽象成上面的三种状态,只是稍微复杂了一些,多了许多的节点,把玩家操作角色、或者是敌人的行为都看成是一个个状态的话,那么在游戏的策划阶段我们就可以在设计角色和敌人的时候,把角色和敌人的行为抽象成一个个状态,只是不同的角色和敌人在相同状态下的不同行为是不一样的,比如《战神4》中的女武神,女武神我记得没错的话只有个别是有防御手段的,但是女武神的AI比较简单,只是单纯的进攻→拉开距离→进攻…一直循环,所以女武神的状态我们大致可分解成两种——移动和进攻
什么是状态模式?
先来说说有限状态机!
1.不同状态之间可以来回切换
2.状态机同一时刻只能处于一种状态
3.状态的转换需要一个触发条件
下面就是一个简单的例子:
当然游戏中角色的状态不可能那么简单,一般的状态有idle、walk、run、jump、attack…等等状态
玩过《尼尔机械纪元》吗?那你一定见过2B小姐姐在idle(空闲)状态下升懒腰的动作。
为什么我们需要状态模式??
有非常多的原因!!
原因1:
游戏中玩家角色只能在同一时间内处于一个状态,攻击、移动、防御状态是分的很清楚的,当然偶尔会出现一些特殊情况,例如《DNF》的强制攻击,我们能在攻击的过程中强制进行其他操作,《仁王》的“残心”系统,一些游戏我们还能举着盾移动,这些游戏机制我们要进行单独的处理。
记得一次我在玩一个单机动作游戏的时候,发现了一个非常低级的BUG(这应该是BUG吧),玩家在使用武技攻击的时候,在攻击过程中竟然是可以跳跃的!!!???
如果我们能在角色设计和程序设计阶段把角色的状态给梳理清楚了,那么就绝对不会出现这种你处于进攻状态却能跳跃的荒诞情况
原因2:
状态机是易于理解的,假如说我们现在有一个团队准备做ACT游戏,在我们设计角色的时候,我们就可以按照状态机的模式来设计,策划决定一个角色的行为,这个角色能跳吗?能跳我们就加一个“jump state”进去,设计好状态机后,程序在大脑中就可以构思代码了,角色动画制作人员也可以更具策划设计的状态机来给角色设计不同的状态下得动作了(当然动作师还得和策划再深入好好谈谈动作具体是什么样子)
原因3:
《血源》中如果当我们处于翻滚状态下或者攻击状态下被敌人击中,那么我们就会承受更多得伤害!没错,一个好的状态机甚至能够衍生出一些游戏玩法。
如何实现状态机??
参考答案:枚举
假如我们把玩家的角色状态设置成枚举,当我们判断玩家状态时,直接switch枚举不就OK了吗?就是这么简单
但是有一个大问题就是,我们如何来控制状态机,因为我们不能够阻止玩家再攻击的时候不去按跳跃键,所以我们就得通过一些列的bool条件来限制玩家的操作,例如canAttack,canJump等等,举个例子——在我用UE4开发原型的时候就用到了大量的macro(宏)来进行玩家操作的限制
补充:这里只提供了一个简单概念和实现方法,状态机远远不止这么一点点内容,状态机也有并发状态机、层次状态机和下推状态机等等,我们也可以为状态机去专门设计一个类去去让状态机的功能更加强大。后续我会继续学习并发博客分享。
模式_2:命令模式
好的动作游戏操作的手感非常重要,你能想象当你在玩《鬼泣》的时候明明按下的攻击键但是玩家操作的角色竟然没有攻击而打断了你SSS评价的情况吗??
什么是命令模式?
考虑这样一个情景,玩家按下攻击间A,那么角色就会攻击,那么逻辑大概是这样的
那么如果我们用命令模式的话那么攻击逻辑会有所变化,就是玩家按下攻击键A之后,程序会把玩家输入的信号先转换成命令“ATTACK”,然后再利用ATTACK命令再去执行攻击操作,大概逻辑是这样的:
为什么我们需要命令模式?
原因1:
之前我们介绍了状态机,在某种情况下,玩家处于某种状态下是不能攻击的,这里再来说一个概念叫做“cancel”,
图片中绿色的那一帧就是“cancel”,意味着我们不用等待这一段攻击动画播放完毕就可以恢复到可以操作角色的状态,因为再攻击的时候是不可以进行其他操作的,之所以把cancel调到后摇前半段是因为为了有时为了连续的combo攻击我们不会等待后摇全部播放完再去进行下一段攻击。
那么这样就会出现一个问题,有的玩家会一直连续的按攻击键,有的老道的玩家则会一个键一个键的操作,但是我们并不能保证玩家一定就精准的在cancel触发之后再按攻击键,玩家的操作有时是会有一定的提前量的!!!!这也是为什么会出现玩家明明按下了攻击键,但是角色不会攻击的情况,这里我们就不能简单的用按下攻击键→角色攻击的逻辑来处理玩家的操作,我们需要在玩家按下操作键之后来把玩家的操作转换成命令,保存下玩家的操作,然后再来判断游戏是否要给玩家的操作给予反馈。
这样我们就通过一种trick的手段来修正了玩家“操作的不精确”,很大程度上优化了操作手感。
原因2:
《拳皇》的一个个招式是如何搓出来的?如果我们把玩家的操作转化成一个个命令,那我们就可以更具命令的组合来判断玩家是否正确的操作出了招式。
原因3:
玩过《黑暗之魂3》的朋友们一定有这样的体验——瞎吉儿翻滚和瞎吉儿乱砍,有一个BOSS叫nameless king,它的攻击有时候是三联段、有时候就只有一段,为什么??——BOSS的AI程序cache了玩家的操作,这一点参考知乎里《战神4》制作组的gameplay程序gougou的一篇文章:
《黑魂的输入“陷阱”》 - gougou槐宏文的文章 - 知乎
https://zhuanlan.zhihu.com/p/75389138
如何实现??
我们也可以把玩家输入的命令转化成一个个枚举变量,然后存入一个队列中去,也可以专门设计一个类,来让命令功能更加的强大。
END
我认为ACT游戏开发必用的程序设计模式!!!相关推荐
- Android游戏开发实践指南(华章程序员书库)
<Android游戏开发实践指南(华章程序员书库)> 基本信息 原书名:Learning Android Game Programming:A Hands-On Guide to Buil ...
- python游戏开发必有套路
游戏开发很简单,只需几个步骤 重点: 控制和显示窗口: pygame.display.方法 必有步骤1:创建游戏窗口 初始化游戏窗口 pygame.init() 设置游戏窗口 必用到p ...
- 2019学unity3d游戏开发必看
当下中国游戏行业以飞快的速度在发展着,游戏用户也越来越趋年轻化,数量也在飞快上涨,而市场上的游戏开发人才是严重不足的.因此,有很多人选择自学unity3d加入到这个行业中来. 大家在进行选择的时候,一 ...
- Laya进行3d游戏开发必了解
laya进行3d游戏开发,需要使用unity导出模型,然后在laya中加载出来,初学者可能这一步会碰到很多问题,这里进行全方位的步骤带你进入laya3D世界 1:首先进入laya官网下载unity插件 ...
- 【游戏开发创新】520程序员的浪漫,给CSDN近两万的粉丝比心心(python爬虫 | Unity循环复用列表 | 头像加载与缓存)
文章目录 一.前言 二.最终效果 三.读取CSDN粉丝列表数据 1.分析粉丝列表页面结构 2.爬数据 四.Unity制作 1.文件读取 2.c#解析json 3.UGUI循环复用列表 4.头像的加载 ...
- ACT游戏开发记录之地图打包工具
地图数据打包工具 关卡属性 背景音乐 显示UI 播放音乐 输入管理 创建UI 创建音效 创建摄像机 关卡地图 预制名称 坐标 旋转 大小 碰撞地图 坐标 旋转 大小 碰撞大小 碰撞偏移 敌人数据 预制 ...
- 为什么游戏开发者不玩游戏_什么是游戏开发?
为什么游戏开发者不玩游戏 Game Development is the art of creating games and describes the design, development and ...
- 【游戏引擎开发必问】 渲染管线的剖析
本篇文章收录于 C++游戏开发的一些高级常识(持续更新) "你对渲染管线了解多少?" 当我听到这个面试题的时候,我是懵逼的.很长时间以前学的图形学知识,虽然看了红蓝宝书,并且熟悉O ...
- java演练 猜奇偶小游戏开发 DB游戏必输的设计
java演练 猜奇偶小游戏开发 DB游戏必输的设计 阶段一,视频 https://www.ixigua.com/6870390946270446088?logTag=J_BVJOm_LIpQ-hWYY ...
最新文章
- 基于Python实现图画转换字符画
- Nature子刊评论:2020年后,微生物组将如何发展?
- ActiveMQ消息中间件的作用以及应用场景
- php 文件 后缀,php如何修改文件后缀名
- 彻底崩溃,一个电脑白痴和黑客的对话!
- ssis什么情况下用到变量_了解SSIS内存使用情况
- MongoDB 在windows shell环境下的基本操作和命令的使用示例(四)
- 6.S081 Xv6 Lab 4 traps
- python判断素数程序_python判断素数程序_Python程序检查素数
- 微信SDK删除支付模块流程
- SSL P2133 腾讯大战360
- 2019314输入一个日期,输出星期几
- vite+ts+vue3 知识点(定义全局函数和变量)
- Redis存放短信验证码 RedisTemplate =>opsForValue
- 基于pikachu漏洞平台的 --SQL注入攻击学习与总结
- sstream类的详解
- 怎样成为一名优秀的程序员?
- 可能是历史上最伟大的一次 Git 代码提交
- 记录Python 入门练习题目
- 动作识别阅读笔记(三)《Temporal Segment Networks: Towards Good Practices for Deep Action Recognition》
热门文章
- 如何正确认识和推进企业数字化转型?
- 泰德激光打标软件 包含 #include Main.h 时 原本正确的单元却报错
- 用Java 实现MSN聊天功能
- 强!Java实现MSN Messenger聊天
- 计算机技术中的多媒体是什么,在多媒体计算机技术中,媒体含义一般指()。A中介B介质C信息的载体D存储介质 - 试题答案网问答...
- 【python】小技巧-判断一个字典中是否包含另一个字典的值,即实际结果中是否包含预期结果
- ZooKeeper只完美解决Unable to read additional data from server sessionid 0x0报错问题,并带你深度理解ZooKeeper内部机制之选举机制
- 风控体系及政策设计介绍
- 用计算机精确查找,Excel函数教程: 根据首列精确查找同一行的数据-excel技巧-电脑技巧收藏家...
- VPD(Virtual Private Database)