cocos2dx-3.6 开发技巧(二)回调函数以及动画的使用,触摸事件,android返回键,屏幕截屏

来源:互联网 发布:https seo 编辑:程序博客网 时间:2024/05/16 15:41
1:用cocostudio编辑的timeline动画的结束回调事件:

LayerSprite有不同,layer要设置锚点,必须先:ignoreAnchorPointForPosition(false);

[cpp] view plain copy
  1.     CCLayer* layer1 = CCLayerColor::create(ccc4(255,0,0,255), 300, 200);  
  2.     CCLayer* layer2 = CCLayerColor::create(ccc4(255,255,0,255), 100, 100);  
  3.     addChild(layer1);  
  4.     layer1->addChild(layer2);  
  5. /*  layer1->ignoreAnchorPointForPosition(false);*/  
  6.     layer1->setAnchorPoint(ccp(0.5,0.5));  
 
//加载节点SpriteFrameCache::getInstance()->addSpriteFramesWithFile("UIcsb/logo/logoPlist.plist");rootNode = CSLoader::createNode("UIcsb/logo/MainScene.csb");Size contenteSize = rootNode->getContentSize();Size winSize = Director::getInstance()->getVisibleSize();rootNode->setScale(winSize.width / contenteSize.width); //缩放至全屏this->addChild(rootNode);rootNode->setPosition(0, -(winSize.width / contenteSize.width * 600 - 600) / 4);//加载节点的timeline动画auto rootNodeAction = CSLoader::createTimeline("UIcsb/logo/MainScene.csb");rootNode->runAction(rootNodeAction);rootNodeAction->gotoFrameAndPlay(0, false);//timeline动画结束回调函数rootNodeAction->setLastFrameCallFunc([=](){//JsonUtils::get_date_now();actionComplete = true;});// 通过导出的文件创建节点和动作, 文件路径与文件名一定要相同 m_node = CSLoader::createNode("Scene/win/battle start.csb");m_node->setPosition(-100, 50);addChild(m_node, timelineZOrder);m_action = CSLoader::createTimeline("Scene/win/battle start.csb");// 让节点run动作,并将节点绑定到节点树上 m_node->runAction(m_action);// 接着动作就可以通过play的方法播放动画了。 第一个参数为动画名,第二个为是否循环播放m_action->play("start", false);
//从第一帧开始播放,不循环播放
m_action->gotoFrameAndPlay(0,false);
 m_action->setLastFrameCallFunc([=](){m_action->play("goback", true);});

2:用cocos骨骼动画编辑器编辑的Armature骨骼动画回调事件(或由flash编辑,再经过cocos编辑器进行转换):

//Armature骨骼动画回调事件://骨骼动画baseSprite = Armature::create("logo");baseSprite->setAnchorPoint(Point(0.5f,0.5f));baseSprite->setPosition(Vec2(Director::getInstance()->getVisibleSize().width / 2 , Director::getInstance()->getVisibleSize().height / 2));this->addChild(baseSprite,2);//骨骼动画回调函数baseSprite->getAnimation()->setMovementEventCallFunc(CC_CALLBACK_0(LogoScene::animationEvent, this,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));//播放一次动画baseSprite->getAnimation()->playByIndex(0, -1, 0);//骨骼动画回调函数void animationEvent(Armature *armature, MovementEventType movementType, const string& movementID);void LogoScene::animationEvent(Armature *armature, MovementEventType movementType, const std::string& movementID){if (movementType == START){//CCLOG("baseMonster  %s   START", movementID.c_str());}else if (movementType == COMPLETE){//movementID == "appear"actionComplete = true;}else if (movementType == LOOP_COMPLETE){ }}

3:sequence回调事件

sprite->runAction(DelayTime::create(0.5f),CallFunc::create([](){}),nullptr);

4:cocos2dx精灵触摸事件

头文件如下:

EventListenerTouchOneByOne *listener;void setListener();bool onTouchBegan(Touch *touch, Event *event);void onTouchEnded(Touch* touch, Event* event);
cpp实现文件:

