Posts

Showing posts with the label gamedev

状态机与决策树

(2条消息) AI之用行为树来实现逻辑_丿寒风的博客-CSDN博客   游戏中的敌人行为基本可以分为三种: 探测:接受外界信息 决策:根据信息和决策结构做出判断 行动:做出具体行为 有限状态机:FSM 预先设定游戏中所有可能的状态,继而通过当前状态(与外界信息)决定接下来作什么,以及相应的状态转换。 例如:有三种行为,吃,休息和接电话。 首先确定所有状态:吃,休息,接电话。 接下来为各状态分配状态转换控制流 休息中:      听到电话铃 -> 接电话      感到饥饿 -> 吃饭 吃饭中:      听到电话铃 -> 接电话      吃饱 -> 休息 接电话中: 通话完毕 -> 休息 行为树:Behavior Tree 通过优先级顺序,控制流结构,以及任务执行的情况决定接下来做什么。属于一种抽象化,节点化的控制结构。 根节点     Selector:          接电话          吃饭          休息 尝试接电话,如果失败则尝试吃饭,如果失败则休息 其中,既可以将判断与task放在一起,也可以把判断作为单独的task 如 接电话:     如果有电话:          接电话          返回成功     否则:          返回失败 或者 接电话:     sequencer:          查看有电话          接电话

如何提高代码可读性

Image
一、可读性的重要性 编程有很大一部分时间是在阅读代码,不仅要阅读自己的代码,而且要阅读别人的代码。因此,可读性良好的代码能够大大提高编程效率。 可读性良好的代码往往会让代码架构更好,因为程序员更愿意去修改这部分代码,而且也更容易修改。 只有在核心领域为了效率才可以放弃可读性,否则可读性是第一位。 二、用名字表达代码含义 一些比较有表达力的单词: 使用 i、j、k 作为循环迭代器的名字过于简单,user_i、member_i 这种名字会更有表达力。因为循环层次越多,代码越难理解,有表达力的迭代器名字可读性会更高。 为名字添加形容词等信息能让名字更具有表达力,但是名字也会变长。名字长短的准则是: 作用域 越大,名字越长。因此只有在短作用域才能使用一些简单名字。 三、名字不能带来歧义 起完名字要思考一下别人会对这个名字有何解读,会不会误解了原本想表达的含义。 布尔相关的命名加上 is、can、should、has 等前缀。 用 min、max 表示数量范围; 用 first、last 表示访问空间的包含范围; begin、end 表示访问空间的排除范围,即 end 不包含尾部。 四、良好的代码风格 适当的空行和缩进。 排列整齐的注释: int a = 1; // 注释 int b = 11; // 注释 int c = 111 ; // 注释 语句顺序不能随意,比如与 html 表单相关联的变量的赋值应该和表单在 html 中的顺序一致。 五、为何编写注释 阅读代码首先会注意到注释,如果注释没太大作用,那么就会浪费代码阅读的时间。那些能直接看出含义的代码不需要写注释,特别是不需要为每个方法都加上注释,比如那些简单的 getter 和 setter 方法,为这些方法写注释反而让代码可读性更差。 不能因为有注释就随便起个名字,而是争取起个好名字而不写注释。 可以用注释来记录采用当前解决办法的思考过程,从而让读者更容易理解代码。 注释用来提醒一些特殊情况。 用 TODO 等做标记: 六、如何编写注释 尽量简洁明了: // The first String is student's name // The Second Integer is student's score Map<String, Integer> scoreMap = new Hash...

