cocos2d-x 学习笔记(1)关于cocos2d-x(环境配置,项目结构,文件说明)
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(环境配置,项目结构,文件说明)相关推荐
- AutoGLuon学习笔记(一):环境配置与API初识
AutoGLuon学习笔记(一):环境配置与API初识 环境配置 CUDA安装 Autogluon安装 图片分类 数据集导入和处理 拟合模型 预测新图片 测试集准确率 保存模型 超参数优化 模型范围设 ...
- 张高兴的 Xamarin.Android 学习笔记:(一)环境配置
最近在自学 Xamarin 和 Android ,同时发现国内在做 Xamarin 的不多.我在自学中间遇到了很多问题,而且百度到的很多教程也有些过时,现在打算写点东西稍微总结下,顺便帮后人指指路了. ...
- Hadoop学习笔记—1.基本介绍与环境配置
一.Hadoop的发展历史 说到Hadoop的起源,不得不说到一个传奇的IT公司-全球IT技术的引领者Google.Google(自称)为云计算概念的提出者,在自身多年的搜索引擎业务中构建了突破性的G ...
- Android学习笔记06---电话拨号器的制作:项目结构深化
13.电话拨号器的制作: a.窗口上有显示文字的Textview控件 b.用于显示文本输入框的 c.和button控件 ------------------------------- ...
- STM32 FSMC学习笔记+补充(LCD的FSMC配置)
STM32 FSMC学习笔记+补充(LCD的FSMC配置) STM32 FSMC学习笔记 STM32 FSMC的用法--LCD 转载于:https://www.cnblogs.com/LittleTi ...
- Fuzz学习笔记(一)—— WinAFL环境搭建与基本使用
WinAFL学习笔记(一)-- WinAFL环境搭建 环境配置 安装步骤 1)安装git 2)安装CMake 3)编译dynamorio 编译32位 编译64位 4)编译winafl 编译32位 编译 ...
- linux ftp日志_linux学习笔记(一)——Linux分区和目录结构
linux学习笔记(一)--Linux分区和目录结构 安装Linux时,手动挂载分区的情况下,/ 和 swap 是必须要挂载的,其他/home./boot 等可以根据需要自行挂载. 一般来说,简单的话 ...
- OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作
OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作 一.Write_XML_and_YAML_File(写入XML) #include <opencv2/opencv ...
- VSTO学习笔记(四)从SharePoint 2010中下载文件
原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...
- RN学习笔记02:利用WebStorm创建RN项目
RN学习笔记02:利用WebStorm创建RN项目 在RN学习笔记01里,安装了node.js与react-native-cli,而且配置了环境变量. 在命令行环境,利用react-native in ...
最新文章
- 设计模式之间可以相互功能替换吗?
- 设备管理器中的计算机有什么用,为什么计算机设备管理器中有两个图形卡?
- cup first world_LOONCUP – The world's first SMART menstrual cup.
- 如何清理mac系统垃圾
- android布局下划线设置,我可以在Android布局中为文本加下划线吗?
- 小白学习 指针,指针变量,指针变量大小
- 软考试题中经常混淆的概念
- 全网多种方法解决未连接到互联网 代理服务器出现问题,或者地址有误的错误
- Android wifi PNO扫描流程(Andriod O)
- m1芯片Mac如何玩ios手游
- iOS 逆向编程(三)实操越狱详细流程
- 农村商业银行服务器未收到证书,不及时更新“证书” 当心网银U盾失效
- jssip answer()问题
- 数据结构课程设计---赛事统计,校园导航,算术表达式
- laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端
- 华为手机连接Wi-Fi提示 “网络拒绝接入”
- 我表弟高中毕业就想自学Java找工作靠谱吗?
- html中文件丢失了怎么找回,如何恢复丢失的Word文档?
- WPF Binding(四种模式)
- Selenium基础之关闭页面和浏览器
热门文章
- 列表含有子列表展开成一个列表
- [机缘参悟-73]:深度思考:心智提升的七个阶段
- 专利进阶(二):专利撰写常用技术及算法汇总(持续更新中)
- Oracle Distilled网站下的TimesTen相关帖子
- 钢筋符号!每天学一点,进步惊人!收藏不会错!
- Android 使用系统下载管理器DownloadManager下载文件
- mysql 全局权限_mysql的大局权限GLOBAL PRIVILEGES
- 阿里云esc服务器真垃圾啊
- Logstash:如何逐步构建自定义 grok 模式
- 魔兽世界怀旧服务器无限刷怪点,魔兽世界怀旧服:50级物理刷怪升级攻略!无干扰每小时4万经验!...