现在已经开发小程序系统了,能够直接使用模板开发的。
第一种是卖模板为主的网络公司。
优势是:价格低,几千块钱到万元之间就能够解决,便捷,可以迅速上线;劣势是:修改功能非常的麻烦,这里需要避免低价陷阱,不要到最后才发现模板性的修改功能所花的钱比买模板还要贵。并且不是独立的,一个模本卖给许多商家用,所以模板并不是永久使用的,一般每年都要交年费。
第二种是主流的方式,定制开发为主的网络公司。
优势是:独一无二的,专门为你的企业和店面定制的,功能你来定,要求你来定,后期修改BUG方便,改东西也非常方便,最关键的是永久使用权!!劣势是:相对价格比较高!!定制版的基本费用在上万元到十几万不等!不过贵也有贵的道理哦,毕竟功能做的会更加全面一些。
最后总结,至于找那样样的小程序开发公司呢?花多少钱来开发?还是需要看贵公司准备的预算这块哦!希望对大家有所帮助!
针对定制功能来说,价格会比较昂贵,因为定制需要重新花时间开发,一般工期都在一个月以内的时间,基本上都是几万元,所以这个小商户来说,肯定是承受不起的
如果是单独的满足一些基础的功能,没必要采用定制的模式,比如目前市场上许多网络公司卖微信小程序的模版,基本功能都具备的,花个几百或者几千购买就足够了,比较适合中小型企业
个人主体的微信公众号可以申请小程序,但是个人小程序不能完整使用小程序的接口和能力,在很多功能上都有限制。
微信公众平台不仅仅是一个阅读、听歌、看视频的平台,同时还有很多新奇的功能,能带来不一样的体验,比如在微信公众平台放入在线游戏功能。
首先在微信上面找到要放到公众平台的游戏,直接进入游戏的首页,不要点击开始游戏,点击右上角复制连接。
然后把复制好的链接粘贴发送到PC端,可以通过网页版微信或者QQ发送。
按照上面的方法已经得到这个链接了,然后进入微信公众平台,打开自定义菜单功能,新建一个栏目,把刚才的链接粘贴到里面就可以了。最后做完别忘记点一下发布。
制作挺简单的
第一步:登录凡科互动并注册
第二步:挑选喜欢的愚人节小游戏模板
第三步:修改背景和补充资料
第四步:发布
就这样,一款好玩的小游戏制作成功了
前言:本文为游戏日报【游戏制作100人】系列文章,如果你对该栏目感兴趣,愿意分享自己的游戏制作历程,欢迎联系我们。
SLG市场竞争激烈,是目前整个游戏行业的一个共识,在头部大厂纷纷布局SLG赛道的当下,整个细分品类可谓内卷到了极致。获客成本不断提高,让越来越多中小型团队不得不另辟蹊径,通过一些特别的方式来维持自己在这条赛道的核心竞争力,比如舍弃联机要素,来做单机版SLG游戏。
纵观整个游戏行业,以三国为背景的单机版SLG游戏屈指可数,这其中由成都龙游天下研发制作的《汉末霸业》,算是一个典型代表。《汉末霸业》是一款回合制君主扮演模式的SLG游戏,其本身除了SLG手游必备的策略元素之外,还带有单机游戏典型的模拟经营元素。
《汉末霸业》最初在Steam上面发行,后来移植成为手游,上线至今已有5年时间。而在TapTap上,截至目前《汉末霸业》已卖出70多万份,另外评分为8.8分。那么这样一款单机版三国SLG游戏是如何诞生的?又是如何稳居在内卷的SLG赛道呢?对此我与《汉末霸业》制作人邓钢(浪子韩柏)聊了聊。具体采访内容整理如下:
一、从游戏撰稿人到游戏制作人,因为一款游戏成立一家公司
Q:感谢接受采访,首先麻烦您做一个自我介绍。
浪子韩柏:大家好,我是《汉末霸业》制作人邓钢,从1997年在《电脑商情报游戏天地》发表游戏文章开始到现在,有25年的游戏圈行业经验,不过我一贯喜欢使用自己的笔名:浪子韩柏,所以大家一般都叫我浪子。
最早我是以游戏撰稿人的身份进入这个行业的,随后加入藏经阁体系(藏经阁是什么,真正的单机游戏老玩家都懂的,我就不多做解释了。)同年底,我成为游侠网创始成员之一,并开办了独立的游戏网光荣论坛,这个论坛是专门为光荣系列的游戏而建的。
我曾经在《家用电脑与游戏》《大众软件》《电脑游戏攻略》等多家游戏纸媒的光荣游戏版块做特约撰稿人。也为《三国志7/8/9/10/11》《太阁4/5》《大航海4》做过全系列攻略,现在百度百科上关于这几个系列的攻略资料就是我当年的写的。
除了这几个系列以外,我还担任过大航海在线站长,是《大航海时代OL》日服第一个中国商会中化商会首任会长。2000年我开始正式进入游戏行业任职,曾在天府热线游戏中心、上海光通游戏研究院、成都欢乐数码、成都乐雅、深圳凡趣科技、成都数字天空等多家游戏公司担任策划、运营及项目经理。
Q:当初是怎样想着去做《汉末霸业》这样一款游戏的?
浪子韩柏:我们的团队创始人都是三国的忠实粉丝,又都喜欢单机游戏,因为志趣相投走到一起,我们是先确定了要做的内容和方向,再去组建这个团队的。可以说我们是为了做《汉末霸业》这款游戏,而成立的这个公司。
Q:为什么会去做这样一款SLG+模拟经营类的单机手游?而不做联网SLG?
浪子韩柏:因为热爱,我们的团队创始人都是单机游戏的忠实玩家,仅此而已。其实我们的团队有一个简单的愿望,那就是做《三国演义3》的后继者。(注:智冠《三国演义3》2003年停止研发,到我们《汉末霸业》2016年立项开始,在这13年期间,国内没有任何一款正式PC单机策略三国游戏发售)
《汉末霸业》除了SLG策略要素之外,也有模拟经营元素
Q:在游戏发过程中遇到过哪些难题?都是怎样去解决的?
浪子韩柏:游戏开发过程遇到的难题,最大的应该是单机游戏的逻辑和系统框架比网游复杂太多了。网游那套依靠消费结构和数值成长的体系完全不能用,网游没有电脑AI,而单机策略游戏,有复杂的电脑AI还有复杂的阵营判定。甚至武将都有出生、死亡等各种复杂的逻辑。这是以前做网络游戏从来没有遇到过的难题,和程序小组是经过了多次磨合,上线优化才逐步完善的结果。开发周期很长,从2017年5月发售体验版,到2020年发售正式版,跨度有4年多。
二、上线至今销量突破130万,单机SLG长线运营的核心是做好内容
从2017年上线至今,5年时间过去,《汉末霸业》累计销量已经突破130万份,作为一款单机版三国策略游戏,能够在竞争激烈的SLG赛道取得这样的成绩,必然有着它的独到之处,对此邓钢也比较详细的透露了一波他们内部的运营之道。
截至目前《汉末霸业》在TapTap销量已超过71万
Q:《汉末霸业》上线至今销量如何?是否达到了团队的心理预期?
浪子韩柏:其实最开始我们对《汉末霸业》的目标销量并没有设想,对于我们来说,卖出去每一份都是惊喜,都是玩家对我们产品的认可。随着后续不断更新和玩家源源不断的支持,我们的团队就把销售的小目标定在了100万套,截止到2022年2月份,《汉末霸业》全平台销量已经突破了130万份,算是达成了我们的一个小目标。要说长远的目标的话,那我们想卖200万套。
Q:《汉末霸业》主要的用户群体是哪一部分?针对他们的需求产品会做哪些侧重?
浪子韩柏:单机游戏跟网游不一样,特别是三国类的策略游戏,受众基本是70、80后那一批,老SLG玩家一进游戏就能看出来你这个游戏做得好不好,是不是正统的策略游戏,是不是卖着情怀打着幌子来坑一笔钱就跑路的。因此这种玩家其实也是很好满足,那就是做好内容,单机玩家喜欢什么,我们就做什么。不需要异想天开的去做过多的创新,就是把以前一些经典的系统和要素做一些融合微创新就可以了。
Q:现在SLG游戏品类赛道竞争十分激烈,在这样的环境中,《汉末霸业》能够一直被玩家喜爱的根本原因在哪里?
浪子韩柏:除了游戏本身的内容丰富以外,我认为还有我们作为开发商的态度吧。《汉末霸业》是17年在Steam上线,这是我们第一个公开面向玩家的版本,到现在为止已经5年时间了,在这期间我们进行了美术迭代更新、玩法内容填充、增加不改变原本系统架构的一些小系统等,一共进行了大大小小一百多次的更新。
虽然我们是一个买断制的游戏,但我们也一直在认真倾听玩家的意见,力争让已经买断的玩家也能得到更好的游戏体验。《汉末霸业》为什么能得到玩家的认可,被玩家喜欢的最根本的原因就是——单机三国玩法的集大成者,做到这点,我觉得就可以得到玩家最大的认可和良好的口碑。
2.8万评价整体偏向于好评
Q:游戏上线这么长时间,内部开发节奏是怎样的?
浪子韩柏:《汉末霸业》上线5年,已经进入到产品末期了,现在主要是以维护游戏内容、修复bug为主,大更新主要是在DLC上面。公司马上迎来6周年,也是《汉末霸业》项目组立项6周年,项目组开发了一个新的DLC,免费赠送给所有玩家,以感谢玩家这么多年对《汉末霸业》的信任和支持。
Q:您觉得这样一款产品想要维持长线运营的核心是什么?
浪子韩柏:我认为单机游戏维持长线运营的核心是内容,提高游戏内容的深度和广度。好的内容是值得玩家反反复复去刷的,而不是玩家为了支持国产游戏买回去玩一天就放在收藏夹里面吃灰了。就拿《汉末霸业》来说,我们主要从两个方面入手。第一个方面是直接增加游戏的内容,这几年我们不断的更新,不断的增加系统,截止到目前我们已经增加了如养马、著书立说、村落和山贼、异民族等系统。
另外一个方面就是我们会为玩家提供一些diy的功能,玩家可以制作不同朝代的剧本,我们会根据剧本的完成度放到创意工坊或者我们的经典剧本里面,让其它玩家也能够玩到。这样一来能提高玩家的在线时长,另外也可以激起玩家的创作欲望,增加耐玩度。
三、团队曾获三七互娱投资,环境影响最大的是没法各处参展
2020年12月,成都龙游天下科技有限公司发生多项工商变更,其中投资人新增三七互娱全资子公司西藏信泰文化传媒有限公司,成为公司第二大股东,占股20%。获得三七互娱投资之后,《汉末霸业》团队又有怎样的变化?他们下一步规划又是怎样?
Q:《汉末霸业》项目团队目前规模如何?目前的重点是在哪一方面?
浪子韩柏:《汉末霸业》的主体已经基本完结。当前的引擎和系统框架也不适合再进行大型的更新,所以现在基本是由团队预留的留守小组在负责平时的维护性开发。目前的重点除了日常维护以外,如果还有余力也会做一些小型的DLC开发,我们也一直在收集玩家的意见,争取能够一直把《汉末霸业》更新下去。
Q:团队目前的规划是怎样的?比如《汉末霸业》后续开发,以及新产品方面等。
浪子韩柏:团队目前有三个项目并行,除了《汉末霸业》以外还有一个大型项目,是给资方定制的,《汉末霸业》的续作。另外一个是中型项目,像素风游戏。
Q:新产品具体的细节,比如题材、玩法类型是什么样的?
浪子韩柏:《汉末霸业》的续作还是一款三国策略游戏,这也是我们最擅长的方向,但是跟《汉末霸业》也有很多的区别,现在还在研发阶段,不方便透露太多。另外一款像素风游戏是结合了Rougelike的DBG游戏,是以英法百年战争为背景。
Q:团队招聘人员的话,会看重应聘者哪些方面?
浪子韩柏:首先肯定是业务能力了,我们是个小团队,资金方面不是那么充足,但如果是非常优秀的人才,我们也愿意花大价钱去聘请的。你比如说我要招一个策划,这个人十余年策划经验,也出过爆款,有多年的项管经验,那这样的人我肯定是愿意花高价去聘请的。反之比如我招一个美术,基本功都不行,那这样的人我招来干嘛呢?是不是,那不是给团队拖后腿吗?
《汉末霸业》的美术风格也颇有单机特色
Q:您觉得在目前的大环境之下,做游戏开发以及运营最大的困难在哪方面?
浪子韩柏:这几年经济有多差大家都是知道的,游戏行业相对来说是受疫情影响最小的了,对我们来说最大的影响应该是参展了。前几年我们天南海北的跑,去武汉、广州、北京、上海、日本、台湾办展会,展会现场的氛围特别好,来的基本上都是我们的忠实粉丝,在现场也能形成良好的互动,对于我们来说,线上和线下跟玩家的交流区别还是很大的。
Q:如果一个年轻人想要进入游戏行业,给他的建议是什么?
浪子韩柏:我觉得进入一个行业,首先你要足够热爱,先玩很多的游戏,类型不限,越多越好,你才知道自己真正喜欢的是什么。然后给自己定下一个目标,以后想要做一个什么样的游戏,比如从我进入游戏行业开始,我就想做一个三国策略类的游戏,这是我最喜欢的类型,我逐渐累计资源、人脉,并且找到了志同道合的小伙伴一起,一步一步把我心中的《汉末霸业》呈现出来。
坚持情怀,不忘初心,扬长避短是很重要的几个原则,持之以恒的把自己热爱的东西一直做下去,真正做到专精,积累到一定时候就自然能脱颖而出了。
结语:因为热爱三国,所以创办一家公司来制作游戏,从某种意义上来讲有些理想化,但是从最终结果来看,他们无疑是成功了。上线5年,凭借一款单机版三国SLG游戏,在内卷的SLG市场收获130多万销量,这或许也能为那些想要入局SLG赛道,但苦于无门的中小型团队提供一些参考。
原文链接:
游戏开发一直很能激励学生学习高级计算机科学。可能有些人认为游戏是孩子们喜欢的,但对于标准的计算机科学课程来说,游戏开发其实是少数几个能用当中所有知识的领域。
游戏开发涉及标准计算机科学课程中的诸多内容
根据游戏的性质,你可能还需要深入到更具体的专业,比如分布式系统或人机交互。游戏开发是一项严肃的工作,是助力计算机科学理念学习的有力工具。
本文将详细介绍使用C++创建一款简单游戏引擎所需的一些基本构建模块,解释游戏引擎所需的主要组成元素,并就如何从零开始编写游戏引擎给出一些个人建议。
不过,本文不是一个编程教程,因此也不会深入太多的技术细节或解释所有这些元素是如何通过代码粘合在一起的。如果你想找关于如何编写C++游戏引擎的综合性教程,可以先看看《用C++和Lua创建一个2D游戏引擎》。
一、游戏引擎是什么?概括地讲,游戏引擎是一套优化视频游戏开发的软件工具。这些引擎可以是小而极简型的,简单到只提供一个游戏循环和几个渲染功能;当然,也可以是大而全面型的,类似于IDE应用程序那种,开发人员可以用于编写脚本、调试、自定义关卡逻辑、人工智能、设计、发布、协作,并最终从头到尾构建游戏,而无需离开引擎。
游戏引擎和游戏框架通常向用户公开一组API。这些API允许程序员调用引擎函数,并像执行黑匣子一样执行艰难的任务。
为了真正理解这些API是如何工作的,让我们更具体地结合应用说明一下。例如,游戏引擎API公开一个名为“IsColliding()”的函数,开发者可以调用该函数来检查两个游戏对象是否发生碰撞,这种情况并不罕见。程序员不需要知道该函数是如何实现的,也不需要知道正确确定两个形状是否重叠所需的算法。就我们而言,IsColliding函数仅是一个黑匣子,根据这些对象是否相互碰撞,它会正确地返回true或false。下面是大多数游戏引擎向用户公开的一个功能示例。
大多数引擎都会抽象碰撞检测,并简单地将其作为真/假函数公开
除了编程API,游戏引擎的另一个重要职责是硬件抽象。例如,3D引擎通常构建在一个专用的图形API上,比如OpenGL、Vulkan或Direct3D。这些API为图形处理单元(GPU)提供了软件抽象。
说到硬件抽象,还有一些底层库(如DirectX、OpenAL和SDL),它们提供对许多其他硬件元素的抽象以及多平台访问。这些库帮助我们访问和处理键盘事件、鼠标移动、网络连接,甚至音频等各项功能。
二、游戏引擎的崛起在游戏行业的早期,游戏是使用定制的渲染引擎构建的。开发代码是为了从较慢的机器中尽可能多地提升部分系统性能。每个CPU周期都至关重要,因此代码重用或适用于多种场景的通用函数并不是开发人员能够负担得起的。
随着游戏和开发团队规模和复杂性扩展,大多数工作室最终都会在开发的多款游戏之间重用某些功能和子程序。工作室开发的内部引擎,基本上都是针对处理低级任务的内部文件和库的集合。这些功能允许开发团队的其他成员专注于游戏操作、地图创建和级别定制等高级细节。
一些流行的经典引擎包括id-Tech、Build和AGI等。这些引擎是为了帮助特定游戏的开发而创建的,它们允许团队的其他成员快速开发新的关卡,添加自定义资源,并动态定制地图。这些定制引擎也被用来为他们的原创游戏修改或创建扩展包。
Id Software软件公司(美国得克萨斯州的一家游戏软件公司)研发了id Tech技术。id Tech技术其实是一系列不同引擎的集合,其中每一个引擎的迭代时期都关联着一款不同的游戏。于是,开发人员通常会将id Tech 0描述为“Wolfenstein 3D引擎(Wolfenstein3D engine)”,将id Tech 1描述为“末日引擎(Doom engine)”,将id Tech 2描述为“雷神之锤引擎(Quake engine)”,等等。
Build是上世纪90年代游戏引擎历史中的另一个例子。它由肯·西尔弗曼(Ken Silverman)创建,旨在助力第一人称射击游戏定制。与id Tech的情况类似,Build随着时间而发展,它的不同版本曾经先后帮助程序员开发了《毁灭公爵3D》(Duke Nukem 3D)、《影子武士》(Shadow Warrior)和《血祭》(Blood)等游戏。这三个可以说是使用Build引擎开发的最受欢迎的游戏作品的代表,通常被称为“三巨头(The Big Three)”。
肯·西尔弗曼开发的Build引擎正在2D模式下编辑关卡时的情景
上世纪90年代游戏引擎的另一个例子是“疯狂大楼专用程序脚本创建开发工具(Script Creation Utility for Manic Mansion)”(SCUMM)。SCUMM是卢卡斯艺术公司(LucasArts)开发的一款引擎,它是许多经典点击式(Point-and-Click)游戏的基础,《猴岛小英雄》(Monkey Island)和《全速狂飙》(Full Throttle)这两款游戏就使用这个引擎。
《全速狂飙》游戏的对话框和运作都使用SCUMM脚本语言进行管理
随着机器的发展和功能的不断增强,游戏引擎也随之发展。现代引擎配备了功能丰富的工具,这些工具需要快速的处理器速度、惊人的内存量和专用显卡。
有了备用动力,现代游戏引擎可以用机器循环来换取更多的抽象性。这种权衡意味着,我们可以将现代游戏引擎视为通用工具,以较低的成本和较短的开发时间创建复杂的游戏。
三、为什么要制作游戏引擎?这并不是一个陌生的问题,不同的游戏程序员也各有各的看法。其回答取决于开发的游戏的性质、业务需求以及其他待考虑因素的影响。
开发者可以使用现有许多免费、强大、专业的商业引擎来创建和部署自己的游戏。那么,既然存在这么多游戏引擎可供选择,为什么还会有人费心从头开始制作游戏引擎呢?
我曾经写了一篇博客文章《自己动手编写游戏引擎还是使用现成的?》()来解释程序员从头开始制作游戏引擎的一些原因。在我看来,最主要的原因包括:
学习机会:对游戏引擎工作原理的深层次理解可以让你成为一名优秀的开发人员。
工作流控制:你可以更好地控制游戏的特殊方面,并调整解决方案以满足工作流的需求。
定制:能够根据独特的游戏需求定制解决方案。
极简主义:较小的代码库可以减少较大游戏引擎带来的开销。
创新:你可能需要实现一些全新的或针对其他引擎不支持的非正统硬件。
四、如何制作游戏引擎下文将继续讨论游戏引擎的一些组件,并指导读者自己编写一个游戏引擎。
1.选择编程语言
开发核心引擎代码的编程语言是首要选择。原始汇编语言、C、C++,甚至C#、Java、Lua,还有JavaScript等高级语言都有用来开发引擎。
编写游戏引擎最流行的语言之一是C++。C++编程语言将速度与使用面向对象编程(OOP)和其他编程范式的能力结合起来,帮助开发人员组织和设计大型软件项目。
因为在我们开发游戏时,性能通常是非常重要的,而C++具有编译语言的优势。使用编译语言意味着最终的可执行文件将在目标机器的处理器上以本机方式运行。此外还有许多专用的C++库和开发工具包可用于大多数现代控制台,如PlayStation或XBox等。
开发者可以使用微软提供的C++库访问XBox控制器
在性能方面,我个人不推荐使用虚拟机、字节码或任何其他中间层的语言。除了C++之外,一些适合编写核心游戏引擎代码的替代品还包括Rust、Odin和Zig等语言。
本文将以C++编程语言构建一个简单的游戏引擎。
2 . 硬件访问
在MS-DOS等较旧的操作系统中,我们通常可以直接操作内存地址并访问映射到不同硬件组件的特殊位置。例如,我要用某种颜色“绘制”一个像素,所要做的就是加载一个特殊的内存地址,其中的数字代表VGA调色板的正确颜色,而显示驱动程序将该变化转换为物理像素,并将其转换到CRT显示器。
随着操作系统的发展,它们开始负责保护硬件免受程序员的攻击。现代操作系统将不允许代码修改操作系统为进程提供允许地址之外的内存位置。
例如,如果你使用的是Windows、macOS、Linux或BSD,则需要向操作系统请求在屏幕上绘制像素或与任何其他硬件组件对话的正确权限。即使是在操作系统桌面上打开窗口这样的简单任务也必须通过操作系统API来执行。
因此,运行进程、打开窗口、在屏幕上渲染图形、绘制窗口内的像素,甚至从键盘读取输入事件都是特定于操作系统的任务。
SDL(Simple DirectMedia Layer,即简易直控媒体层)是一个非常流行的库,它可以帮助实现多平台硬件抽象。在游戏开发课堂上时,通过SDL,我无需为Windows操作系统、macOS和使用Linux系统的学生创建三个不同版本的代码。SDL不仅是不同操作系统的桥梁,也是不同CPU体系结构(英特尔、ARM、苹果M1等)的桥梁。SDL库对底层硬件访问进行抽象,并“翻译”我们的代码以便在这些不同的平台上都能够正确工作。
下面是使用SDL在操作系统上打开窗口的一小段代码。为了简单起见,代码中没有添加处理错误的部分,但是下面的代码对于Windows、macOS、Linux、BSD,甚至RaspberryPi,都是通用的。
SDL只是我们可以用来实现这种多平台硬件访问的游戏库的一个例子。SDL是2D游戏和将现有代码移植到不同平台和控制台的热门选择方案之一。多平台库的另一个流行选择方案是GLFW,它主要用于3D游戏和3D引擎。GLFW库可以很好地与OpenGL和Vulkan等加速3D API进行通信。
3 . 游戏主循环
至此,一旦操作系统方案解决,接下来我们就需要创建一个控制整个游戏的主循环。
简单地说,我们通常希望我们的游戏以每秒60帧的速度运行。根据游戏的不同,帧速率可能会有所不同,但为了让景物变得更加清晰,在胶片上拍摄的电影通常都是以每秒24帧的速度运行(每秒钟24幅图像从你眼前闪过)。
在游戏过程中,游戏循环会持续运行,在循环的每一次过程中,我们的引擎都需要运行一些重要的任务。传统的游戏循环必须确保:
在不阻塞的情况下处理输入事件
更新当前帧的所有游戏对象及其属性
在屏幕上渲染所有游戏对象和其他重要信息
但是,一个原始的C++循环对我们来说还不够。游戏循环必须与现实世界的时间有某种关系。毕竟,游戏中的敌人应该在任何机器上都是以相同的速度移动,而不管这些机器的CPU时钟速度如何。
控制这个帧速率并将其设置为固定的FPS数实际上是一个非常有趣的事情。它通常要求我们跟踪帧与帧之间的时差,并进行一些合理的计算,以确保我们的游戏以至少30 FPS的帧速率顺利运行。
4 . 输入事件处理
很难想象一个游戏不从用户那里读取某种输入事件会是什么情景。所有这些输入事件可能来自键盘、鼠标、游戏板或虚拟现实设备。因此,我们必须在游戏循环中处理不同的输入事件。
要处理用户输入,我们必须请求访问硬件事件,这必须通过操作系统API执行。我们可以使用一些著名的多平台硬件抽象库(SDL、GLFW、SFML等)来处理用户输入。
例如,如果我们使用SDL就可以实现轮询事件,然后仅用几行代码就可以处理各种输入事件。
再强调一次,如果我们使用像SDL这样的跨平台库来处理输入,我们不必太担心特定于操作系统的实现。无论我们的目标平台是什么,C++代码都应该是相同的。
至此,我们已经有了一个可工作的游戏循环和一种处理用户输入的方法。接下来是时候开始考虑在内存中组织游戏对象了。
5 . 在内存中表示游戏对象
在设计游戏引擎时,我们需要设计数据结构来存储和访问游戏对象。
程序员在设计游戏引擎时会使用多种技术。一些引擎可能会使用简单的面向对象方法来处理类和继承,而其他引擎可能会将它们的对象组织为实体和组件。
如想学习更多关于算法和数据结构的知识,建议尝试实现这些数据结构。如果你使用的是C++,一个选项是使用STL(标准模板库),并利用它附带的许多数据结构(向量、列表、队列、堆栈、映射、集合等)。C++STL在很大程度上依赖于模板,因此这是一个练习使用模板的好机会,同时可以在实际项目中看到它们发挥的作用。
在阅读过一些游戏引擎架构的内容后,你会发现游戏使用的最流行的设计模式之一是基于实体和组件。实体组件设计将游戏场景中的对象组织为实体(Unity引擎中称之为“游戏对象”,而Unreal引擎中则称之为“角色”)和组件(我们可以添加或附加到实体的数据)。
要了解实体和组件是如何协同工作的,请考虑一个简单的游戏场景。此例中,实体将是我们的主要游戏玩家,还包括敌人、地板、投射物等,而组件将是我们“附加”到实体上的重要数据块,如位置、速度、刚体碰撞器等。
一种流行的游戏引擎设计模式是将游戏元素组织为实体和组件
我们可以选择附加到实体的一些组件,例如下面这些:
位置组件:跟踪实体在世界坐标系中的x-y位置坐标(或3D中的x-y-z)。
速度组件:跟踪实体在x-y轴(或3D中的x-y-z)上移动的速度。
精灵组件:通常存储我们应该为特定实体渲染的PNG图像。
动画组件:跟踪实体的动画速度,以及动画帧如何随时间变化。
碰撞器组件:这通常与刚体的物理特性有关,并定义实体的碰撞形状(边界框、边界圆、网格碰撞器等)。
健康组件:存储实体的当前健康值。这通常只是一个数字,或者在某些情况下是一个百分比值(例如,健康进度条)。
脚本组件:有时我们可以在实体上附加一个脚本组件,它可能是一个外部脚本文件(Lua、Python等),我们的引擎必须在后台解释和执行该文件。
上面给出的是一种非常流行的表示游戏对象和重要游戏数据的方法。如今,我们已经有了实体,然后我们就可以将这些不同的组件“插入”到实体中。

