最近几天在业余时间终于把上学时候开的一个烂尾小项目给结束了。 那时候,有个朋友在一个小棋牌游戏公司打杂,想学习Visual  C++,想做一个游戏,我说我可以带你做个小练习,一起使用Git开发,保准你到时候能够找到工作。我提议做个带局域网联机的打字游戏,用MFC,这样不仅能练习C++,还能够掌握网络编程方面的知识。于是就开了一个项目,结果一直没时间做。 工作这几年,发现再坚持MFC也没啥意思了,人生苦短,做应用开发的还是多用便捷的开发工具,做底层开发的也用不到MFC这样重量的框架。但是心里有个事不完成也不舒服,这些天想复习一下C++,然后再练习一下 HP -Socket这个异步的网络通信函数库,就又捡起来把这个小小的项目往前推进了一下,已经基本完成了,以后也基本不可能会再碰MFC了。 先放一张截图吧,使用了我最喜欢的RpgMaker的素材。
想起以前为了把自己做的游戏给别人玩,注册一个5MB的永硕E盘就很满足了,也有人会去申请个公共邮箱账号,我还因此去研究了怎么建网站,找了很多的免费空间,有ASP的和PHP的。现在得益于互联网,到处是免费的网盘,到处是分享资源的地方,真的太幸福了。但我现在感到有个趋势,很多互联网公司都遇到了各种经济困难,必须把原来免费的SAAS改收费以考虑盈利了,所以自己建网站也许又会流行起来,说多了,我对互联网发展的历史的一些理解将来再写。感谢互联网,我可以把项目放到码云上 https://gitee.com/liqingjia/game 。 这个游戏是模仿金山打字通的警察抓小偷游戏,玩家通过打字输入控制角色沿着轨迹前进,直到角色追到NPC或者网络对战玩家,取得胜利。在项目中,使用了GDI+进行绘图,如何绘制动画、绘制透明背景图片,都是MFC游戏开发必须掌握的小技能,只能说有点麻烦,有兴趣了可以看代码。游戏带有背景音乐和网络对战功能。 首先是绘制地图,我直接在RpgMaker上绘制,导出成PNG,然后在MFC中绘制。作为背景,每次第一遍绘制。 然后绘制主角和敌人的图片以及动画,还是使用了RpgMaker的素材,使用2个定时器,一个用于绘制背景、角色位置,另一个用于切换角色的脸朝向和帧,比如左右迈腿。角色的行走图是非常有趣的,第一次看到RpgMaker XP的行走图时,我觉得非常巧妙。这次用的是RpgMaker MV的行走图,从原来的一个方向4帧改成了3帧。
行走图
然后使用消息预处理事件,监听键盘输入,判断是否和文章相同,记录正确输入个数,然后使用GDI+绘制文本时,先绘制黑色的原文,再绘制输入的文字,用红色着重显示。NPC也以类似的方式记录输入个数,NPC敌人将以一定的速度增加输入的个数,留下了用道具改变速度的可能,但没有实现。 后来为了加上网络对战,引入了定义游戏模式的变量,一开始是开始页面,按Start键进入游戏,默认是单机模式Single,联机模式有两种,一种是建立主机,一种是加入别人的游戏。使用HP-Socket是因为看介绍说很好,用起来感觉还是有点不太方便。我设计的任何一个游戏进程,都可以做主机或者客户机,具有建立主机、搜索主机、加入游戏的功能,就像红警和魔兽一样。采用最简单的方式,建立主机约定使用一个固定的端口,搜索主机则扫描同网络号的所有主机上的这个端口,改成8080试了一下,在局域网内搜索到好多人的Tomcat服务器。如果搜索到主机,就加入列表中,立即调用断开连接,如果连接失败,HP-Socket就会断开这个连接,当然是异步的,只要发起断开的信号,什么时候断开无需掌控。玩家选择一个主机,加入游戏,则会建立一条与主机的TCP连接,自定义游戏协议交互一些是否接收挑战的信息,主机玩家点击同意之后,网络对战就开始了。 为了简单,省去了玩家选择角色的功能,默认主机玩家是警察,客户机玩家是小偷,双方互相传送输入的字符数,在两端互相绘制图像。一个人打字快的话,网络通信还是很频繁的,容易出现粘包,因此应该注意处理,这里直接略过了。 然后游戏的结束就需要做一点碰撞检测,2D也需要碰撞检测,就是判断一下两个图是否有重合,然后提示游戏结束,玩家胜利或者失败。还可以做个打字速度统计,但是实在懒得弄了,等哪天有空了用一些主流的游戏引擎做一下。 顺便也加上了背景音乐,还是很带感的。代码地址是https://gitee.com/liqingjia/game ,欢迎需要交作业的同学拿去使用,相信现在大学老师也不再教这个了吧。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据