cocos2dx-3.6 开发技巧(二)回调函数以及动画的使用,触摸事件,android返回键,屏幕截屏
2017-03-15 09:50
525 查看
1:用cocostudio编辑的timeline动画的结束回调事件:Layer和Sprite有不同,layer要设置锚点,必须先:ignoreAnchorPointForPosition(false);[cpp] view plain copy CCLayer* layer1 = CCLayerColor::create(ccc4(255,0,0,255), 300, 200); CCLayer* layer2 = CCLayerColor::create(ccc4(255,255,0,255), 100, 100); addChild(layer1); layer1->addChild(layer2); /* layer1->ignoreAnchorPointForPosition(false);*/ layerba3a1->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);};#endifcpp实现:
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;}
相关文章推荐
- 50个Android开发技巧(2,使用延迟加载以及避免代码重复,include和viewstub)
- Android开发-触屏事件的获取和触摸屏幕位置
- Android列表组件ListView使用详解之屏幕触摸事件
- Android设备 cocos2dx 骨骼动画注册事件播放音效,退到后台再返回黑屏问题
- [cocos2dx开发技巧4]工具CocosBuilder的使用--复杂动画
- 【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图&设置自适应屏幕
- cocos2dx-3.6 开发技巧(一) GBK转UTF-8 以及 读取txt文件内容
- [cocos2dx开发技巧4]工具CocosBuilder的使用--复杂动画
- android 开发零起步学习笔记(十七):自定义android用户控件,使用回调函数实现自定义事件
- 介绍内容有 Android 开发规范, 架构, 布局技巧, 以及使用一些有助于快速开发相关工具等等
- android 开发技巧(2)--使用延迟加载以及避免代码重复
- Android开发-触屏事件的获取和触摸屏幕位置
- Android 开发技巧之 禁止截屏和屏幕常亮
- iOS开发--QQ音乐练习,旋转动画的实现,音乐工具类的封装,定时器的使用技巧,SliderBar的事件处理
- Android开发-触屏事件的获取和触摸屏幕位置
- Android开发之触摸事件-点击屏幕获…
- 【iOS-cocos2d-X 游戏开发之十五】Cocos2dx中响应Android的Back(返回)与Menu(小房子)事件&&Cocos2dx自动释放粒子内存函数!
- Android开发之触摸事件的使用--触…
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- iPhone开发进阶(8)--- 检测屏幕触摸事件