标签:
1 游戏逻辑架构
具体介绍
A 一个导演同一时间仅仅能执行一个场景,场景其中,能够同一时候载入多个层,一个层能够可载多个精灵。层中亦能够加层。 |
B 场景切换 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
截图例如以下:
分析: A 由上能够看出项目的版本是:2.2.3 B 依赖的头文件 “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__
|
2 CCApplication 各个平台不同的逻辑
|
3 AppDelegate 私有继承了CCApplication 仅实现CCApplicationProtocol 里的接口
|
1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/4184443.html