zoukankan      html  css  js  c++  java
  • 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());
    }

  • 相关阅读:
    codeforces707B:Bakery
    codeforces707A:Brain's Photos
    BZOJ1084 [SCOI2005]最大子矩阵
    BZOJ1264 [AHOI2006]基因匹配Match
    BZOJ2764 [JLOI2011]基因补全
    codevs1257 打砖块
    BZOJ1079 [SCOI2008]着色方案
    BZOJ1026 [SCOI2009]windy数
    菜鸟学自动化测试(一)----selenium IDE
    关于w3school的html5部分output 元素实例代码(点亲自试一试进去)的问题纠正
  • 原文地址:https://www.cnblogs.com/james1207/p/3301715.html
Copyright © 2011-2022 走看看