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



1
游戏逻辑架构

详细介绍


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
创建后的项目目录:

3
 简介


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

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

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

#include
"cocos2d.h"

NS_CC_BEGIN

const
char*
cocos2dVersion()

{

return
"2.2.3";

}

NS_CC_END

截图如下:

分析:


由上可以看出项目的版本号是: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()


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;

}

截图:


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  
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 各个平台不同的逻辑



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

时间: 2025-01-05 04:00:54

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

cocos2d-x 3.0 HelloWorld项目创建

1.cocos2d支持python,创建项目都可以用它自带的脚本, 所以第一步下载安装python, 然后配置系统环境变量, 让操作系统支持python脚本, 能找到二进制文件 地址: https://www.python.org/ 2.下载cocos2d-x 3.0 源码,解压 地址: http://www.cocos2d-x.org/ 3.安装vs2012 开发工具 4.解压cocos2d-x, 打开cmd,进入cocos2d-x  3.0中cocos2d-console目录执行创建项目脚本

IntelliJ IDEA 创建SpringBoot项目报错: 程序包org.springframework.boot不存在

解决方案:在pom.xml配置文件中添加依赖 <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId></dependency> 如果添加后依然报错可以重新加载maven包 1. Build-->Rebulid Project 就好了 2. 在项目根目录执行cmd 

游戏服务器架构分析

记录下我们游戏服务器的架构 游戏服务器逻辑架构图 我自己设计的游戏逻辑架构图 游戏服务器程序框架图 程序入口代码 // 读取此服务器相关配置  Log.Notice("Config", "Checking config file: %", config_file);  if(Config.MainConfig.SetSource(config_file, true))  {   Log.Success("Config", "Passed

.Net程序员玩转Android开发---(2)Hello World项目创建

对于程序员来说,刚开始接触到的第一个项目都是Hello World, 我们这里第一个项目也从Hello Word创建. 1. 项目创建 运行eclipse.exe文件,打开开发工具eclipse,选择项目存放位置,界面如下 打开eclipse后,选择 file-new--Android Applicaton Project创建Android项目,界面如下 步骤如下 2.

tfs中如何创建团队项目及如何操作团队项目

创建团队项目集合 tfs server管理控制台\团队项目集合页面.选择'创建集合'链接,按向导即可创建项目集合. 创建团队项目 创建好团队项目集合后,就要开始创建团队项目了. 进入vs,连接上tfs服务器后,从下面菜单选择'新建团队项目...' 然后,输入团队项目名称,过程模板选择Agile,源代码管理选择tfs,然后直到完成即可创建一个团队项目. 删除团队项目 为了测试,我们往往会创建一个供测试的团队项目,当不再需要的时候就要从tfs中删除,那么怎样才彻底将团队项目从tfs中删除呢.一般有两

nodejs创建Express项目

Express项目 环境准备:nodejs.express npm install -g express/ npm install -g express-generator 使用WebStorm创建Express项目 创建express-generator版本选择4.14.1及以下版本创建,选择4.15创建会失败. 使用命令创建Express项目 参考: nodeJS学习(4)--- webstorm/...开发 NodeJS 项目 nodeJS入门--新建一个项目及代码详解 NodeJs--

.Net Core .Net Core V1.0 创建MVC项目

.Net Core V1.0 创建MVC项目 创建MVC项目有两种方式: 一.创建Web项目:(有太多没用的东西要去删太麻烦) 2.项目目录结构: 此种方法要注意的是,会创建好多个json文件,下面就简单的介绍: launchSettings.json//启动配置文件: appsettings.json //配置文件,如framework下的webconfig文件: bower.json //存放文件的引用,例如:jquery等文件: bundleconfig.json //自动压缩可关联文件:

IOS5基础教程之一-----如何创建XCode项目

一.IOS的基础知识 1.只有一个应用程序正在运行.在IOS上,每一段时间内只能激活一个应用程序并在屏幕上显示. 2.只有一个窗口.只允许应用程序操作的一个窗口. 3.访问受限.只能在IOS为应用程序创建的文件系统中读写文件.此区域称为应用程序的沙盒,应用程序在其中存储文档.首选项等需要存储的各种数据. 4.有限的响应时间. 5.有限的屏幕大小. 6.有限的系统资源. 7.不支持垃圾收集.IOS引入了一个新特性——自动引用计数(Automatic Reference Counting ,ARC)

m2eclipse简单使用,创建Maven项目 ,运行mvn命令(转)

前面介绍了如何安装m2eclipse,现在,我们使用m2ecilpse导入Hello World项目. 选择菜单项File,然后选择Import,我们会看到一个Import对话框,在该对话框中选择General目录下的Maven Projects,然后点击Next,就会出现Import Projects对话框, 在该对话框中点击Browse…选择Hello World的根目录(即包含pom.xml文件的那个目录),这时对话框中的Projects:部分就会显示该目录包含的Maven项目. 点击Fi