首页 > 其他分享 >cocos2d学习笔录1

cocos2d学习笔录1

时间:2023-06-11 12:34:44浏览次数:41  
标签:str create 笔录 HelloWorld 学习 myNode void cocos2d 节点

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());
}

标签:str,create,笔录,HelloWorld,学习,myNode,void,cocos2d,节点
From: https://blog.51cto.com/dingxiaowei/6457412

相关文章

  • 小灰灰深度学习day8——线性回归(从零开始实现与简洁的实现)
    从零开始实现的代码如下:importmathimportrandom#随机梯度下降随机的权重importtimeimportnumpyasnpfromd2limporttorchasd2l#实现过的函数写在d2l包中'''加这两句是为了能画出散点图,不然会报错importosos.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"'......
  • Day02学习日志
    Day02学习日志写注释的几种方法单行注释//多行注释/**/文档注释/***/标识符和关键字注意大小写注意命名规则记住关键字数据类型基本数据类型整数类型byte:1个字节-128—127short:2个字节-32768—32767int:4个字节-2147483......
  • 5.28学习总结thread多线程理解
    多线程早在大二刚来的时候就听王建民老师提到过,但是当时觉得多线程肯定很难,而且现在也用不到,就没有接触。现在看来多线程的学习还是比较简单的。下面演示代码均为PythonfromthreadingimportThreadth=thread(target=,args=())#target指向新线程执行的目标函数,args中......
  • Spring Cloud Netflix Eureka学习
    SpringCloudNetflixEureka传统的服务治理通讯协议XML-RPC->XML方法描述、方法参数->WSDL(WebServices定义语言)WebServices->SOAP(HTTP、SMTP)->文本协议(头部分、体部分)REST->通常是JSON/XML(Schema:类型、结构)->文本协议(HTTPHeader、Body)W3CSchema:xsd:string原......
  • 线性空间学习笔记(部分)
    因为线性空间的知识点多而杂,无法一一记录,因此只取一些学习中遇到困难的地方做笔记。列向量与行向量只要不特殊提及,在线性代数中研究的向量都是列向量。显然,一个列向量左乘行向量的结果是一个标量。而一个列向量左乘一个矩阵,可以看作左乘一行列向量。即:\[A\mathbfx=A\begin{b......
  • Matlab用深度学习循环神经网络RNN长短期记忆LSTM进行波形时间序列数据预测|附代码数据
    全文链接:http://tecdat.cn/?p=27279最近我们被客户要求撰写关于深度学习循环神经网络RNN的研究报告,包括一些图形和统计输出。此示例说明如何使用长短期记忆(LSTM)网络预测时间序列LSTM神经网络架构和原理及其在Python中的预测应用LSTM网络是一种循环神经网络(RNN),它通过循......
  • JavaScript学习笔记:Web安全模型
    为了保证安全,浏览器中的JavaScript不能读写设备中的文件,也不能访问任意的服务器。同源策略同源策略指的是脚本只能访问与包含它的文档同源资源。源是指文档URL中的协议、主机与端口部分,完全相同则是同源,任意一项不同都不是同源。脚本文件的URL与同源策略毫不相干,同源策略至于......
  • 模拟终端学习
    xtermxterm,一个模拟出来的终端,解决的是真实机器的输入和输出模拟问题。xterm本质上是应用程序,是个软件,它不同于硬件的输入-键盘、输出-显示器。他是怎么做到模拟的?这个问题到底难在哪?可以通过一个具体的case来体会。假设有一个进程A,作为进程B,进程B怎么向进程A的标准输入一串字......
  • 编程学习感觉困难怎么办?
    当你感觉编程学习困难时,以下是一些可以帮助你的建议:保持积极心态:编程是一项复杂的技能,学习过程中可能会遇到挑战。重要的是保持积极的心态,相信自己能够克服困难并取得进步。分解问题:有时候一个看似复杂的编程问题可以被分解为更小、更容易解决的子问题。尝试将问题分解......
  • JavaScript学习笔记:客户端编程之异常处理
    未被捕获的异常在程序中,往往会出现异常。虽然主动捕获这些异常是保证程序健壮的必要做法,但是难免会漏掉一些。对于未被捕获的异常,浏览器会在控制台显示一条错误信息,该信息包含异常信息和其在代码中出现的位置。window.onerrorWindow对象有一个onerror属性,将其指定为一个函数,可......