1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

时间:2024-01-09 14:19:38


1
游戏逻辑架构

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

具体介绍

A
一个导演同一时间仅仅能执行一个场景,场景其中,能够同一时候载入多个层,一个层能够可载多个精灵。层中亦能够加层。


场景切换

sceneàaddChild(layer);

layeràaddChild(sprite);

2
项目创建命令:

A
进入tools下的project-creat

E:\Installed\cocos2d-x-2.2.3\tools\project-creator>

B

python create_project.py -project MyCocos2dx -package com.toto.mycocos01 -language cpp

C
命令解释:

-project MyCocos2dx工程名

-package com.toto.mycocos01
包名

-language cpp
开发语言可选项目有javascript lua

D
创建后的项目文件夹:

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

3
 简单介绍

1
查看cocos2dx游戏的版本号信息。

创建了一个cocos2dx项目之后,打开项目之后,会有例如以下项目结构

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

展开libcocos2d,找到cocos2d.cpp,双击打开此cpp文件,内容例如以下:

#include
"cocos2d.h"

NS_CC_BEGIN

const
char*
cocos2dVersion()

{

return
"2.2.3";

}

NS_CC_END

截图例如以下:

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

分析:


由上能够看出项目的版本是:2.2.3


依赖的头文件
“cocos2d.h”

2
查看程序入口

程序入口是:main.cpp

#include
"main.h"

#include
"AppDelegate.h"

#include
"CCEGLView.h"

USING_NS_CC;

int
APIENTRY
_tWinMain(HINSTANCE
hInstance,

HINSTANCE
hPrevInstance,

LPTSTR   
lpCmdLine,

int      
nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

// create the application instance

AppDelegate
app;   
                         //Delegate:表示
委派…为代表 n:代表

CCEGLView*
eglView =
CCEGLView::sharedOpenGLView();

eglView->setViewName("MyCocos2dx");    
            //程序的标题

eglView->setFrameSize(480,
320);                    //程序的尺寸

return
CCApplication::sharedApplication()->run();  
//关于shared的通常是单例模式

}

进入run函数,
run的代码结构例如以下(选中run(),再按F12进行查看):

int
CCApplication::run()

{

PVRFrameEnableControlWindow(false);

// Main message loop:

MSG
msg;

LARGE_INTEGER
nFreq;

LARGE_INTEGER
nLast;

LARGE_INTEGER
nNow;

QueryPerformanceFrequency(&nFreq);

QueryPerformanceCounter(&nLast);

// Initialize instance and cocos2d.

if (!applicationDidFinishLaunching())

{

return 0;

}

CCEGLView*
pMainWnd =
CCEGLView::sharedOpenGLView();

pMainWnd->centerWindow();

ShowWindow(pMainWnd->getHWnd(),
SW_SHOW);

while (1)

{

if (!
PeekMessage(&msg,
NULL, 0, 0,
PM_REMOVE))

{

// Get current time tick.

QueryPerformanceCounter(&nNow);

// If it's the time to draw next frame, draw it, else sleep a while.

if (nNow.QuadPart
- nLast.QuadPart
> m_nAnimationInterval.QuadPart)

{

nLast.QuadPart
= nNow.QuadPart;

CCDirector::sharedDirector()->mainLoop();

}

else

{

Sleep(0);

}

continue;

}

if (WM_QUIT
== msg.message)

{

// Quit message loop.

break;

}

// Deal with windows message.

if (!
m_hAccelTable || !
TranslateAccelerator(msg.hwnd,
m_hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return (int)
msg.wParam;

}

程序的入口:applicationDidFinishLaunching()

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

AppDelegate.cpp

bool
AppDelegate::applicationDidFinishLaunching()
{

// initialize director

CCDirector*
pDirector =
CCDirector::sharedDirector();

CCEGLView*
pEGLView =
CCEGLView::sharedOpenGLView();

pDirector->setOpenGLView(pEGLView);

// turn on display FPS

pDirector->setDisplayStats(true);

// set FPS. the default value is 1.0/60 if you don't call this

pDirector->setAnimationInterval(1.0
/ 60);    //设置帧率

// create a scene. it's an autorelease object

CCScene *pScene
= HelloWorld::scene();

// run

pDirector->runWithScene(pScene);

return
true;

}

截图:

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

HelloWorldScene.h  
HelloWorld类的本质是一个层(CCLayer):

#ifndef
__HELLOWORLD_SCENE_H__

#define
__HELLOWORLD_SCENE_H__

#include
"cocos2d.h"

class
HelloWorld :
public
cocos2d::CCLayer

{

public:

// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone

virtual
bool
init();

// there's no 'id' in cpp, so we recommend returning the class instance pointer

static
cocos2d::CCScene*
scene();

// a selector callback

void
menuCloseCallback(CCObject*
pSender);

// implement the "static node()" method manually

CREATE_FUNC(HelloWorld);

};

#endif
// __HELLOWORLD_SCENE_H__

HelloWorldScene.cpp

#include
"HelloWorldScene.h"

USING_NS_CC;

CCScene*
HelloWorld::scene()

{

// 'scene' is an autorelease object

CCScene *scene
= CCScene::create();

// 'layer' is an autorelease object

HelloWorld *layer
= HelloWorld::create();

// add layer as a child to scene

scene->addChild(layer);

//return the scene

return
scene;

}

// on "init" you need to initialize your instance

bool
HelloWorld::init()

{

//////////////////////////////

// 1. super init first

if ( !CCLayer::init()
)

{

return
false;

}

CCSize
visibleSize =
CCDirector::sharedDirector()->getVisibleSize();

CCPoint
origin =
CCDirector::sharedDirector()->getVisibleOrigin();

/////////////////////////////

// 2. add a menu item with "X" image, which is clicked to quit the program

//   
you may modify it.

// add a "close" icon to exit the progress. it's an autorelease object

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));

// create menu, it's an autorelease object

CCMenu*
pMenu =
CCMenu::create(pCloseItem,
NULL);

pMenu->setPosition(CCPointZero);

this->addChild(pMenu,
1);

/////////////////////////////

// 3. add your codes below...

// add a label shows "Hello World"

// create and initialize a label

CCLabelTTF*
pLabel =
CCLabelTTF::create("Hello
World",
"Arial", 24);

// position the label on the center of the screen

pLabel->setPosition(ccp(origin.x
+ visibleSize.width/2,

origin.y
+ visibleSize.height
- pLabel->getContentSize().height));

// add the label as a child to this layer

this->addChild(pLabel,
1);

// add "HelloWorld" splash screen"

CCSprite*
pSprite =
CCSprite::create("HelloWorld.png");

// position the sprite on the center of the screen

pSprite->setPosition(ccp(visibleSize.width/2
+ origin.x,
visibleSize.height/2
+ origin.y));

// add the sprite as a child to this layer

this->addChild(pSprite,
0);

return
true;

}

void
HelloWorld::menuCloseCallback(CCObject*
pSender)

{

#if (CC_TARGET_PLATFORM
== CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM
== CC_PLATFORM_WP8)

CCMessageBox("You
pressed the close button. Windows Store Apps do not implement a close button.","Alert");

#else

CCDirector::sharedDirector()->end();

#if (CC_TARGET_PLATFORM
== CC_PLATFORM_IOS)

exit(0);

#endif

#endif

}

