cocos2dx-3.6 开发技巧(二)回调函数以及动画的使用,触摸事件,android返回键,屏幕截屏
来源:互联网 发布:https seo 编辑:程序博客网 时间:2024/05/16 15:41
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精灵触摸事件头文件如下:
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
- cocos2dx-3.6 开发技巧(二)回调函数以及动画的使用,触摸事件,android返回键,屏幕截屏
- 回调函数的使用(二)
- cocos2dx 3.x 屏幕触摸事件的认识
- Android开发-触屏事件的获取和触摸屏幕位置
- Android开发-触屏事件的获取和触摸屏幕位置
- Android开发-触屏事件的获取和触摸屏幕位置
- android 开发零起步学习笔记(十七):自定义android用户控件,使用回调函数实现自定义事件
- [cocos2dx开发技巧4]工具CocosBuilder的使用--复杂动画
- [cocos2dx开发技巧4]工具CocosBuilder的使用--复杂动画
- Node.js的回调函数以及事件循环
- android屏幕触摸事件机制(转)
- cocos2dx中使用触摸事件
- Cocos2dx 3.0的回调函数
- Android -- 回调函数的使用
- Android中回调函数的使用
- 使用同步获取DWR回调函数的返回值
- cocos2dx selector(回调函数)详细
- Cocos2dx-3.x触摸事件之实现人机交互(二)
- webpack基础入门
- 【概率】极大似然MLE 和最大后验 MAP,最大熵Maximum Entropy
- 广告行业PMP
- 颜色、像素、帧缓存
- MPAndroidChart之LineChart双线绘制
- cocos2dx-3.6 开发技巧(二)回调函数以及动画的使用,触摸事件,android返回键,屏幕截屏
- 使用printf 打印数据的一个小小疑问,待解!
- [leetcode]240. Search a 2D Matrix II
- ubuntu和win10双系统安装教程
- node-sass报错解决方法
- 关于使用ExcelEngine在Windows中编译的补充
- KVC-KVO
- 常用的后端命令 【笔记】
- 自定义控件时使用setTextSize出现的问题