游戏资源管理——命名约定

  Managing Assets – Part 2: Setting Naming Conventions (gamedeveloper.com) 游戏资源的命名非常重要,尤其是当你的游戏体量慢慢变大,文件越来越多时。糟糕混乱的命名和文件管理将会阻碍游戏的开发。 解决的方式就是制定一个命名约定,然后严格遵守这个约定。命名约定可以使项目保持清晰,文件井井有条,并改进工作流。简而言之,它节省了您的时间。 命名约定的第一原则:命名可以自我描述 简而言之,仅从文件的名称就可以知道该文件的类型和文件的大致内容。不要借助文件目录的归类,很多人会犯这个错误。文件归类是重要的,但多数情况它不能代替命名的作用(一些其他情况,如脚本自动读取一些固定命名格式的文件,这些可以使用文件目录进行文件的归类。如笔者通常将动画文件简单命名为frame0,1,2...,而使用文件夹区分动画的内容) 例如: Characters/Accessories/Gloves/Crimson.png Characters/Accessories/Scarves/Crimson.png 这里Crimson只是说明了装备的颜色,而装备的其他信息包含在了目录结构之中 优化后使用命名约定: 类型+款式+材质+颜色+其他信息 例如 armor_chest_iron_silver accessory_gloves_leather_brown 你可以为某个信息制定命名库,来保证命名的一致性。如上面例子中的类型,然后在命名时从库中选取就可以了。为了名称的简洁,你还可以在固定命名库中使用缩写。 armor accessory weapon shield potion outfit gadget 命名约定的第二原则:约定具有一致性 命名中的各个信息应当互不干扰,并能 命名约定的第二原则:约定扩展容易 为了保证命名约定始终有效

游戏类型汇总(一)动作游戏