总结:

1、对于cocos真正的初始化是在init()方法中

2、CCScene中的 
autorelease()完毕了析构的过程

3、CCPointZero
表示的位置是CCPointMake(0,0);

4
(CCApplicationProtocol,CCApplication,AppDelegate)三个类的类关系介绍:

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

抽出代码详细实现:

长处:屏蔽了平台的差异性,实现跨平台

1  
CCApplicationProtocol 定义了接口

#ifndef
__CC_APPLICATION_PROTOCOL_H__

#define
__CC_APPLICATION_PROTOCOL_H__

NS_CC_BEGIN

enum
TargetPlatform

{

kTargetWindows,

kTargetLinux,

kTargetMacOS,

kTargetAndroid,

kTargetIphone,

kTargetIpad,

kTargetBlackBerry,

kTargetNaCl,

kTargetEmscripten,

kTargetTizen,

kTargetWinRT,

kTargetWP8

};

/**

* @addtogroup platform

* @{

* @js NA

* @lua NA

*/

class
CC_DLL
CCApplicationProtocol

{

public:

virtual ~CCApplicationProtocol()
{}

/**

@brief    Implement CCDirector and CCScene init code here.

@return true    Initialize success, app continue.

@return false   Initialize failed, app terminate.

*/

virtual
bool
applicationDidFinishLaunching() = 0;    
//这个类是一个纯虚函数

/**

@brief  The function be called when the application enter background

@param  the pointer of the application

*/

virtual
void
applicationDidEnterBackground() = 0;

/**

@brief  The function be called when the application enter foreground

@param  the pointer of the application

*/

virtual
void
applicationWillEnterForeground() = 0;

/**

@brief    Callback by CCDirector for limit FPS.

@interval       The time, expressed in seconds, between current frame and next.

*/

virtual
void
setAnimationInterval(double
interval) = 0;

/**

@brief Get current language config

@return Current language config

*/

virtual
ccLanguageType
getCurrentLanguage() = 0;

/**

@brief Get target platform

*/

virtual
TargetPlatform
getTargetPlatform() = 0;

};

// end of platform group

/// @}

NS_CC_END

#endif   
// __CC_APPLICATION_PROTOCOL_H__


CCApplication 各个平台不同的逻辑

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg


AppDelegate 私有继承了CCApplication
仅实现CCApplicationProtocol
里的接口

1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg