Cocos2dx中零散知识点
cocos2dx中有三种定时器:schedule,scheduleUpdate,scheduleOnce。功能分别是 每隔几秒调用自定义函数、调用系统默认的update()函数、只调用一次自定义函数
1、scheduleUpdate
加入当前节点后,程序会每帧都会自动执行一次默认的Update函数。(注:一定是Update函数哦,若想调用其他自己命名的函数则使用schedule)
看例子,走起。
首先在HelloWord类的头文件中声明Update函数:
void Update(float dt); //注意参数类型
然后在HelloWorld类源文件中实现函数Update:
voidHelloWorld::Update(float dt)
{
CCLOG("baibai");
}
现在我们可以调用了,在需要他不断执行的地方加入调用的代码就ok:
this->scheduleUpdate(); //this是当前节点,如layer,所以可以省略啦。
运行之后你将会看到不断有baibai被打印出来
停止方法:
this->unscheduleUpdate();
2、schedule
功能:每隔几秒执行一次函数
首先还是在HelloWorld中声明所要执行的函数:
void Move(float dt);
然后在源文件实现:
void HelloWorld::Move(floatdt)
{
CCLOG("baibai");
}
现在去执行他,注意参数哦
this->schedule(schedule_selector(HelloWorld::Move),1.0f); //每隔1.0f执行一次,省略参数则表示每帧都要执行
运行之后,baibai每隔1.0f才会被打印一次。
停止方法:
this->unschedule(schedule_selector(HelloWorld::Move));
3、scheduleOnce
功能:在几秒之后执行,并且只会执行一次。
我们就执行上面所写的Move函数吧。
this->scheduleOnce(schedule_selector(HelloWorld::Move),1.0f); //在1.0f之后执行,并且只执行一次。
运行一下,baibai只是被打印了一次就完了。。。
ok,定时器的调用已经讲完了,大家不妨自己写一些函数体验一下。
4、停止所有计时器
this->unscheduleAllSelectors()
CCNode类的setPosition,getPosition函数如果是一个Node的Child则获取的坐标就是该Node的本地坐标
另一个关键问题就是在cocos2d-x里就是各种对象的大小问题。因为在cocos2d-x里CCNode对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候必须根据情况明确指定获取对象原始大小,还是缩放后的大小。当然cocos2d-x里提供了对应函数来完成这些操作:
getContentSize函数来获得节点原始的大小。只是逻辑尺寸,不是像素
boundingBox函数来获得经过缩放和旋转之后的外框盒大小。
getContentSizeInPixels获得的是像素点大小
像素点和逻辑点关系:逻辑点大小 = 像素大小
getVisibleSize:默示获得视口(可视区域)的大小,若是DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize便是getWinSize。
getVisibleOrigin:默示可视区域的出发点坐标,这在处理惩罚相对地位的时辰很是有效,确保节点在不合辨别率下的地位一致。
坐标转换:
GL坐标系,cocos2d-x默认坐标系:
CCPoint CCDirector::convertToGL(const CCPoint& uiPoint)
{
CCSize s = m_obWinSizeInPoints;
float newY = s.height - uiPoint.y;
}
屏幕坐标系: 默认原点在左上角
CCPoint CCDirector::convertToUI(const CCPoint& glPoint)
{
CCSize winSize = m_obWinSizeInPoints;
float oppositeY = winSize.height - glPoint.y;
return ccp(glPoint.x,oppositeY);
}
两种坐标的X方向没有变,只变了Y方向,cocos2d-x里默认的GL坐标系,即左下角为原点ccp(0.0f,0.0f)
// 创建精灵的五种方法
//方法一:直接创建精灵
//适合于要显示的是这张图片的全部区域,
CCSprite * sprite = CCSprite::create("Icon.png");
//上面那句话也可以根据需要这样来写:
//CCString* fileName = CCString::createWithFormat("Icon_%d.jpg", flag);
//CCSprite* sprite = CCSprite::create(fileName->getCString());
sprite->setPosition(ccp(100, 100));
this->addChild(sprite);
// 方法二:参数 图片名称 矩形区域
//适合于需要显示此图片的部分区域
CCSprite * sprite = CCSprite::create("Icon.png",CCRectMake(0, 0, 30, 30));
sprite->setPosition(ccp(100, 100));
this->addChild(sprite);
//方法三: 利用帧缓存中的一帧的名称声称一个对象
// 适合于plist打包好的文件
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("test_icon.plist");
CCSprite * sprite = CCSprite::createWithSpriteFrameName("Icon.png");
sprite->setPosition(ccp(100, 100));
this->addChild(sprite);
//方法四: 利用另外一帧生成一个精灵对象
//适合于做帧动画使用
CCSpriteFrame * frame = CCSpriteFrame::create("Icon.png", CCRectMake(0, 0, 40, 30));
CCSprite * sprite = CCSprite::createWithSpriteFrame(frame);
sprite->setPosition(ccp(310, 150));
addChild(sprite);
//方法五:利用纹理,
//适合于需要频繁使用的图片
CCSpriteBatchNode* spriteTexture = CCSpriteBatchNode::create("iocn.png");
spriteTexture->setPosition(CCPointZero);
addChild(spriteTexture);
CCSprite* sprite = CCSprite::createWithTexture(spriteTexture->getTexture());
sprite->setPosition(ccp(visiblesize.width/2, 100));
spriteTexture->addChild(sprite, 2);
常用的封装方法
//返回场景
static CCScene* scene(CCLayer*layer)
{
CCScene *scene=CCScene::create();
scene->addChild(layer);
//scene->autorelease();
return scene;
}
//移动点
static void moveNode(CCNode *node,CCPoint point)
{
node->setPosition(node->getPosition()+point);
}
//格式化,串接字符串
static char* format(int v, const char* prefix = "", const char* suffix = "")
{
static char buf[2048];
sprintf(buf, "%s%d%s", prefix, v, suffix);
return buf;
}
//创建动画
static CCAnimation* CreateAnimation(const char* filename,int start,int end,int width,float delay)
{
CCTexture2D *texture=CCTextureCache::sharedTextureCache()->addImage(filename);
CCArray *array=CCArray::create();
for (int i=start;i<end;i++)
{
CCSpriteFrame *frame=CCSpriteFrame::createWithTexture(texture,CCRectMake(i*width,0,width,texture->getContentSize().height));
array->addObject(frame);
}
return CCAnimation::createWithSpriteFrames(array,delay);
}
//创建帧
static CCSpriteFrame* getSpriteFrame(const char* filename, int pos, int width)
{
CCTexture2D* texture = CCTextureCache::sharedTextureCache()->addImage(filename);
CCSpriteFrame* frame = CCSpriteFrame::createWithTexture(texture, CCRectMake(pos*width, 0, width, texture->getContentSize().height));
return frame;
}
//地图坐标转格子地图
static CCPoint Point2Tile(CCTMXTiledMap* map, CCPoint ptInMap)
{
int dx = map->getTileSize().width;
int dy = map->getTileSize().height;
int x = ptInMap.x / dx;
int y = ptInMap.y / dy;
y = map->getMapSize().height - 1 - y;
return ccp(x, y);
}
//格子地图坐标转地图坐标
static CCPoint Tile2PointLB(CCTMXTiledMap* map, CCPoint ptTile)
{
ptTile.y = map->getMapSize().height - 1 - ptTile.y;
return ccp(ptTile.x * map->getTileSize().width,
ptTile.y * map->getTileSize().height);
}
Cocos2dx中零散知识点的更多相关文章
- Python学习 过程中零散知识点的总结
自学资料比较零碎,本文是对在Python学习过程中积累的零零散散的知识点的总结 ============================================================ ...
- ACM个人零散知识点整理
ACM个人零散知识点整理 杂项: 1.输入输出外挂 //读入优化 int 整数 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch& ...
- Android 零散知识点整理
Android 零散知识点整理 为什么Android的更新试图操作必须在主线程中进行? 这是因为Android系统中的视图组件并不是线程安全的.通常应该让主线程负责创建.显示和更新UI,启动子线程,停 ...
- Android零散知识点积累
本文仅在记录android开发中遇到的零散知识点,会不断更新... 目录 .隐藏系统标题栏 .图片尺寸及屏幕密度 3.获取顶部状态栏高度 1.隐藏系统标题栏 1)在资源文件styles.xml中定义样 ...
- Cocos2dx中线程优先级
Cocos2dx中线程优先级问题 不论是ios还是android,遇到耗时的任务都要另起线程处理,否则程序不能及时用户的反馈.游戏中如果一圈循环不能在1/frameRate(帧率是30则1/30)秒内 ...
- 【Cocos2d-x游戏开发】Cocos2d-x中的弱联网技术
在上一篇博客中,我们一起学习了如何在Cocos2d-x中存储数据和读取信息,本篇博客我们将一起讨论和数据存储同样重要的联网技术. 一.弱联网技术介绍 在网络游戏中许多重要的功能都需要网络连接,而根据需 ...
- 【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术
一.引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得 ...
- cocos2dx 中使用的一些C++ 11 特性
0. placeholder 头文件:<functional> namespace: placeholder placeholder 就是一堆帮助bind占参数位置的东西,名字分别为 _ ...
- cocos2dx中CC_CALLBACK_1等宏中this指针实际指向
首先看代码,我在Helloworld中添加两个函数. void HelloWorld::addTarget(){ Size visibleSize = Director::getInstance()- ...
随机推荐
- React Native 开发之 (02) 用Sublime 3作为React Native的开发IDE
Sublime Text是一个代码编辑器.也是HTML和散文先进的文本编辑器.漂亮的用户界面和非凡的功能,例如:迷你地图,多选择Python插件,代码段等等.完全可自定义键绑定,菜单和工具栏等等.漂亮 ...
- vs------安装window net.framework 出现严重错误解决方法
打开system32和SysWOW64修改里面共六个msvcr100_clr0400.dll文件的名字除了带120的文件不用修改 需要修改管理员权限: 步骤:属性->安全->编辑-> ...
- 初学structs2,结果类型简单示例
一.自定义结果处理类,structs.xml中package节点下加result-types节点,在result-types节点下配置result-type的属性.然后在配置的action中的resu ...
- 线性判别分析(LDA)准则:FIsher准则、感知机准则、最小二乘(最小均方误差)准则
准则 采用一种分类形式后,就要采用准则来衡量分类的效果,最好的结果一般出现在准则函数的极值点上,因此将分类器的设计问题转化为求准则函数极值问题,即求准则函数的参数,如线性分类器中的权值向量. 分类器设 ...
- 网友微笑分享原创Jquery实现瀑布流特效
首先非常感谢网友微笑的无私分享,此Jquery特效是一款非常流行和实用的瀑布流布局,核心代码只有几十行,是我见过代码量最少的瀑布流布局,非常适合网友们学习哦,希望大家好好看一下这个Jquery特效的原 ...
- CSS创建一个遮罩层
.layer{ width: 100%; position: absolute; left:; right:; top:; bottom:; -moz-opacity:; filter: alpha( ...
- BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler错误的解决方法
出现这个问题是因为我的spring3.0里的包是单独引用的,缺少了别的包 譬如Configuration problem: Unable to locate Spring NamespaceHandl ...
- 在命令行中运行eclipse中创建的java项目
在命令行中运行eclipse中创建的java项目 博客分类: java相关 javaeclipse命令行 由于项目要求,需要对eclipse中的项目进行打包,似的可以在客户机上不装eclipse的情 ...
- Serenity框架官方文档翻译前言(什么是Serenity平台)
什么是Serenity平台 Serenity是一个 ASP.NET MVC / Javascript 的已经建立在开源技术上的平台 它的目标是让开发变得更容易,同时降低维护成本,避免样板式代码,减少重 ...
- dedecms升级后报错
DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value to include C,G and P (recomm ...