cocos2dx 3.x事件监听

本文介绍了如何在Cocos2d-x 3.10版本中使用新的触控事件处理机制,包括创建触摸监听器、设置触摸事件的回调方法,并通过lambda表达式实现了ccTouchBegan、ccTouchMoved和ccTouchEnded三个关键生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用了cocos2dx 3.10,当使用到点击事件时,想像3.0之前的版本那样使用,结果却发现,基类函数无法在lambda(这是什么鬼,我其实不知道。。)中使用。。。。

virtual bool ccTouchBegan(cocos2d::Touch* touch, cocos2d::Event ev);

上面的声明方式却无法使用,后来网上看才发现,3.0以上版本的事件定义方式,简单便捷些,如:

auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听 
this->setSwallowsTouches(true);

listener1是单点触摸事件的声明,当然,还有其他的一些事件,这里就不一一列举了。

//通过 lambda 表达式 直接实现触摸事件的回掉方法  
listener1->onTouchBegan = [](Touch* touch, Event* event) {
	auto target = static_cast<Sprite*>(event->getCurrentTarget());

	Point locationInNode = target->convertToNodeSpace(touch->getLocation());
	Size s = target->getContentSize();
	Rect rect = Rect(0, 0, s.width, s.height);

	if (rect.containsPoint(locationInNode))
	{
		log("sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y);
		target->setOpacity(180);
		return true;
	}
	return false;
};

listener1->onTouchMoved = [=](Touch* touch, Event* event) {
	auto target = static_cast<Sprite*>(event->getCurrentTarget());
	target->setPosition(target->getPosition() + touch->getDelta());
};

listener1->onTouchEnded = [=](Touch* touch, Event* event) {
	auto target = static_cast<Sprite*>(event->getCurrentTarget());
	log("sprite onTouchesEnded.. ");
	target->setOpacity(255);
	Point locationInNode = target->convertToNodeSpace(touch->getLocation());
	Point spriteLocation = g_Monkey->getPosition();
		
		
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, this);

以上是单点触摸事件的三个生命周期的定义:ccTouchBegan、ccTouchMoved、ccTouchEnded,注意“=”号后带有“=”的中括号,带有“=”的,可以在方法中使用全局或者局部的变量,否则则不可在lambda中使用。最后一句则是将事件注册到相关的组件中,如Sprite或者Layer等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值