cocos2d学习笔录1

简介:

CCDirector的主要作用:

1.访问和改变场景;
2.访问cocos2d-x的配置细节
3.访问视图(OPENGL,UIVIEW,UIWINDOW);
4.暂停,恢复和结束游戏;
5.在UIKit和OpenGL之间切换坐标

CCNode 常用API:

1.生成一个新的节点:
CCNode*childNoe = CCNode::create();
2.将新节点添加为子节点
myNode>addChile(childNode,0,123); //0是层级,123是tag属性
3.获取子节点:
CCNode *retrevedNode = myNode->getChildByTag(123);
4.通过tag删除子节点,cleanup会停止任何运行中的动作:
myNode->removeChildByTag(123,true);
5.通过节点指针删除节点:
myNode->removeChild(retrievedNode);
6.删除一个节点的所有子节点:
myNode->removeAllChildenWithCleanup(true);
7.从myNode的父节点删除myNode:
myNode->removeFromParentAndCleanup(true);

使用动作:
1.一下是一个动作的申明:
CCAction *action = CCBlind::create(10,20);
action->setTag(234);
2.运行这个动作会让节点闪烁:
myNode->runAction(action);
3.如果你想再以后使用此动作,你可以用tag获取:
CCAction*retrievedAction = myNode->getActionByTag(234);
4.你可以用tag停止相关连的动作:
myNode->stopActionByTag(234);
5.或者你也可以用动作指针停止动作:
myNode->stopAction(action);
6.你可以停止所有在此节点上运行的动作:
myNode->stopAllActions();

如果你想运行不同的方法,或者是每秒调用10次更新的方法的话,你应该使用一下代码:
void HelloScene::init()
{
     this->schedule(schedule_selector(HelloWorld::updataTen),0.1f);
}

void HelloScene::updateTen()
{
     //此方法将根据时间间隔来调用,每隔10秒
}
如果时间间隔(interval)为0的话,你应该使用scheduleUpdate方法。不过,如果你想之后停止对某个指定更新的方法的预定信息的话,上述代码更加合适。因为scheduleUpdate方法没有停止预定信息的功能。
停止预定信息
unschedule
OC中可以用一个隐式指针:_cmd
//用_cmd关键词停止当前方法的预定
[self unschedule:_cmd];
局限于OC

//随机数的产生
CCRANDOM_0_1 随机生成0-1之间的随机数
//优先级设置
this->scheduleUpdateWithPriority(0);
这里的优先级顺序是从低到高


CCScene是场景视图的第一个节点。通常CCScene的子节点都是继承自CCLayer。
问题:如果两个界面都是100M,那么瞬间就是200M太大了,怎么解决?
方法:可以加载一个loading界面来过渡!
CCTransitionFade*fade = CCTransitionFade::transitionWithDuration(1.f,Scene2::scen(),ccBLACK);  //最后一个参数是默认参数,可以不写,他默认ccBlack
//CCDirector::sharedDirector()->pushScene(fade);
//CCDirector::sharedDirector()->repleaseScene(fade);
push方法不会调用原来场景的析构方法,而replease方法会调用原来场景的内存,会调用析构函数。
问题:哪种情况用push来切换场景,哪种情况用replease来切换场景?
方法:如果是暂停来切换暂停场景,那么用pushScene,原来的游戏场景不需要释放,如果是游戏场景的切换,一般用repleaseScene方法来切换。
push一个场景必须pop才能释放内存,一般用replease来切换场景

//触摸注册事件//如果没有这个,默认的是多点触摸,Target是单点,Stand是多点触摸

void HelloWorld::registerWithTouchDispatcher() {     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); //第二个参数是优先级,越低的优先级越高,优先响应,true是触摸吞噬,如果是true的话,那么触摸就被它获取,后面的view不在接受 }


ccTouchBegan返回的是一个BOOL值,如果是true的话,那就意味着你不想让当前的触摸事件传到到其他触摸事件处理器。你实际上是“吞下了”这个触摸事件。


接受加速计事件:

和触摸输入一样,加速计必须在启用以后才能接受加速计事件:
this->setAccelerometerEnabled(true);
同样的,层里面要加入一个特定的方法来接受加速计事件:
void HelloWorld::didAccelerate(CCAcceleration*pAccelerationValue)
{
     CCLOG("pAccelerationValue:X:%f/y:%f/z:%f",pAccelerationValue.x,pAccelerationValue.y,pAccelerationValue.z);
}


注意:

资源文件名的大小写,真机上是区分大小写的,而模拟器是不区分的。


事件间隔动作:
CCMoveTo*move = CCMoveTo::create(3,ccp(100,200));
myNode->runAction(move);

重复动作:
CCRotateBy *rotateBy = CCRotateteBy::create(2,360);
CCRepeatForever*repeat = CCRepeatForever::cease(rotateBy);

舒缓动作:
CCMoveTo *move = CCMoveTo::create(3,cpp(100,200));
//节点慢慢启动,在移动中加速
CCEaseInOut*ease = CCEaseInOut::create(move,4);
myNode->runAction(ease);

cocos2d实现了一下CCEaseAction类:
例如:CCEaseBackIn

动作序列CCSequence
CCSequence *seq = [CCSequence actions:tint1,tint2,nil];
[label runAction:seq];

回调函数:
//CCCallFunc是执行对应的回调函数,其中回调函数不可带参数。一般使用静态成员函数create创建实例
CCCallFunc *callFunc = CCCallFunc::create(this,callfunc_selector(HelloWorld::funC_CallBack));
pLabel->runAction(callFunc);
//带参数的回调CCCallFuncN,其中带一个参数,一般由静态成员create创建实例
CCCallFuncN *callFuncN = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::funcN_CallBack));
pLabel->runAction(callFuncN);

void HelloWorld::funcN_CallBack(void *sender)
{
     CCLabelTTF *label = (CCLabelTTF *)sender;
     label->setStrign("hello");
     CCLog("CallFuncN的回调");
}
//带两个参数的回调
CCString *str = CCString::create("data参数");
str->retain();
CCCallFuncND *callFuncND = CCCallFuncND::create(this,callfuncND_selector(HelloWorld::funcND_CallBack),str); //最后一个参数是void*可以是任意类型
pLabel->runAction(callFuncND);

void HelloWorld::funcN_CallBack(void *sender,void *data)
{
     CCString *str = (CCString *)data;
     CCLabelTTF *label = (CCLabelTTF *)sender;
     label->setString(str->getCString());
}

//CCCallFuncO
CCString *str = CCString::create("object参数");
str->retain();
CCCallFuncO*callFuncO = CCCallFuncO::create(this,callfuncO_selector(HelloWorld::funcO_CallBack),str);
pLabel->runAction(callFuncO);

void HelloWorld::funcO_CallBack(CCObject *object)
{
     CCString * = (CCString *)object;
     CCLog("%s",str->getCString());
}
















本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366397,如需转载请自行联系原作者

相关文章
|
8天前
|
数据采集 人工智能 安全
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
298 164
|
3天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
307 155
|
11天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
846 6
|
5天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
239 113