1:用cocostudio编辑的timeline动画的结束回调事件:
3:sequence回调事件
4:cocos2dx精灵触摸事件
cpp实现:
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.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));
}
}
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::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;
}