Cocos2dx个人笔记之HelloworldScene
来源:互联网 发布:云盘推荐 知乎 编辑:程序博客网 时间:2024/05/20 03:06
初学cocos2dx的时候都躲不过这个所谓的HelloworldScene,那么我这里就浅谈一下这个cpp文件中到底做了什么。
先看头文件(注释解释得很清楚了)
#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"//注意HelloWorld公有继承自Layer,是个布景层,千万别理所当然地以为是场景class HelloWorld : public cocos2d::Layer{ //c++没有id类型,返回一个场景对象,这里是创建场景的静态方法 static cocos2d::Scene* createScene(); //注意返回值是bool,用于初始化布景层的虚函数(为了继承这里用虚函数)(cocos2d-iphone中init返回的是id) virtual bool init(); //关闭按钮的回调函数 void menuCloseCallback(cocos2d::Ref* pSender); //引擎宏定义:手动实现静态方法create();并且调用init()方法 CREATE_FUNC(HelloWorld);};#endif这里有个宏定义CREATE_FUNC(__TYPE__)
跳进去源码看看它到底干了什么
static __TYPE__* create(){ __TYPE__ *pRet = new __TYPE__(); if (pRet && pRet->init()) { pRet->autorelease(); return pRet; } else { delete pRet; pRet = NULL; return NULL; }}宏里面new了一个这个层的对象,如果对象new成功且调用init()方法返回真时,将对象放入自动释放池中(所以此对象的内存你以后都不需要关心了),然后把对象返回。
如果对象new失败或者init()失败就删除对象(其实是个指针),然后将指针置空(防止你操作野指针),然后返回空。
然后我们来看实现文件
#include "HelloWorldScene.h"//等价于using namespace cocos2d;引入命名空间USING_NS_CC;Scene* HelloWorld::createScene(){ //场景scene是一个自动释放的对象(自己跳到create中看源码,跟前面说过个宏类似操作) auto scene = Scene::create(); //布景层layer也是一个自动释放的对象 auto layer = HelloWorld::create(); //把layer加到scene中 scene->addChild(layer); //返回scene return scene;}//初始化方法init用于初始化布景层实例bool HelloWorld::init(){ // 1.新手常忘的操作,一定要先初始化父类cocos2d::Layer啊!! if ( !Layer::init() ) { return false; } //getVisibleSize:获得可视区域的大小,如果DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize与getWinSize一样,此处不深究。 Size visibleSize = Director::getInstance()->getVisibleSize(); //getVisibleOrigin:获得可视区域的原点坐标的实际坐标,在处理相对位置时,确保节点在不同分辨率下的位置一致,此处不深究。 Vec2 origin = Director::getInstance()->getVisibleOrigin(); //这是个MenuItem,这里理解为一个按钮,创建需要参数有常态图片资源、选中图片资源,点击之后要回调的方法.CC_CALLBACK_1回调会自动传入一个参数,相关内容自行查资料吧 auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); //设置按钮位置closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 , origin.y + closeItem->getContentSize().height/2)); //创建一个menu,这里理解为存放按钮的容器,MenuItem必须放入Menu才能响应回调方法 auto menu = Menu::create(closeItem, NULL); //设置menu位置在Vec2(0,0),原点左下角 menu->setPosition(Vec2::ZERO); //将menu加入到this中,此时this是一个layer,第二个参数是优先级 this->addChild(menu, 1); // 创建标签Label用于显示文本 auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24); label->setPosition(Vec2(origin.x + visibleSize.width/2, origin.y + visibleSize.height - label->getContentSize().height)); this->addChild(label, 1); //创建精灵Sprite显示图片 auto sprite = Sprite::create("HelloWorld.png"); sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); this->addChild(sprite, 0); return true;}//刚刚创建的menuItem按钮的回调方法,发现传入一个参数,就是CC_CALLBACK_1帮你传的void HelloWorld::menuCloseCallback(Ref* pSender){ //目标平台判断#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) //消息框MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert"); return;#endif //获取单例实例导演执行清除导演类 Director::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) //正常运行程序并退出程序 exit(0);#endif}
补充:
【Vec2】二维向量Vec2是以前的Point,它既可以表示一个二维坐标点,又可以表示一个二维向量。
同时Vec2对运算符进行了重载,可以很方便的完成Vec2的赋值、加减乘除等操作。另外还有与坐标向量相关的:距离、角度、点积、叉积、投影、标准化等操作。
此外在3.x中,还将2.x里的函数定义ccp***(如ccp,ccpAdd,ccpSub)相关的操作都封装到了这个Vec2的类中,这样就可以更加系统化地管理向量的运算操作了。
此外,除了Vec2。还有两个坐标类:Vec3、Vec4,分别代表了三维、四维坐标向量。
【Size】 Size只是一个用来表示尺寸大小的类。宽为width,高为height。
和Vec2一样,也对运算符进行了重载。Size和Vec2之间可以相互转换。
0 0
- Cocos2dx个人笔记之HelloworldScene
- Cocos2dx个人笔记之坐标系
- Cocos2dx个人笔记之屏幕适配
- 解释cocos2dx的HelloWorldScene的类
- cocos2dx - Chipmunk 物理引擎 -个人笔记
- 个人笔记之this
- 个人笔记之super
- 个人笔记之堆栈
- 个人笔记之style
- 解析HelloWorldScene
- HelloWorldScene解析
- 个人笔记之构造方法
- java个人笔记之线程
- Cocos2dx学习之---使用Sqlite3的笔记
- CoCos2Dx学习笔记之环境配置
- cocos2dx 3.3 之学习笔记(一)
- cocos2dx 学习笔记 之 lua -1
- cocos2dx笔记之单例模式
- PEP8 Python 编码规范整理
- dwr的异常处理
- 最短路径—Dijkstra算法和Floyd算法 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
- 单用户模式修改密码
- 判断某字符串中是否有某个元素
- Cocos2dx个人笔记之HelloworldScene
- 明明的随机数
- 模板方法模式
- 如何创建守护进程
- OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]
- maven安装
- 环信iOS 简单集成3.0实时通话
- Linux 运行级别
- 创建型模式5之1-FactoryMethod工厂方法模式例子理解