Image
对于开发游戏,类型和题材是最初需要确定的两大要素,如同地基一样,在游戏开发途中基本不可有大的变动。这些类型基本是按照玩法或者题材进行分类的,不同类型会有不同的玩法框架,因此给玩家的体验也不一样,可以结合题材来决定使用什么类型进行开发。同一个游戏也可以具备多个类型的要素。不同类型的开发难度也不尽相同,如果你是独立开发者,要量力而行。 动作类Action 动作游戏强调需要手眼协调和反应力。游戏中玩家控制着大部分动作。根据要素动作游戏又可分成很多子类型 平台跳跃 Platformer game 平台跳跃游戏玩法主要集中在跳跃和攀爬上,以导航玩家的环境。途中可能有敌人或陷阱,或是纯粹的跳跃谜题。通常为了可以好的跑图和战斗体验,平台游戏中角色能够跳跃数倍于自己身高(大约是2-3倍,视角色高度而定,或通常是屏幕的1/3高度左右),并且可以在空中控制自身移动。 游戏环境比例也会受到影响,房间通常更为开阔,地形也更为复杂。 射击游戏 Shooter game 射击游戏中玩家主要使用远程攻击打击敌人,如枪械、弓箭或是法术。这类游戏多数都涉及暴力(尤其是写实类型,如Half-life,毁灭公爵等)。id software开发的 德军总部3D 是第一款3d射击游戏,提供了宝贵的技术和创作思路 根据视角,又可分为第一人称设计(first-person-shooter/FPS)和三视角射击(third-person shooter/TPS,如生化危机4)。有些游戏可自由切换这两种视角(如战争机器) 英雄射击(hero shooter)游戏有很多可选的"英雄"角色,每个角色都拥有独特的能力和特定于武器。英雄射击游戏鼓励团队合作,代表: 军团要塞,守望先锋,战锤鼠疫 光枪射击(light gun shooter)有点类似于后来出现的VR和wii,玩家使用光枪设备直接瞄准屏幕射击,沉浸感更强。代表: 打鸭子,死亡之屋 清版射击(shoot'em up/STG)特点是大量的低血量敌人,且每关最后通常有boss战斗。游戏中可以获取强力的武器升级。大多数都是驾驶一列飞船在宇宙中打击敌人的故事。还有一类“弹幕射击游戏bullet hell”以夸张的敌人弹幕为特点考验玩家的技术。代表: 雷电,斑鸠 格斗游戏 Fighting game 以近距离战斗为中心,通常涉及暴力和夸张的无器...

DnD人物阵营九宫格

Image
阵营(Alignments)是DND(龙与地下城)中很重要的一个规则,通过两个维度三个划分排列组合形成九个阵营,玩家通过自己选定的阵营来做出符合阵营的决策,描画出精彩又合理的冒险故事。在游戏设计中,我们也可以通过这种简方法来为游戏添加阵营,配合游戏背景和冲突勾勒出扣人心弦的故事大纲,同样也可以用来设计人物性格,保证人物行为的一致性。人物的阵营可以不是一成不变的,配合叙事(如遭遇重大变故和特殊人物的引导)可以自然的转变人物的阵营。 守序善良  倾向作出符合社会期许的正确行为 中立善良 根据对方需求不同而倾力相助 混乱善良  依照良心行事,不太在意其他人的看法 守序中立  行为按照法律、传统或是个人的原则 绝对中立 偏好避免碰触道德问题与不选边站的生物,或是只想做当下认为最恰当的行为 混乱中立  随性所至,将个人自由摆在首位 守序邪恶  除了传统、忠诚或规则的限制外,以有条不紊的方式获取一切个人利益 中立邪恶  可以做出任何事,且毫无怜悯和犹豫 混乱邪恶  以贪婪、憎恨或是嗜血驱动,作出反复无常的暴力行为 两个维度 守序与混乱 (lawful / chaotic) 守序与混乱代表了秩序与熵,控制与混沌,社会与个人,稳定与变化的对立原则。守序和混乱既不是善也不是恶 守序代表可预测性和理性思维,而混乱则相反。守序意味着你是一个基于习惯行动的生物,在通常情况下,你的行为可被预测,你以熟悉的惯常方式做出反应。 无法集中注意力,或者不会专注于某事,又或者你真的不知道他们对挑衅会作何反应,即使他们之前以某方式做出反应,但这次他们的行为可能完全不同,这就是混乱。 守序者严守誓言,遵纪守法,重视传统,服从权威。 混乱者不喜欢被约束,崇尚个体自由,对誓言不太看重。 中立者也介于两者之间,往往不会主动破坏法律,但也不会积极的维护,不会主动打破约定的习俗,有时也会为了某种目的而说谎。 善良与邪恶 (good / evil) 善与恶代表了利他主义与伤害、善良与仇恨、怜悯与恶意等熟悉的道德评判。 善意味着利他主义,尊重生命,关心众生的尊严。有时会做出个人牺牲来帮助他人。 邪恶意味着伤害、压迫和杀害他人。一些邪恶的生物对其他人根本没有同情心,如果这样能获得好处,他们会毫不犹豫地杀人。其他人则积极追求邪恶,为了取乐而杀人,或出于对...

木偶大师——银河破裂者的AI系统

Image
The Puppet Master - The development of the AI system for The Riftbreaker (gamedeveloper.com) 银河破裂者 是一款动感十足的游戏。在探索你发现自己所在的外星星球时,你永远不会真正安全。即使你躲在基地的墙后面等待漫长又危险的夜晚,依然挡不住成千上万想把你开膛破肚的敌人。生成成群的外星生物问题不打,难的是让它们以真实可信的方式活动。我们想向您展示开发人员必须采取哪些步骤才能使他们的游戏世界真实而生动。 本文也以视频博客形式提供。你可以在这里观看: 即使你的目标是让成千上万的敌人同时攻击玩家,你也必须少数几个敌人开始设计。下面介绍的是银河破裂者的首批原型之一。原型非常简单,甚至物体的比例也是错误的,但对于原型设计足够了。黄色立方体代表敌人,你可以看到他们正试图找到并追随玩家。当时,我们试图使用我们在 僵尸车车 中使用过的的生物碰撞检测系统。每个敌人在碰撞体前方都有3条raycast检测碰撞体,以避开其他实体和建筑。 它可能不漂亮,但这就是木偶大师在2018年初的样子。 好吧,即使它似乎工作得很好,算法也有点过时了。这根本不够好。我们希望我们的生物快速而愤怒,而不是笨拙。我们去除了所有的raycast,开始使用引力和斥力。这给了我们更好的运动,这是我们未来工作的第一步。在那段时间里,我们尝试可能的数学和物理算法,并测试我们所有的想法。在这个例子中,几十个敌人正在追逐玩家,而他们在墙壁之间回旋。敌人穿过狭窄的通道,一旦到达空地,就会再次扩散开来。整洁,一切似乎都很好,但这只是一个开始。 别想抓住我! 任何游戏如果只有一种类型的敌方单位,都会很快变得无聊。即使在吃豆人中,每个鬼魂的行为方式也独一无二。( 真的!查看此文章 )。加拉蒂亚37号星球是多个物种的家园,它们彼此不同。 还有一条重要的规则。如果一个系统可以处理一件事,那么它也必须能处理许多事。我们需要测试算法如何处理大小和速度不同的生物。他们会互相粘在一起吗?他们能够避开所有世界物体吗?这时需要测试许多问题。唯一的办法就是把每一个想法和解决方案都实现。看!我们向您介绍   ultimate Canoptrix, Arachnoid and Hammerroceros rush!(它们一点也不慢,只是慢动作)   在...