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()- ...
随机推荐
- hihoCoder 1195 高斯消元.一
传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:喂不得了啦,那边便利店的薯片半价了! 小Hi:啥?! 小Ho:那边的便利店在打折促销啊. 小Hi:走走走, ...
- poj1787Charlie's Change(多重背包+记录路径+好题)
Charlie's Change Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3720 Accepted: 1125 ...
- tableView左滑删除功能
实现三个代理方法即可 -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtI ...
- java中不带package和带package的编译运行方式
Java中不带package的程序和带package的程序编译的方式是不同的. 一.不带package的程序建立个HelloWorld.java的文件,放入C:\,内容如下:public class ...
- Enterprise Library系列文章目录(转载)
1. Microsoft Enterprise Library 5.0 系列(一) Caching Application Block (初级) 2. Microsoft Enterprise Lib ...
- C# 获取时间差(几天前,几小时前,几分钟前,几秒前)
#region 获取时间差string GetTime(BsonString getTime) /// <summary> /// 获取时间差 /// </summary> / ...
- PHP中array_chunk的用法
转自:http://cn2.php.net/manual/zh/function.array-chunk.php (PHP 4 >= 4.2.0, PHP 5) array_chunk — 将一 ...
- logback 常用配置详解(二)
<appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的组件. <appende ...
- MVC中的_viewstart.cshtml(没有设置Layout却引用了布局)
今天Home视图中新增了一个视图,因为不需要设置Layout就没与管他,但是运行起来一看,自动引用了布局,分析了半天 也没看出是哪的错误? 后来尝试着在area中增加了一个同样的视图就没有问题,比较这 ...
- linux 客户端 Socket 非阻塞connect编程
开发测试环境:虚拟机CentOS,windows网络调试助手 非阻塞模式有3种用途 1.三次握手同时做其他的处理.connect要花一个往返时间完成,从几毫秒的局域网到几百 ...