前言
本学期有一门专必课《面向对象技术和方法》,老师要求提交一个项目作为考核标准,要求用Java或C++,必须体现面向对象思想。
作为一个C++狂热爱好者跟有志从事游戏开发行业的菜鸟,第一个想法就是做个小游戏啦。虽然自学了DirectX9.0c的大部分知识,但是从那么底层开始写实在痛苦。好吧,其实是没时间,动手做时离deadline只有不到三周。于是就找了一个较为轻量级的C++游戏引擎Oxygine进行游戏开发。经过差不多两周的时间奋斗,最后捣鼓出了一个极其简陋的游戏出来,刚好今天有时间就小小总结一下。
Oxygine引擎
虽然一直都知道Cocos2dX,但是没有用过,感觉比较庞大,而且是倾向于移动端游戏,所以没有选择Cocos2dX,而是选择了Oxygine引擎。
这里稍微介绍一下Oxygine引擎(下列内容从Oxygine官网上搬过来的)。
特性
- Oxygine是完全免费和开源(MIT许可证)的跨平台2D游戏引擎,可在GitHub上获得。 它是用C++编写的,能够在MacOSX,iOS,Android,Windows和Linux上运行。
- Oxygine是纯C++编写。提供易于使用的API,使用基于场景的管理系统来处理渲染和更新,并提供扩展与自定义渲染及更新的能力。
- 可以在Web浏览器中构建和运行C ++ Oxygine应用程序。 它不需要任何插件,如Flash或Unity,并且使用WebGL进行渲染,作为纯HTML5 / JS应用程序运行。
- 内嵌有分析工具。可以使用嵌入式工具分析应用程序。 检查运行时场景,加载纹理,FPS,性能等。
- ……
还有更多的一些特性就不贴出来了,总体使用感受还是很不错的,适合我这种喜欢敲代码的人(Unity3d的可视化编辑也是我的菜,哈哈)。
它能够开发运行在不同环境下的程序,由于课程需要,所以我做的是PC端程序,用的是VS。新项目的构建,基本功能的使用都能够通过Wiki上的视频学习,确实比较容易上手,而且如果需要插件,也可以直接添加进去。
不过Oxygine还是有它的一些缺点的,其中最明显的就是使用的人不多,所以能够在网上找的资料极其少,基本只能查API手册,Wiki和官网论坛,而且API手册内容还不是很全,所以部分内容只能看源码理解。
填坑总结
在使用的过程中遇到了不少的坑,这里小小的记录一下:
- 声音的播放。 Oxygine新建的解决方案里是不包含声音播放对应的扩展项目,所以如果要在游戏里播放音乐,一种选择就是添加oxygine-sound扩展项目,步骤如下:
1.项目属性页->C/C++->常规->附加包含目录,添加上电脑里oxygine-sound项目下的src目录,比如我的电脑就是”D:\Oxygine\oxygine-framework-with-sdl\oxygine-sound\src”;
2.项目属性页->链接器->常规->附加库目录,添加上oxygine-sound项目下lib目录里win32目录,比如我的电脑就是”D:\Oxygine\oxygine-framework-with-sdl\oxygine-sound\libs\win32”;
3.添加oxygine-sound项目到解决方案中,右键解决方案,添加->现有项目->选择oxygine-sound项目
4.对于主项目添加对oxygine-sound项目的引用
如果有问题,可以参考论坛里的这篇问答:http://oxygine.org/forum/viewtopic.php?f=8&t=3359&p=4976&hilit=ogg#p4974 。
- 自定义事件 自定义事件很容易,然而在分派和处理事件时,分派对象跟处理事件的对象必须是同一个对象,或是处理事件对象是分派对象的子节点(Oxygine中渲染的元素是以树状形式组织的)。这是我自己调试得出的结果,如果有错欢迎指出。所以我的游戏中统一让舞台节点(渲染的根节点)进行事件分发和处理。
游戏项目简介
我做的游戏是一个战棋类回合制游戏,实话说做得很挫,而且没怎么优化,类之间耦合得比较严重,不过毕竟是自己充当了设计师+美工+程序而完成的项目,还是稍微记录一下吧。
系统设计
程序有一个控制类Game负责管理整个游戏的运行,而游戏由4个场景类组成,分别是开始场景,选择英雄场景,战斗场景和战斗结果场景,统一派生自场景基类。各个场景基类负责管理自己的元素,其中战斗场景还负责控制战斗过程。实现时完成了两个英雄子类和一个怪物子类,分别派生自英雄基类和怪物基类。为了方便管理元素的位置有一个位置管理类。陌生类之间的通信通过事件完成。
类图如下(设计得不好,画得也不好,勿喷):
效果图
附加说明
开发使用的素材来自游戏全民大冒险和块块传奇,都是在淘宝上买的,经过本人后期PS处理,仅作为学习之用。
由于游戏做得确实很挫,代码什么的就不给了,等我功力足够时再分享自己项目的源码。
总结
不得不说,实践是提高的最好方式。对于C++的知识,我之前还是记忆多于动手,一般都只是刷刷编程题,所以真的开始写程序时,有种力不从心的感觉,因为很多知识都只是背顺了,然而怎么转化为具体的代码却未曾实践过,因此通过自己动手去写,编码能力确实得到了提高,同时也会遇到一些特殊的情景用到了设计模式,从而使我对于设计模式的部分概念有了不一样的体会。当然啦,还提高了其他技能,比如PS,做项目的两周内,差不多30%的时间花在利用PS处理素材上,美工真不容易做。
在之后的时间内会多动手去做些项目,应该主要是Unity3D项目,提高一下自己的动手能力,有时间会分享一下成果。加油,骆小坑!对游戏开发保持敬畏之心,努力拼搏,朝梦想前进!