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

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.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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值