刚刚接触cocos2d-x引擎,有些东西总是看了一段时间后又忘记了,所以找个地方记下来,顺便能够和大家一块交流学习。由于是初学笔记,所以这部分内容不会对引擎功能的实现进行深入研究,只是知道怎么用而已。以后掌握的多了再进行研究分析(我现在是菜鸟一个,也分析不出什么东西来)。
按照国际惯例,首先是HelloWorld浅析。cocos2d-x的安装和环境配置我就不说了,网上都有详细的安装教程。安装时出现错误就上网查,一个一个解决,最后就OK了。成功后会出现官方提供的参考示例项目,我的共12个,其中HelloWorld被改名了,成了HelloCpp。
(注意:我使用的cocos2d-x版本是2.0.4,系统是win7)下载地址
同时,cocos2d-x从1.0升级到2.0之后改动了许多地方,详情参见官方文档
好了,让我们把HelloCpp运行起来,就出现如下图
我们可以看到,HelloCpp运行后显示的界面为:一张背景图,一行“HelloWorld”文字,左下角显示三行设置的数据,右下角是一个关闭按钮,点击关闭程序。接下来我们打开HelloCpp项目代码,来看一下它的结构和运行流程。
由于我们是在Windows系统下运行的,所以main.h/cpp放在了win32文件夹下。main.h文件定义了使用win32平台进行编译的宏和一些Windows编程头文件。
#ifndef __MAIN_H__ #define __MAIN_H__ //定义了使用win32进行编译的宏 #define WIN32_LEAN_AND_MEAN // Windows编程用到的头文件 #include <windows.h> #include <tchar.h> // cocos2d-x的C语言头文件 #include "CCStdC.h" #endif // __MAIN_H__
#include "main.h" #include "../Classes/AppDelegate.h" #include "CCEGLView.h" //using name space cocos2d;的宏表示 USING_NS_CC; //WinMain主函数 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { //UNREFERENCED_PARAMETER用于在VC编译器下告知编译器,不必检测变量是否使用的警告 UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // 创建一个cocos2d-x程序实例 AppDelegate app; //创建OpenGL窗体,并设置大小 CCEGLView* eglView = CCEGLView::sharedOpenGLView(); eglView->setFrameSize(2048, 1536); //Windows的分辨率小,所以设置为0.4倍 eglView->setFrameZoomFactor(0.4f); //运行程序实例 return CCApplication::sharedApplication()->run(); }
接下来是AppDelegate.h/cpp。AppDelegate.h文件的代码如下
#ifndef _APP_DELEGATE_H_ #define _APP_DELEGATE_H_ #include "cocos2d.h" //继承自CCApplication class AppDelegate : private cocos2d::CCApplication { public: AppDelegate(); virtual ~AppDelegate(); //重载应用程序启动后调用的处理函数 virtual bool applicationDidFinishLaunching(); //重载应用程序转入后台时调用的函数 virtual void applicationDidEnterBackground(); //重载应用程序恢复前台时调用的函数 virtual void applicationWillEnterForeground(); }; #endif // _APP_DELEGATE_H_
再看 AppDelegate.cpp文件
#include "AppDelegate.h" #include "HelloWorldScene.h" #include "AppMacros.h" USING_NS_CC; AppDelegate::AppDelegate() { } AppDelegate::~AppDelegate() { } //重载应用程序启动后调用的处理函数 bool AppDelegate::applicationDidFinishLaunching() { //初始化显示设备和OpenGL窗体 CCDirector* pDirector = CCDirector::sharedDirector(); CCEGLView* pEGLView = CCEGLView::sharedOpenGLView(); //设置显示设备使用建立的OpenGL窗体 pDirector->setOpenGLView(pEGLView); // 设置指定的分辨率 pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionNoBorder); //获得窗体的大小 CCSize frameSize = pEGLView->getFrameSize(); // 根据窗体框架的高度来选择不同分辨率的资源,如果资源大小不同于指定分辨率的大小,我们要对其进行调整 // 我们用资源高度和指定分辨率的高度的比进行调整 // 这样就能保证资源的高度能够适合设定分辨率的高度 // 如果指定分辨率框架的高度大于mediumResource资源的高度,选择largeResource if (frameSize.height > mediumResource.size.height) { CCFileUtils::sharedFileUtils()->setResourceDirectory(largeResource.directory); pDirector->setContentScaleFactor(largeResource.size.height/designResolutionSize.height); } // 如果指定分辨率框架的高度大于smallResource资源的高度,选择mediumResource else if (frameSize.height > smallResource.size.height) { CCFileUtils::sharedFileUtils()->setResourceDirectory(mediumResource.directory); pDirector->setContentScaleFactor(mediumResource.size.height/designResolutionSize.height); } // 如果指定分辨率框架的高度大于mediumResource资源的高度,选择smallResource else { CCFileUtils::sharedFileUtils()->setResourceDirectory(smallResource.directory); pDirector->setContentScaleFactor(smallResource.size.height/designResolutionSize.height); } // 显示FPS pDirector->setDisplayStats(true); // 设置FPS帧间隔时间 pDirector->setAnimationInterval(1.0 / 60); // 创建场景,即通过HelloWorld的scene()返回的场景实例 CCScene *pScene = HelloWorld::scene(); // 运行这个场景 pDirector->runWithScene(pScene); return true; } //重载应用程序转入后台时调用的函数,如电话打进来 void AppDelegate::applicationDidEnterBackground() { CCDirector::sharedDirector()->stopAnimation(); // 如果使用了声音引擎,这里进行暂停设置。否则会影响到通话,因为暂时没用到,所以屏蔽 // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); } //重载应用程序恢复前台时调用的函数 void AppDelegate::applicationWillEnterForeground() { CCDirector::sharedDirector()->startAnimation(); //如果使用了声音引擎,这里进行恢复设置 // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); }
最后,介绍下HelloWorld.h/cpp。
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" //继承自CCLayer,所以HelloWorld是一个布景 class HelloWorld : public cocos2d::CCLayer { public: // 布景HelloWorld的初始化方法 virtual bool init(); // 用于返回实例化的场景,在AppDelegate里运行这个场景 static cocos2d::CCScene* scene(); // 菜单回调函数 void menuCloseCallback(CCObject* pSender); // create()的宏表达 CREATE_FUNC(HelloWorld); }; #endif // __HELLOWORLD_SCENE_H__
cpp的实现如下
#include "HelloWorldScene.h" #include "AppMacros.h" USING_NS_CC; //返回用于运行的场景实例 CCScene* HelloWorld::scene() { // create()创建的对象是自动销毁的,实例化一个场景 CCScene *scene = CCScene::create(); // create()创建的对象是自动销毁的,实例化一个布景 HelloWorld *layer = HelloWorld::create(); // 将实例化的HelloWorld布景添加到场景中 scene->addChild(layer); // 返回这个场景 return scene; } // 初始化HelloWorld布景实例 bool HelloWorld::init() { ////////////////////////////// // 1.实现父类的init()方法 if ( !CCLayer::init() ) { return false; } CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); ///////////////////////////// // 2. 添加一个菜单,点击退出程序 // 创建一个图标菜单项 CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback)); //设置位置 pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 , origin.y + pCloseItem->getContentSize().height/2)); // 创建菜单,并且设置位置,将其添加到HelloWorld布景中 CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); pMenu->setPosition(CCPointZero); this->addChild(pMenu, 1); ///////////////////////////// // 3. 添加背景图片和一行“HelloWorld”文字 //创建一行文字,内容为“HelloWorld” CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE); //设置显示位置 pLabel->setPosition(ccp(origin.x + visibleSize.width/2, origin.y + visibleSize.height - pLabel->getContentSize().height)); // 加入到HelloWorld布景中 this->addChild(pLabel, 1); // 创建一个精灵,实际上就是一张图片 CCSprite* pSprite = CCSprite::create("HelloWorld.png"); //设置位置 pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); // 将这个精灵图片添加到HelloWorld布景中 this->addChild(pSprite, 0); return true; } //菜单回调函数,当点击菜单时执行 void HelloWorld::menuCloseCallback(CCObject* pSender) { CCDirector::sharedDirector()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif }
好了,现在我们已经简单的看了一下HelloCpp项目的执行过程,并将其各个步骤的作用进行了注释。相信大家能够理解。接下来我会参考着TestCpp项目,讲一下其中常用功能的实现方法,依然是简单介绍,知道怎么用,不对其进行进行深入的研究。
第一次写博客,难免有疏漏和错误的地方,希望大家能够指正教导,有表达不好的地方也望大家海涵。写一点学习笔记和大家交流探讨,有些地方可千万别被我误导了,我也是一个小白。
最后祝愿每一个奋斗在路上的人早日实现梦想!