目前,市场上已有诸多书籍和文章探讨了实现实体组件设计的方式,以及在这个实现中应该使用什么样的数据结构。我们使用的数据结构和访问它们的方式对我们的游戏性能有直接的影响。开发人员经常会提到诸如面向数据的设计、实体组件系统(ECS)、数据局部性等想法,这些想法与我们的游戏数据在内存中的存储方式以及有效访问数据方式都有密切的关系。
在内存中表示和访问游戏对象可能是一个复杂的主题。根据我的经验,你可以手动编写一个简单的实体组件来实现,也可以简单地使用现有的第三方ECS库(Entity-Component-System,即“实体-组件-系统”的缩写。此模式遵循组合优于继承原则,游戏内的每一个基本单元都是一个实体,每个实体又由一个或多个组件构成,每个组件仅仅包含代表其特性的数据)。
当前市场上,有一些流行的现成的ECS库可供选用,我们可以将它们包含在C++项目中,开始创建实体和附加组件,而不必担心它们是如何在后台实现的。C++ ECS库的一些例子是EnTT和Flecs。
我个人建议那些认真对待编程的学生至少尝试一次手动实现一个非常简单的ECS。我的理由是,即使你的实现并不完美,从头开始编写ECS系统也会迫使你考虑底层数据结构以及相应的性能。
一旦完成了定制的临时ECS实现,我建议你只使用一些流行的第三方ECS库(EnTT、Flecs等),因为这些都是经过行业多年开发和测试的专业的游戏开发库,它们可能比我们自己从零开始编写的要好得多。
总之,一个专业的ECS很难仅凭个人力量从零开始实现。选择一个经过良好测试的第三方ECS库,并将其添加到游戏引擎代码中即可完成你的游戏作品。
6 . 渲染
游戏引擎的复杂性正在慢慢提升。前文已讨论了在内存中存储和访问游戏对象的方法,接下来我们需要讨论如何在屏幕上渲染对象的问题。
第一步是考虑用引擎创建的游戏的性质。我们创建的游戏引擎是否只用来开发2D游戏?如果是这样,我们需要考虑渲染精灵、纹理、管理层,并可能利用图形卡加速。2D游戏通常比3D游戏简单,因为2D数学比3D数学要简单得多。

