cocos2d-x 学习笔记(1)关于cocos2d-x(环境配置,项目结构,文件说明)

1.问:什么是cocos2d-x?

是一套开放源代码,主要基于c,c++语言,针对windows,linux,mac,android,ios,bada,uphone,win8等操作系统平台的用户应用开发进行了封装并集成了opengl,libcurl,poco等其他跨平台开源代码,重写了cocos2d-iphone的api,可以快速开发跨平台的游戏、图形应用。

2.搭建环境
下载并安装vc2010或者2012;
下载并解压cocos2d-x
打开里面的cocos2d-win32.vc2010/2012;

3.cocos-2d-x中的文件夹及文件说明
cocos2dx: 包含了该引擎的核心类,如果懂objective-c 和 cocos2d-iphone的可以对比学习,是图形引擎在各平台的实现代码,当然也包括了多平台程序入口的一致化处理
CocosDenshion: 包含了cocos2d-x音频引擎的多平台实现
Debug.win32:   如果您在vs2008编译或运行了demo该目录为complie输出目录
document:      你懂的
extensions:    2.0新增的UI控件network api,CCScrollView,CCeditBox等
external:      Box2D,chipmunk物理引擎的code
licenses:      如果实在闲的无聊可以打开,带有感情的读读。
samples:       各种 demo, HellpCpp,HellpLua,SimpleGame,TestCpp,TestJavaScript,TestLua
scripting:    javascript和lua脚本的各平台解析器code
template:     组织各平台项目文件的模版(很容易安装)
tools:        工具,没用过,不知道是否有用,哪位达人用过可留言

文件夹说完再看几个文件

create-android-project.bat
create-android-project.sh
用来创建android项目

install-templates-msvc.bat
install-templates-x-code.bat
用来安装项目模版

4.问:cocos-2d-x为什么要定义在windows平台
因为在不同平台有不同的程序入口实现方式,如windos平台有main.h和main.cpp,android平台有入口的Activity,iso平台有main.m,但对于各平台的入口差异在cocos2d-x中做了完美的一致化处理,暂且不管是如何进行的,我们只需要基于一致的引擎入口进行开发就好了,对于cocos2d-x引擎的入口我们定义为AppDelegate.h和AppDelegate.cpp看这里面的方法有三个,这几个方法会在各平台应用程序状态改变时候自动回调。而状态的改变在不同平台是有差异的,cocos2d-x定义cocos2d::CCApplication类统一了各平台的差异,在cocos2d-x中只有1个窗口在运行(符合移动平台,但pc平台原本不是这样)窗口在分配空间,加载完成,被覆盖,被恢复时候会自动回调CCApplication中的函数,因此CCApplication在不同的平台,有不同的实现cpp。

#ifndef  _APP_DELEGATE_H_
#define  _APP_DELEGATE_H_
#include "cocos2d.h"
class  AppDelegate : private cocos2d::CCApplication
{
public:
      AppDelegate();
      virtual ~AppDelegate();

virtual bool applicationDidFinishLaunching(); //窗口启动完成
      virtual void applicationDidEnterBackground(); //窗口进入后台
      virtual void applicationWillEnterForeground();//窗口恢复
};
#endif // _APP_DELEGATE_H_

在这几个方法中,就可以做我们要做的事情了。

applicationDidFinishLaunching启动完成
     加载游戏,播放音乐

applicationDidEnterBackground进入背景
     音乐暂停,游戏暂停

applicationWillEnterForeground恢复窗口
   音乐继续,游戏继续

bool AppDelegate::applicationDidFinishLaunching() {
     CCDirector *pDirector = CCDirector::sharedDirector();   //初始化导演,他是引擎的老大

pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());//绑定opengles窗口,可见,我们可以自定义openGLView

TargetPlatform target = getTargetPlatform();            //获取当前平台,这个功能不错

