刚刚接触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__
然后看一下main.cpp的实现
#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项目,讲一下其中常用功能的实现方法,依然是简单介绍,知道怎么用,不对其进行进行深入的研究。
第一次写博客,难免有疏漏和错误的地方,希望大家能够指正教导,有表达不好的地方也望大家海涵。写一点学习笔记和大家交流探讨,有些地方可千万别被我误导了,我也是一个小白。
最后祝愿每一个奋斗在路上的人早日实现梦想!