1:用cocostudio编辑的timeline动画的结束回调事件:
Layer和Sprite有不同,layer要设置锚点,必须先:ignoreAnchorPointForPosition(false);
//加载节点
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精灵触摸事件
头文件如下:
cpp实现文件:EventListenerTouchOneByOne *listener; void setListener(); bool onTouchBegan(Touch *touch, Event *event); void onTouchEnded(Touch* touch, Event* event);
5:手机返回键监听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.9f this->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)); } }
6:游戏场景暂停//手机返回监听 头文件声明 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; } }
要跳转的场景类的实现: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::BLACK scene->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; }