如果目标是开发2D引擎,则可以使用SDL帮助进行多平台渲染。SDL抽象了加速的GPU硬件,可以解码和显示PNG图像,绘制精灵,并在我们的游戏窗口中渲染纹理。
如果目标是开发一个3D引擎,那么则需要定义将一些额外的3D信息(顶点、纹理、着色器等)发送到GPU的方式。如果你想使用对图形硬件软件抽象,最流行的选择方案就是OpenGL、Direct3D、Vulkan和Metal。当然,使用哪种API的决定可能取决于自身的目标平台。例如,Direct3D会为微软平台的应用程序提供支持,而Metal则只适合与苹果的产品配合使用。
3D应用程序通过图形管道处理3D数据。该管道将规定引擎必须如何向GPU发送图形信息(顶点、纹理坐标、法线等)。图形API和管道还将规定我们应该如何编写可编程着色器来变换和修改3D场景的顶点和像素。
可编程着色器规定GPU应如何处理和显示3D对象
每个顶点和每个像素(片段)可以有不同的脚本,它们分别用于控制反射、平滑度、颜色、透明度等。
至于3D对象和顶点,最好将读取和解码不同网格格式的任务委托给一些第三方库来实现。大多数第三方3D引擎都应该了解许多流行的3D模型格式,例如OBJ、Collada、FBX和DAE等一些文件格式。我的建议是首选.OBJ文件格式,因为有不少测试和支持力度良好的库可以用C++处理OBJ加载。这方面,TinyOBJLoader和AssImp就是许多游戏引擎使用的上佳选择。
7 . 物理引擎
当我们向引擎中添加实体时,我们可能还希望它们在场景中移动、旋转和反弹。
游戏引擎的这个子系统称为物理模拟。这可以手动创建,也可以从现有的现成的物理引擎导入。
在这里,我们还需要考虑想要模拟的物理类型。2D物理通常比3D简单,但物理模拟的底层部分对2D和3D引擎都非常相似。
如果你只想在项目中包含一个物理库,那么已有几个很好的物理引擎可供选择。对于2D物理引擎,我建议调研一下Box2D和Chipmunk2D这两款产品。对于专业且稳定的三维物理模拟引擎,品牌相当不错的包括PhysX和Bullet之类的库。如果物理稳定性和开发速度对项目至关重要,那么使用第三方物理引擎总是一个不错的选择。
BOX2D是一个非常受欢迎的物理库选项,可以与游戏引擎一起使用
你不需要编写一个完美的物理模拟,但要确保物体能够正确加速,并且不同类型的力可以应用到你的游戏物体上。一旦实现基本的物体移动效果,接下来你也可以继续考虑实现一些简单的碰撞检测和碰撞解析。
对于2D刚体物理可参考Box2D源代码和来自Erin Catto的介绍。如果想寻找一门关于游戏物理的综合课程可参看《从零开始编写2D游戏物理》)。
如果想学习3D物理以及物理模拟实现,可参阅大卫·埃伯里(David Eberly)编写的图书《游戏物理》(Game Physics)。
8 . 用户界面设计
一提到Unity或Unreal等现代游戏引擎,我们会想到复杂的用户界面,其中包含许多面板、滑块、拖放选项和其他漂亮的UI元素,可以帮助用户自定义游戏场景。UI允许开发者添加和删除实体,动态更改组件值,并轻松修改游戏变量。
为了明确起见,我们讨论的是用于开发工具的游戏引擎UI,而不是我们向游戏用户显示的用户界面(如对话框屏幕和菜单)。
游戏引擎不一定需要嵌入编辑器,但由于游戏引擎通常用于提高生产力,友好的用户界面将帮助你和团队快速自定义游戏场景的关卡等其他方面。
对于初学者来说,从头开始开发UI框架可能是游戏引擎制作中最烦人的任务之一。你必须创建按钮、面板、对话框、滑块、单选按钮、管理颜色,还需要正确处理UI的事件并始终保持其状态。向引擎中添加UI工具会增加应用程序的复杂性,并给源代码管理带来大量麻烦。
如果你的目标是为引擎创建UI工具,那么我建议使用现有的第三方UI库,热门UI备选工具有Dear ImGui、Qt和Nuklear等。
Imgui是一个强大的UI库,被许多游戏引擎用作编辑工具
Dear ImGui是极佳的选择之一,它允许我们为引擎工具快速设置用户界面。ImGui项目使用了一种称为“即时模式UI”的设计模式,由于它通过利用加速的GPU渲染与3D应用程序进行良好的通信从而被广泛用于游戏引擎。
总之,如果你想在游戏引擎中添加UI工具,建议使用Dear ImGui。
9 . 脚本开发
随着我们游戏引擎的不断发展,一个常见的选择是使用简单的脚本语言实现游戏关卡定制。
想法很简单:我们在原生C++应用程序中嵌入了一种脚本语言,非专业程序员可以使用这种更简单的脚本语言编写实体行为、AI逻辑、动画和游戏的其他重要方面的脚本。
一些流行的游戏脚本语言有Lua、Wren、C#、Python和JavaScript等。所有这些语言的运行级别都比我们的原生C++代码高得多。无论谁使用脚本语言编写游戏行为脚本,都不需要担心内存管理或核心引擎如何工作的其他低级细节。他们要做的就是编写游戏中对应关卡的脚本,而我们的引擎知道如何解释脚本并在幕后执行艰难的任务。
Lua是一种快速、小型的脚本语言,可轻松与C/C++项目集成
我最喜欢的脚本语言是Lua。Lua体积小、速度快,非常容易与C和C++本机代码集成。此外,如果我使用Lua和“现代”C++,我喜欢使用一个名为Sol的包装库()。Sol库可帮助人们快速熟悉和使用Lua,并提供了许多辅助函数来改进传统的Lua C-API。
如果我们开发的游戏引擎中支持脚本编程的话,那么接下来可以开始在游戏引擎中讨论一些更高级的话题。脚本编程能够帮助定义人工智能逻辑、自定义动画帧和运动,以及其他不需要通过原生C++代码控制,而是可以通过外部脚本轻松管理的游戏行为。
10 . 音频
接下来,还有一个需要为游戏引擎添加的支持元素是音频。
如果想要读写音频数据并发出声音,我们需要通过操作系统访问音频设备。再次声明,由于人们通常不想编写特定于操作系统的代码,我建议使用一个多平台库来抽象音频硬件访问。
SDL等多平台库就具有扩展功能,可帮助引擎处理音乐和音效等内容。
但是,我强烈建议只有在确定引擎的其他部分都已经能够正常协同工作之后,再考虑处理音频的问题。控制声音文件发音可能很容易实现,但如果我们过早地开始处理音频同步问题,即把音频与动画、事件和其他游戏元素联系起来共同考虑,事情往往会变得一团糟。
如果你真正是自己手工编写代码,那么由于多线程管理的复杂性,可能会导致音频处理起来变得很棘手。不过,如果你的目标是编写一个简单的游戏引擎,那么我可能更会借助一个专门的库来处理这一部分功能。
例如,你可以考虑将SDL_Mixer、SoLoud和FMOD等优秀的音频库和工具集成到自己开发的游戏引擎中。
《微型战场》(Tiny Combat Arena)
这款游戏就使用FMOD声音库来实现多普勒和压缩等音频效果
11 . 人工智能
最后一个子系统是人工智能。我们可以通过脚本来实现人工智能。这意味着,我们可以将人工智能逻辑委托给关卡设计师来编写脚本。另一个选择是,在我们的游戏引擎内核的本机代码中嵌入适当的人工智能系统。
在游戏中,人工智能用于对游戏对象产生响应性、适应性或类似智能的行为。大多数人工智能逻辑被添加到非玩家角色(NPC、敌人)中,以模拟类似人类的智能。
敌人是AI在游戏中应用的一个流行的例子。当敌人追逐地图上的物体时,游戏引擎可以通过路径搜索算法或有趣的模仿人类的行为来创建抽象效果。
伊恩·米林顿(Ian Millington)的《游戏人工智能》是一本关于游戏人工智能理论和实现技术的综合性书籍,值得参考。
五、不要贪多求快在游戏引擎开发工作中,最困难的部分之一是大多数开发者都不会设定明确的界限,即有一种走不到“终点线”的感觉。换句话说,程序员会启动一个游戏引擎项目,渲染对象,添加实体,添加组件,但到最后突然发现一切都很糟糕。因此,如果他们不定义某种边界,就很容易不断添加越来越多的功能,而忽略了全局。如果这种情况发生,游戏引擎很有可能永远看不到曙光。
除了缺乏边界,当看到代码以闪电般的速度在眼前增长时,我们自己反倒很容易被淹没。游戏引擎项目的复杂性可能会迅速扩大,几周内你的C++项目可能会有几个依赖项,需要复杂的构建系统,而随着更多功能添加到引擎中,代码的整体可读性会不断下降。
因此,我的首要建议是,在编写实际游戏时,要始终坚持编写自己的游戏引擎。开始并完成游戏的第一次迭代时,脑海中要有一个真实的游戏。这将帮助你设定限制,并为你需要完成的工作指出一条清晰的路径。尽最大的努力坚持下去,而不是反复改变需求。
六、稳扎稳打,专注基础大多数学生在项目开始时都感到兴奋,但是随着时间的推移就开始出现焦虑情绪。如果我们从头开始创建一个游戏引擎,尤其是在使用像C++这样的复杂语言时,很容易不知所措失去动力。
因此,要学会及时享受某些阶段性的小胜利。例如,学会如何成功地在屏幕上显示PNG纹理,成功地发现了两个物体之间的碰撞等等。专注并理解基础知识一直都是非常重要的事情。
对于热爱编程的朋友来说,路再难走也要坚持走下去!如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
中国,上海– 2021年4月28日 – 天气渐暖,万物复苏!育碧中国宣布《舞力全开》国行版更新内容现已上线,新增数百款全新头像,玩家可通过完成歌曲以及挑战来获得他们,选择使用不同风格的头像来彰显自己的个性!为庆祝新版本推出,迎来了自己的一周年生日。为了感谢广大玩家的支持与喜爱,丰富的一周年活动现已开启,《舞力全开》“头像收集挑战”现已开启,参与活动更有机会赢取国行版Nintendo Switch OLED、《舞力全开》X BML合作款 CHERRY机械键盘等丰厚好礼。
头像收集挑战
即日起5月15日,玩家进入《舞力全开》国行版,游玩“舞出新花样 头像挑战赛”主题歌单歌曲,即可解锁本次更新的全新头像。通过在游戏中扫描二维码或JustDance舞力全开微信公众号登陆H5活动页面,参与挑战并查看个人进度以及排行榜。活动除了将根据最终的排名情况为前15名玩家发放奖励外,更会随机抽取10名参与者送出“幸运舞者奖励”!了解更多活动详情请访问《舞力全开》官方微信公众号:JustDance舞力全开
为庆祝《舞力全开》官方微博账号正式上线,即日起至5月15日,关注@JustDance舞力全开并转发置顶活动微博即可参与抽奖,赢取《舞力全开》国行版游戏本体+30天无力无限订阅服务。
此外,在微博上分享你游玩《舞力全开》的时刻并秀出获得新头像的画面,附带话题#舞出新花样# #舞力全开国行版#并@JustDance舞力全开即可参与活动抽奖,赢取《舞力全开》熊猫教练周边+实体头像周边一套,详情见活动置顶微博。
为迎五一假期,即日起至5月4日,前往育碧天猫旗舰店或国行版Nintendo e商店购买《舞力全开》国行版可享受9折优惠。此外更有“3合1黄金礼包”及老玩家回馈等优惠活动,详情见:
《舞力全开》国行版是由育碧上海工作室专为中国玩家打造的系列最新作品,发售之初便囊括了48首中外流行歌曲,每份《舞力全开》国行版更是包含一个月的“舞力无限”订阅服务,通过这项服务,玩家能够即刻解锁内含超过300首好歌的在线曲库。在游戏发售的一年间,随着独家中文歌曲和《JUST DANCE 2022》38首全新歌曲陆续更新,《舞力全开》国行版已逐渐成为喜爱舞蹈和聚会玩家的不二之选。
想了解更多相关内容,请关注《舞力全开》官方微信公众号:JustDance舞力全开、官方微博@JustDance舞力全开,或访问《舞力全开》官网:
育碧中国
育碧(Ubisoft)致力于通过创建世界,为玩家带来新颖深刻的娱乐体验。育碧全球团队打造了丰富多元的游戏作品,拥有《刺客信条》、《英灵乱战》、《荣耀战魂》、《孤岛惊魂》、《舞力全开》、《疯狂兔子》、《飙酷车神》、《彩虹六号》、《全境封锁》等畅销游戏品牌。育碧通过Ubisoft Connect为玩家提供周到全面的服务、游戏内奖励,以及跨平台社交功能,进一步提升游玩体验。育碧在2020-2021财年内实现了22.41亿欧元的净销售收入。
自1996 年在中国建立工作室以来,育碧一直站在中国游戏产业的前沿。目前,育碧中国在上海和成都拥有两处工作室,1000多名来自国内外游戏制作、图像设计、动画、程序、人工智能、音效、测试及数据管理方面的专业人才。
© 2021年 育碧娱乐有限公司。育碧保留一切权利。育碧和育碧相关标识均为美国或其他国家注册商标。