游戏开发三大件:策划,程序,美术.
对于独立游戏来说,程序占了大部分.
策划因为不需要考虑太广泛的用户群体,也不需要设计精确的数值,也不需要考虑市场规律影响下游戏的生命周期,所以可以尽可能地设计出自己想要的功能.原则就是有能里做出来,玩起来好玩.
美术也有办法解决.自己从网上搜一些现成的通用的资源,模型,动作,UI,贴图,场景等等.如果要求高一些,那就是找外包,把自己的需求发给外包,唯一就是会有不小的成本.
其实很多大公司都会找美术外包.一方面是美术开发量确实很多,自己的美术忙不过来.另一方面,也可以不受自己公司美术水平的限制,找技术更好的外包做出质量更高的美术资源.
但是程序既不能外包,也有很强的专业性.不同水平的程序写出来的代码质量都有很大的差异,更别说不懂程序的.所以开发独立游戏,程序才是真正的主导.
如果打算做一个游戏,首先要具备写代码的能力,而且是可以写出质量比较高的代码.然后确定游戏类型,然后设计游戏基本功能,核心玩法,再想办法找合适的美术资源.
为什么一定需要写出质量高的代码,质量高代表着出错的可能会降低,开发进度会比较快.开发速度基本会保持 稳定.而如果质量不高,也就意味着代码出错的可能会高,开发一个功能的时间会比较长,而后期可能又是因为代码出错率高而进一步降低开发速度.越到后期进度就会越慢.然后停滞,甚至重新推翻从头开始.
我直接复刻热血传奇,其实也就是很大程序上绕过了我不擅长的两个部分,策划和美术,避免在这两方面耗费太长的时间.但是也不是完全避免,策划部分我仍然会添加一些自己的设计,而这也是我开发的目的所在,让游戏变得更好玩.美术方面,因为后面肯定要添加一些原游戏没有的功能,美术资源也肯定会另外找.但是初期,只靠程序已经足够了.
功能划分:
登录游戏
注册账号
创建角色
选择角色
地图显示
角色可以在地图上漫游
创建NPC
创建怪物
背包
角色装备面板
获取装备物品
使用装备物品
根据穿戴的装备更换角色外观
学习技能
技能面板
法师,战士,道士三职业的技能
怪物AI
怪物技能
怪物掉落
NPC功能
组队
交易
行会
这游戏的基本就是这样的开发顺序.虽然设想起来简单,但是每一个都是深坑.
而这些功能的基本是服务器.就会涉及到网络管理,数据库管理这两大块.
我本身最熟悉的就是C++,而C++执行效率在众多语言中算是很高的,用来开发服务器也是很合适的.虽然近几年,尤其是手游时代以来,C++在开发服务器上的使用频率是越来越低.大多开发服务器的都转向了java,c#,Go,python这些高级语言.至于原因,也很简单,大多都是因为C++用起来太难了,而其他语言的速度也没慢到哪儿去.
相比之下,C++确实难,内存不安全,稍不注意就会引起崩溃,标准库提供的功能太少,很多功能都需要自己写或者使用其他的库.
需要写的代码量大,容易崩溃,很多功能都需要从头写.
而其他语言,内存从来不需要担心会不会出错,也有大量的库提供常用的功能支持,需要写的代码量少.
C++自然也就逐渐退出了历史的舞台.
但是在这种情况下我还是会选择C++,不仅C++我最熟悉,我也很喜欢C++.
内存不安全,究其原因就是内存使用不规范,数组访问越界,不判断空指针,指针销毁后不置空,销毁错误的指针,使用错误的强转类型等等.
标准库提供功能太少,其实也不会有太大问题,大多数复杂的功能都能找到对应的完善的库,比如mysql,sqlite,md5,json.其余的简单功能都可以自己手动实现.这些功能本身不复杂,不一定必须要使用某些库提供的功能.自己实现可以让自己完全理解其中的原理,另一方面,也是让代码完全掌控在自己手中,让自己拥有对代码100%的控制权.代码可以根据需求来扩展,而且出现任何问题也可以很方便调试修改.
代码量大也有一定的办法解决.首先就要找到为什么其他语言开发所需要写的代码量少,究其根本就是因为语言标准库提供了很多可以直接使用的功能,所以在很多地方可以直接调用已经提供的功能,来减少自己写的代码量.根据这一点,很自然就会想到,基本C++标准库没有提供这些功能,那自己实现不就好了,然后把这部分代码当作公共代码.这也是在沉淀自己的代码积累.
在开发的过程中,把一些比较通用的代码提炼抽象出来,独立为公共代码,方便以后再有类似需求时可以直接调用.提炼出来的可以是一个静态函数,也可以是一个独立的类,甚至是一套独立模块.
综合各种因素,无疑是C++对我来说是最佳选择.甚至不会逊色其他语言多少.
回到刚刚的话题,网络管理,数据库管理.
网络管理
包含网络消息收发管理,消息的序列化和反序列化.很多人一提到网络模块就首先会想着有哪个插件能直接用的,其实肯定有,但是对我来说可能并不是最好的选择.我需要完全掌握代码,而且这部分不涉及复杂的算法,自己完全可以实现.
考虑到效率因素,我为网络管理器分配了三个线程:连接客户端,消息收发,消息解析.
连接客户端中accept同步执行,有客户端连接服务器就会立即返回,否则就阻塞等待.但是实测连接数太多或者太频繁时连接会失败.这也是以后需要优化调整的部分.
消息收发也是使用同步的方式,使用select查看是否有可读写的套接字,目前也是为了windows和linux都通用,所以都使用的select.不过在linux上有他专用的更高效的epoll,这也是以后需要优化调整的部分.
消息解析,消息接收过来是一堆二进制的数据,需要把这一堆数据解析为一个个可以执行的消息包,处理同时接收多个消息,消息接收不全,消息正确性检查等功能.
数据库管理
数据库选择的是mysql,为每个数据表格建立对应的表格类,表格数据结构,在每个表格类中提供这个表格的操作接口,然后这些接口全部只能由一个MySQLUtility类访问,外部需要操作数据库时只能使用MySQLUtility中的函数进行操作.这样避免数据库接口被各处的代码调用,方便将数据库操作这一部分独立出来. |