if (target == kTargetIpad)//判断当前平台是不是ipad
    {
        CCFileUtils::sharedFileUtils()->setResourceDirectory("iphonehd"); //不同平台可以指定不同资源目录
        CCEGLView::sharedOpenGLView()->setDesignResolutionSize(960, 640, kResolutionNoBorder);
    }
    else if (target == kTargetIphone)
    {
        if (true == CCDirector::sharedDirector()->enableRetinaDisplay(true)) //大图资源适配
        {
            CCFileUtils::sharedFileUtils()->setResourceDirectory("iphonehd");
        }
        else 
        {
            CCFileUtils::sharedFileUtils()->setResourceDirectory("iphone");
        }
    }
    else 
    {
        // android, windows, blackberry, linux or mac
        CCFileUtils::sharedFileUtils()->setResourceDirectory("iphonehd");
        CCEGLView::sharedOpenGLView()->setDesignResolutionSize(960, 640, kResolutionNoBorder);
    }
//如果不进行设置,默认值是1
    pDirector->setDisplayStats(true);//是否显示FPS ( 每秒绘制多少帧,最高60)

// set FPS. the default value is 1.0/60 if you don't call this
    pDirector->setAnimationInterval(1.0 / 60);  //设置FPS 在cocos2d-x 启动后内部封装了FPS的逻辑,虽然helloWorld图片没变化,但其实一直在重绘。

// 创建一个场景
    CCScene *pScene = HelloWorld::scene();

// 显示这个场景到窗口,必然所有的绘制在场景中定义的
    pDirector->runWithScene(pScene);

return true;
}

///

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::CCLayer
{
public:
    virtual bool init();

static cocos2d::CCScene* scene();
    void menuCloseCallback(CCObject* pSender);

void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
    CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

/
HelloWorld实际上是一个图层CCLayer,不过CCScene和CCLayer都继承CCNode,所以所有显示在窗口的东西都是CCNode,CCNode通过二阶段构造来初始,所以都有init方法,我们只要记住,在这里完成初始定义图层的资源。

bool HelloWorld::init()
{
    //
    if ( !CCLayer::init() )    {
        return false;
    }
    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); //获取窗口大小
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();    //获取窗口方向

/
    //添加一个图片菜单层(所有Node都可以addChild)
    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)); //将菜单定位到窗口右下角 (0,0点在哪?,猜下)

// 创建菜单

CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition(CCPointZero);
    this->addChild(pMenu, 1);

/下面3行添加HelloWorld文字 在窗口找到了没
    CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);

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

this->addChild(pLabel, 1);

//下面3行添加整个图片
    CCSprite* pSprite = CCSprite::create("HelloWorld.png");

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

this->addChild(pSprite, 0);
    
    // 有了这句该图层会接收事件回调ccTouchesBegan,如果想捕获抬起事件,如何做?
    this->setTouchEnabled(true);
    
    return true;
}

/按下Menu回调

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    CCDirector::sharedDirector()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

/在Layer按下将回调

void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
    CCTouch* touch = (CCTouch*)(* pTouches->begin());
    CCPoint pos = touch->getLocation();
    
    CCLog("touch, x = %f, y = %f", pos.x, pos.y);
}

最后这个 Layer如何显示到屏幕的呢?

// 创建一个场景
    CCScene *pScene = HelloWorld::scene();

// 显示这个场景到窗口,必然所有的绘制在场景中定义的
    pDirector->runWithScene(pScene);

CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();  //貌似和1.x版本有所不同,注意了。
     // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

// add layer as a child to scene
    scene->addChild(layer);

// return the scene
    return scene;
}
在scene方法中创建了一个CCScene对象并把HelloWorldLayer 添加到场景了。

好了今天就到这里了

