Cocos2d-x学习笔记之Hello World源码分析
首先我们来说一下游戏的原理,游戏类似于一场电影,早期的电影不就是靠一张张的图片放出来的吗?把场景人物什么的画在一幅幅图片上,然后从第一张图片开始播放就可以了。游戏更是如此,其实我们玩的游戏看到的画面都是美工做出来的,我们程序员要做的事情是组织这些图片,比如先弄个背景图片,然后在某一个坐标上放置一个人物的图片,我们写好程序,控制这个图片的移动路径,等机器运行的时候每秒都要刷新画面,我们就看到人物动了起来。而刷新页面的快慢就是我们所说的帧率,这个在程序中我们可以控制。整体的意思就是游戏不过是一些图片罢了,而我们就是控制这些图片,让这些图片运动,当用户单击图片的时候我们做一些事件响应的处理等等,当然还有一些其他的工作。然后cocos2d-x中有一些基本的类,比如导演类,这个是用来控制整个游戏的,正如正真的导演一样,每个游戏中只有一个导演,是一种单例设计模式。还有场景类,图层类,使用最广的就是精灵类,场景里边可以包含图层,图层上包含精灵。下面我们就通过这个helloworld场景来进入cocos2d-x的编程世界吧。
我们先把结果运行出来,看着图来说明代码的含义。大多数代码的含义都有注释,大家可以看代码了。
首先是main.cpp
#include "main.h" #include "AppDelegate.h" #include "CCEGLView.h" USING_NS_CC; // uncomment below line, open debug console // #define USE_WIN32_CONSOLE int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); #ifdef USE_WIN32_CONSOLE AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); #endif // create the application instance AppDelegate app; //CCEGLView是单例设计模式,通过调用sharedOpenGLView()(以后只要是看到shared...就代表是一种单例设计模式)函数,获得全局唯一的opengl图像引擎的实例 CCEGLView* eglView = CCEGLView::sharedOpenGLView(); //以下这句比较重要,setFrameSize(x,y)是设置游戏窗口的大小,通过改变传入的值,可以改变游戏窗口的大小,看到窗口顶部的那行字了吗,就是写的窗口的大小 eglView->setFrameSize(480, 320); int ret = CCApplication::sharedApplication()->run(); #ifdef USE_WIN32_CONSOLE FreeConsole(); #endif return ret; }
Appdelegate.cpp如下
#include "cocos2d.h" //想要使用cocos2d-x引擎,就要包含这个头文件 #include "CCEGLView.h" //这个是opengl图形引擎的头文件 #include "AppDelegate.h" //这个是生命周期类的头文件 #include "HelloWorldScene.h" //这个是HelloWorld场景的头文件 #include "SimpleAudioEngine.h" //这个是声音引擎的头文件 //要使用声音引擎,必须使用命名空间CocosDenshion using namespace CocosDenshion; //要使用cocos2d-x引擎,必须使用命名空间cocos2d,这个宏定义相当于using namespace cocos2d,大家可以选中它,按下f12,转到它的定义 USING_NS_CC; //以下这俩个分别是生命周期类的构造函数和析构函数 AppDelegate::AppDelegate() { } AppDelegate::~AppDelegate() { //游戏生命周期结束的时候停止播放声音,知道c++基础的人一定知道end()函数是静态函数吧 SimpleAudioEngine::end(); } //当游戏启动的时候,就会调用这个函数,所以以后我们应该从这个函数看起 bool AppDelegate::applicationDidFinishLaunching() { //导演类的初始化,又是shared...所以又是单例设计模式啊 CCDirector *pDirector = CCDirector::sharedDirector(); pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); //大家看到了游戏左下角的那个数字60了吗,这个就是帧率(就是每秒钟游戏屏幕刷新的次数),这里可以设置它是否显示在左下角 pDirector->setDisplayStats(true); //当然这里就是设置这个帧率了,在手机上的时候帧率不能小于30,否则游戏玩起来就会卡,帧率越高当然越耗CPU了,也就越费电了,所以帧率应该合理的设置 pDirector->setAnimationInterval(1.0 / 60); //创建一个helloworld场景,从这里就能看出scene是一个静态函数吧 CCScene *pScene = HelloWorld::scene(); //然后导演调用runWithScene()函数来运行helloworld场景 pDirector->runWithScene(pScene); return true; } //当我们玩游戏的时候突然被其他事情打断的时候,比如接电话,就会调用这个函数 void AppDelegate::applicationDidEnterBackground() { //导演调用stopAnimation()来停止播放画面 CCDirector::sharedDirector()->stopAnimation(); //声音引擎停止播放声音 SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); } //当事件处理完成之后就会调用这个函数,比如电话接听完毕 void AppDelegate::applicationWillEnterForeground() { CCDirector::sharedDirector()->startAnimation(); SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); }