void Victory::setListener(){listener = EventListenerTouchOneByOne::create();listener->onTouchBegan = CC_CALLBACK_2(Victory::onTouchBegan, this);listener->onTouchEnded = CC_CALLBACK_2(Victory::onTouchEnded, this);listener->setSwallowTouches(true);}bool Victory::onTouchBegan(Touch *touch, Event *event){auto target = event->getCurrentTarget();//将世界坐标转换成节点坐标,忽略锚点的影响;结果是以点为单位Point locationInNode = target->convertTouchToNodeSpace(touch);Size size = target->getContentSize();Rect rect = Rect(0, 0, size.width, size.height);if (rect.containsPoint(locationInNode) && target->isVisible() && isTouchEnd){isTouchEnd = false;return true;}return false;}void Victory::initScale(){this->scaleTo1 = ScaleTo::create(ScaleSecond, ButtonXScale, ButtonYScale);//0.1f,0.9f,0.9fthis->scaleTo2 = ScaleTo::create(ScaleSecond, 1.0f, 1.0f);}void Victory::onTouchEnded(Touch* touch, Event* event){auto target = dynamic_cast<Sprite*>(event->getCurrentTarget());if (target == this->sprite_continue){SoundManager::playClickButton();this->initScale();sprite_continue->runAction(Sequence::create(scaleTo1, scaleTo2, CallFunc::create([=](){isTouchEnd = true;//胜利  关卡数+1,进入下一关int level = GameManager::getInstance()->LEVEL + 1;int difficult = GameManager::getInstance()->difficult;Director::getInstance()->replaceScene(GameScene::playGame(level, difficult));}), NULL));}else if (target == this->sprite_return){SoundManager::playClickReturnButton();this->initScale();sprite_return->runAction(Sequence::create(scaleTo1, scaleTo2, CallFunc::create([=](){isTouchEnd = true;clickReturnButton();}), NULL));}}
5:手机返回键监听
//手机返回监听  头文件声明void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event);//使用auto listenerKeyPad = EventListenerKeyboard::create();listenerKeyPad->onKeyReleased = CC_CALLBACK_2(Victory::onKeyReleased, this);_eventDispatcher->addEventListenerWithSceneGraphPriority(listenerKeyPad, this);//回调监听void Victory::onKeyReleased(EventKeyboard::KeyCode keycode, Event* event){switch (keycode){case EventKeyboard::KeyCode::KEY_BACK:clickReturnButton();break;default:break;}}
6:游戏场景暂停
auto visibleSize = Director::getInstance()->getVisibleSize();//把当前屏幕截图,传到另一个场景里RenderTexture* renderTexture = RenderTexture::create(visibleSize.width, visibleSize.height);renderTexture->retain();renderTexture->begin();Director::getInstance()->getRunningScene()->visit();//this->getParent()->visit();renderTexture->end();Director::getInstance()->getRenderer()->render();Director::getInstance()->pushScene(OpComic::createScene(renderTexture));//push和replace根据实际情况来写
要跳转的场景类的实现:

class OpComic : public Layer{public:virtual bool init() override;CREATE_FUNC(OpComic);static Scene *createScene(RenderTexture* sqr);};#endif

cpp实现:

Scene *OpComic::createScene(RenderTexture* sqr){Scene *scene = Scene::create();Sprite *spr = Sprite::createWithTexture(sqr->getSprite()->getTexture());spr->setAnchorPoint(Vec2(0, 0));spr->setPosition(ccp(0, 0));spr->setFlipY(true);spr->setColor(COLOR_GRAY);//Color3B::BLACKscene->addChild(spr);auto layer = OpComic::create();//auto winSize = Director::getInstance()->getWinSize();//Point point; //宽度适配:实际为1280,720  所以超出了80   //高度适配:1366,768//point.x = (winSize.width - AppDelegate::resourceSize.width) / 2;//point.y = (winSize.height - AppDelegate::resourceSize.height) / 2;//layer->setPosition(point);//point (0,-40)scene->addChild(layer);return scene;}bool OpComic::init(){if (!Layer::init())//首先让父类初始化{return false;}return true;}



                                             
0 0
原创粉丝点击