cocos2d-x 学习笔记(1)关于cocos2d-x(环境配置,项目结构,文件说明)相关推荐

  1. AutoGLuon学习笔记(一):环境配置与API初识

    AutoGLuon学习笔记(一):环境配置与API初识 环境配置 CUDA安装 Autogluon安装 图片分类 数据集导入和处理 拟合模型 预测新图片 测试集准确率 保存模型 超参数优化 模型范围设 ...

  2. 张高兴的 Xamarin.Android 学习笔记:(一)环境配置

    最近在自学 Xamarin 和 Android ,同时发现国内在做 Xamarin 的不多.我在自学中间遇到了很多问题,而且百度到的很多教程也有些过时,现在打算写点东西稍微总结下,顺便帮后人指指路了. ...

  3. Hadoop学习笔记—1.基本介绍与环境配置

    一.Hadoop的发展历史 说到Hadoop的起源,不得不说到一个传奇的IT公司-全球IT技术的引领者Google.Google(自称)为云计算概念的提出者,在自身多年的搜索引擎业务中构建了突破性的G ...

  4. Android学习笔记06---电话拨号器的制作:项目结构深化

    13.电话拨号器的制作:    a.窗口上有显示文字的Textview控件    b.用于显示文本输入框的    c.和button控件 ------------------------------- ...

  5. STM32 FSMC学习笔记+补充(LCD的FSMC配置)

    STM32 FSMC学习笔记+补充(LCD的FSMC配置) STM32 FSMC学习笔记 STM32 FSMC的用法--LCD 转载于:https://www.cnblogs.com/LittleTi ...

  6. Fuzz学习笔记(一)—— WinAFL环境搭建与基本使用

    WinAFL学习笔记(一)-- WinAFL环境搭建 环境配置 安装步骤 1)安装git 2)安装CMake 3)编译dynamorio 编译32位 编译64位 4)编译winafl 编译32位 编译 ...

  7. linux ftp日志_linux学习笔记(一)——Linux分区和目录结构

    linux学习笔记(一)--Linux分区和目录结构 安装Linux时,手动挂载分区的情况下,/ 和 swap 是必须要挂载的,其他/home./boot 等可以根据需要自行挂载. 一般来说,简单的话 ...

  8. OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作

    OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作 一.Write_XML_and_YAML_File(写入XML) #include <opencv2/opencv ...

  9. VSTO学习笔记(四)从SharePoint 2010中下载文件

    原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...

  10. RN学习笔记02:利用WebStorm创建RN项目

    RN学习笔记02:利用WebStorm创建RN项目 在RN学习笔记01里,安装了node.js与react-native-cli,而且配置了环境变量. 在命令行环境,利用react-native in ...

最新文章

  1. 设计模式之间可以相互功能替换吗?
  2. 设备管理器中的计算机有什么用,为什么计算机设备管理器中有两个图形卡?
  3. cup first world_LOONCUP – The world's first SMART menstrual cup.
  4. 如何清理mac系统垃圾
  5. android布局下划线设置,我可以在Android布局中为文本加下划线吗?
  6. 小白学习 指针,指针变量,指针变量大小
  7. 软考试题中经常混淆的概念
  8. 全网多种方法解决未连接到互联网 代理服务器出现问题,或者地址有误的错误
  9. Android wifi PNO扫描流程(Andriod O)
  10. m1芯片Mac如何玩ios手游
  11. iOS 逆向编程(三)实操越狱详细流程
  12. 农村商业银行服务器未收到证书,不及时更新“证书” 当心网银U盾失效
  13. jssip answer()问题
  14. 数据结构课程设计---赛事统计,校园导航,算术表达式
  15. laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端
  16. 华为手机连接Wi-Fi提示 “网络拒绝接入”
  17. 我表弟高中毕业就想自学Java找工作靠谱吗?
  18. html中文件丢失了怎么找回,如何恢复丢失的Word文档?
  19. WPF Binding(四种模式)
  20. Selenium基础之关闭页面和浏览器

热门文章

  1. 列表含有子列表展开成一个列表
  2. [机缘参悟-73]:深度思考:心智提升的七个阶段
  3. 专利进阶(二):专利撰写常用技术及算法汇总(持续更新中)
  4. Oracle Distilled网站下的TimesTen相关帖子
  5. 钢筋符号!每天学一点,进步惊人!收藏不会错!
  6. Android 使用系统下载管理器DownloadManager下载文件
  7. mysql 全局权限_mysql的大局权限GLOBAL PRIVILEGES
  8. 阿里云esc服务器真垃圾啊
  9. Logstash:如何逐步构建自定义 grok 模式
  10. 魔兽世界怀旧服务器无限刷怪点,魔兽世界怀旧服:50级物理刷怪升级攻略!无干扰每小时4万经验!...