cocos2d-x初学笔记01:HelloWorld浅析

       刚刚接触cocos2d-x引擎,有些东西总是看了一段时间后又忘记了,所以找个地方记下来,顺便能够和大家一块交流学习。由于是初学笔记,所以这部分内容不会对引擎功能的实现进行深入研究,只是知道怎么用而已。以后掌握的多了再进行研究分析(我现在是菜鸟一个,也分析不出什么东西来偷笑)。

       按照国际惯例,首先是HelloWorld浅析。cocos2d-x的安装和环境配置我就不说了,网上都有详细的安装教程。安装时出现错误就上网查,一个一个解决,最后就OK了。成功后会出现官方提供的参考示例项目,我的共12个,其中HelloWorld被改名了,成了HelloCpp。

      (注意:我使用的cocos2d-x版本是2.0.4,系统是win7)下载地址

       同时,cocos2d-x从1.0升级到2.0之后改动了许多地方,详情参见官方文档

       好了,让我们把HelloCpp运行起来,就出现如下图

                                       cocos2d-x初学笔记01:HelloWorld浅析_第1张图片

        我们可以看到,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项目,讲一下其中常用功能的实现方法,依然是简单介绍,知道怎么用,不对其进行进行深入的研究。

        第一次写博客,难免有疏漏和错误的地方,希望大家能够指正教导,有表达不好的地方也望大家海涵。写一点学习笔记和大家交流探讨,有些地方可千万别被我误导了,我也是一个小白。        

        最后祝愿每一个奋斗在路上的人早日实现梦想!

你可能感兴趣的:(cocos2d-x初学笔记01:HelloWorld浅析)