您的位置 首页 > 数码极客

【如何制作apk游戏】零起点开发复古mud游戏

最近,所谓的mud复古游戏广告的成功引起了关注。下载了几次,和真正的mud相差很大。

没有二十年前,聊天界面为主的mud那种感觉。

一直以来,对游戏开发,感觉很遥远,最多99年写过dos下的猜数字c语言程序。

而现在由于技术实现的进步,实现一款二十年的mud游戏的雏形版,难度其实不大。

游戏框架设计如下:

前端

vuejs+bootstrap+element-ui+pwa

既可以支持PC,平板,还可以通过pwa实现微信小程序一样手机桌面生成图标,打开实现app效果。还不需要依赖于代码审核,对于自研内部玩玩很方便。

服务器搭建

nodejs+express+websocket+ssl

阿里云服务器上允许nodejs环境,导入express搭建web服务,实现websocket长链接实时通信。

好了,环境弄好了。

开始实现各功能开发

首先,UI设计

有bootstrap+element-UI神器,对于不擅长UI设计的人来说,可以快速实现符合大部分人审美的界面。既然复古,那就百度mud图片,参考老式截图。把住画面分成几个区域,主区域是聊天窗口,底部一个输入框,一排操作按钮,上面刷系统广播,聊天记录,打斗等各种操作结果。支持自动滚屏。侧面区域,分两块,上方在线用户列表,下方放玩家自己的物品行囊,位置状态等信息。完成界面,大约花了两个晚上,六个小时。同时刷剧看扫黑风暴。

接下来是聊天功能实现。

利用,在服务器端实现基本聊天功能。这个网上有现成代码。几乎不用改动一个晚上就能搞定。功能包括:上线,下线,创建房间,进入和退出房间,全员广播,私聊。顺便感叹一下,几天时间搞定一套聊天室功能。测试了一下,效果非常好。穿越回二十年前,是不是能可以搅局互联网?

有了上面的基础,mud游戏的基础就有点像回事了。

下面进入主题,开始游戏引擎设计

由于不需要动画,3d,任何游戏效果,都是文字,因此设计就没那么复杂。

游戏构思:荒漠中一座孤零零小镇,残垣断壁,街上杂货铺,铁匠铺,破庙,客栈,人烟稀少。镇上怪物百出(人机NPC),玩家遇到怪物可以躲开,也可以打怪,提升等级。

对象设计:room,npc,item,player。

json资源文件定义room,npc和item等列表。杂货铺就是一个room,武器等物品就是一个item,野怪就是一个NPC,类似人机。

玩家上线就是一个player,获得一个长链接,方便服务器推送。

属性设计:

上述对象有下面共同的属性

id,name,description,positionX,positionY。

NPC和player额外有

HP血量,atk攻击力,def防护,v移动速度,lv等级

player还有online属性。一旦下线,对其他玩家不可见,再入游戏时,恢复离线时位置。是不是很恐怖?突然眼前出现一个玩家

指令设计:

move移动。这是游戏里最基本的,NPC和玩家都会移动,互相之间位置不断改变。为了简化路径计算,指令支持玩家选择去哪个地方,不考虑障碍物和绕行。实现方式如下,

起点x1,y1和终点x2,y2,指令接收时,引擎通过直角三角形,计算两个锐角角度,保存到player属性里。最长边就是走行距离和方向。速度x时间,就是走行距离,通过cos和sin,计算新的x1和x2,初中数学就可以。

问题来了,一个move指令,根据起始点距离,需要花费不同时间,这个期间会发生很多事情。比如走到一半,遇到野怪。半路有宝贝可捡。一下子一个指令干到终点,啥都错过了。怎么玩啊?

游戏引擎的核心,资源载入和心跳设计。

资源打入,服务器启动时,执行一个load函数,把json资源文件载入。只执行一次。

memorycache,并生成一个对象坐标列表spotlist,该列表用来求导对象之间位置关系。

心跳启动一下timeout,每隔0.6秒,执行一个函数命名tick,里面处理如下:

遍历缓存中player和NPC对象,根据每个对象当前指令和属性,进行计算。

比如move,有sin和cos值,根据移动速度v,乘以心跳时长0.6秒,得出斜边走行距离z,z乘以sin得到x轴移动,乘以cos得到y轴距离,从而得到player新的positionX和positionY。遍历之后,所有对象发生状态变化。也就是游戏连续动作,实际上是每隔0.6秒的状态变化。然后把状态通过长链接推送给玩家。个别玩家收不到或者丢包,将会收到n个0.6秒的状态。这就是游戏卡住了效果。心跳时长越短,状态变化越精细,服务器计算次数增加压力变大。甚至会出现心跳时长内计算完不成。反之,变化越粗,服务器压力小。而客户端感受不到心跳,是因为这个0.6秒内,虽然还没收到下一个0.6秒的状态,但是因为客户端还有渲染,和预测操作,所以很连续。

下一个0.6秒,除了玩家位移,还会发生什么?对象之间距离发生了变化,本来视野外的,会出现在视野内。不如,发现了地上宝物,发现了野怪。这样我们定义一个距离,比如5米。小于五米,就算进入视野,多于五米,离开视野,也就成功逃跑。那么刚才spotlist加载了所有对象的坐标,这个时候用fiter函数,求出所有距离小于5的列表,添加到每个玩家属性里。广播到客户端。玩家根据列表,选择攻击,捡起等新指令。或者无视,继续移动。

到此为止,一个简易引擎出具雏形。

可以实现玩家进入游戏,选择目的地,在地图里走来走去,期间弹窗告诉你,遇到了野怪,捡到了一把刀。所有的效果,没有图形,只会通过json资源文件的描述,和内置的指令,反馈格式,告诉你遇到了什么样的人,捡到了什么样的东西,进入了什么样的建筑物。

接下来的设计,就更加容易了,只要加入一个个指令,就像插件一样。

插入一条指令,tick里增加一段计算,更新到属性,广播到客户端,客户端相应的对反馈进行处理。

第二条重要指令是attack攻击。完成攻击之后,基本上具备一定可玩性。

剩下只要修改json资源文件,增加建筑物,物品,NPC人机,游戏可玩性和探索性增加。尤其是在线玩家只有一个人两个人的时候,json文件越丰富,越像单机版。

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