一.基础知识:C++的类
可能大多数写java的童鞋会很头疼,因为C++类写在两个文件里,一个是.h文件是类的声明,而.cpp文件则是类的定义。在.h头文件里声明类和类的各个方法,然后在.cpp源文件中再定义它的实现方式。个人就把他们理解成是目录和文章的关系。
二.工程架构
(一)在文件夹中cocos2dx 的文件结构
Class:Cocos2d-x的C++类文件,游戏的入口类为AppDelegate.cpp ,其余文件根据项目情况安排。
Debug.win32:包括编译生成的OBJ文件、编译日志文件等
Resoures:资源文件夹,放置声音、图片等文件。
win32:win32平台的入口文件main.cpp等。
(题外话:在这里大家可能看到了有两个入口cpp,一个是AppDelegate.cpp,另一个是main.cpp,我可以很负责的告诉大家C++所有的工程都是从main开始启动的,在cocos2d-x中,main.cpp是整个程序窗口的启动类,而AppDelegate.cpp则是Cocos2d-x项目的入口类。)
(二)在VS开发工具中cocos2dx的架构
在2.1.3版本的工程中新建一个项目会包含以上几个文件夹,下面简单的说下这几个文件夹里分别是存放什么样的文件
1.include文件夹:主要存放类的头文件(.h文件)
2.resource文件夹:主要存放项目的资源文件,如声音、图片等
3.source文件夹:主要存放类的源文件(.cpp文件)
4.外部依赖项:编译时会用到的外部加载的类的头文件,这里存放的大部分都是cocos2d-x引擎自带的头文件(在创建的时候自动加载了,不需要手动添加)
三.项目中部分代码讲解
1.main
/*main.cpp*/
// 创建应用程序实例
AppDelegate app;
CCEGLView* eglView = CCEGLView::sharedOpenGLView();
eglView->setFrameSize(480, 320); //设置程序屏幕的大小
eglView->setViewName("MyCocos2d-x"); //这句在cocos2d-x中默认项目中是没有的,用途在于设置窗口的名字,eglView是CCEGLView类的指针,指针->函数,表示调用CCEGLView类的setViewName方法。
int ret = CCApplication::sharedApplication()->run();
2.AppDelegate
/*AppDelegate.cpp*/
bool AppDelegate::applicationDidFinishLaunching()
{
//初始化导演类
CCDirector *pDirector = CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
// 设置是否显示帧数,true为显示,false为不显示
pDirector->setDisplayStats(true);
// 设置帧数。默认值是1.0/60
pDirector->setAnimationInterval(1.0 / 60);
// 创建一个场景。这是一个生成自动释放对象,pScene指向了HelloWorld场景,在屏幕中会从HelloWorld的场景开始
CCScene *pScene = HelloWorld::scene();
// 运行
pDirector->runWithScene(pScene);
return true;
}
3.HelloWorldScene
#include "HelloWorldScene.h" //包含HelloWorldScene.h头文件,在C++项目中,cpp要用到的类都必须在开始的时候include
using namespace cocos2d; //使用cocos2d的命名空间,漏了这一句的话,之后很多cocos2d中的变量都会提示你未定义或找不到对象
CCScene* HelloWorld::scene() //定义一个HelloWorld指针指向scene方法
{
CCScene * scene = NULL; //先把场景scene设为null
do
{
// 创建一个场景,场景是自动释放资源的对象
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 创建HelloWorld层,并将其传给layer指针,层是自动释放资源的对象
HelloWorld *layer = HelloWorld::create();
CC_BREAK_IF(! layer);
// 将HelloWorld层加入场景scene中,在cocos2dx中使用addChild方法
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
// CCLayer类的init函数在创建布景层时被调用
bool HelloWorld::init()
{
bool bRet = false;
do
{
//
// super init first
//
CC_BREAK_IF(! CCLayer::init());
//
// add your codes below...
//
// 1. Add a menu item with "X" image, which is clicked to quit the program.
// 创建一个关闭按钮
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png", //正常状态的图片
"CloseSelected.png", //按下时的图片
this,
menu_selector(HelloWorld::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
// 设置按钮pCloseItem的坐标,并用导演类的shareDirector方法获得屏幕的宽,若要获得高则,CCDirector::sharedDirector()->getWinSize().height
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
// 创建一个菜单类的指针,并把关闭按钮放进菜单中
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero); //菜单的坐标为原点
CC_BREAK_IF(! pMenu);
// 将菜单加入到HelloWorld层容器中,并置于第一层中,层越大则在屏幕中越慢绘制
this->addChild(pMenu, 1);
//创建一个文字标签,“显示的字符,字体,字号”
CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);
CC_BREAK_IF(! pLabel);
// 设置文字标签的坐标
CCSize size = CCDirector::sharedDirector()->getWinSize();
pLabel->setPosition(ccp(size.width / 2, size.height - 50));
// 将文字坐标加入到HelloWorld层中
this->addChild(pLabel, 1);
// 定义一个精灵用于显示HelloWorld.png图片
CCSprite* pSprite = CCSprite::create("HelloWorld.png");
CC_BREAK_IF(! pSprite);
// 设置精灵的位置,位置都是用cpp(x,y)表示的,如果设置为原点可以CCPointZero
pSprite->setPosition(ccp(size.width/2, size.height/2));
// 将精灵加入到HelloWorld层中,并处于第0层的位置,比文字标签要低层,所以先绘制,也就是说文字会在这张图片的上面.
this->addChild(pSprite, 0);
bRet = true;
} while (0);
return bRet;
}
/*事件响应函数*/
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
// 按下了关闭按钮后,程序退出
CCDirector::sharedDirector()->end();
}