问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

cocos2d-x 键盘事件 EventListenerKeyboard 吞噬问题

发布网友 发布时间:2022-05-04 23:18

我来回答

3个回答

懂视网 时间:2022-05-05 03:40

1、触摸事件:定义NewEventDispatcher类,用于声明触摸事件 (1)单点触摸事件,在NewEventDispatcher.h中添加如下代码: //NewEventDispatcher.h#include cocos2d.hUSING_NS_CC;using namespace cocos2d;class TouchableSpriteTest : public Scene{public:

1、触摸事件:定义NewEventDispatcher类,用于声明触摸事件

(1)单点触摸事件,在NewEventDispatcher.h中添加如下代码:

//NewEventDispatcher.h
#include "cocos2d.h"
USING_NS_CC;
using namespace cocos2d;

class TouchableSpriteTest : public Scene
{
public:
 CREATE_FUNC(TouchableSpriteTest);//首先执行new操作,然后执行init函数
 virtual bool init();
 
};
在NewEventDispatcher.cpp中添加如下代码:
//NewEventDispatcher.cpp
bool TouchableSpriteTest::init()
{
 bool bRet = false;
 do{
 CC_BREAK_IF(!Scene::init());
 auto origin = Director::getInstance()->getVisibleOrigin();
 log("origin.x = %f, origin.y = %f",origin.x,origin.y);
 auto size = Director::getInstance()->getVisibleSize();
 log("size.w = %f, size.h = %f",size.width,size.height);
 
 auto containerForSprite1 = Node::create();
 
 auto sprite1 = Sprite::create("CyanSquare.png");
 sprite1->setPosition(origin+Vec2(size.width/2,size.height/2) + Vec2(-80,80));
 containerForSprite1->addChild(sprite1,10);
 addChild(containerForSprite1,11);
 
 auto sprite2 = Sprite::create("MagentaSquare.png");
 sprite2->setPosition(origin + Vec2(size.width/2, size.height/2));
 addChild(sprite2,20);
 
 auto sprite3 = Sprite::create("YellowSquare.png");
 sprite3->setPosition(Vec2(0,0));
 addChild(sprite3,1);
 //1.创建侦听事件
 auto listener1 = EventListenerTouchOneByOne::create();
 listener1->setSwallowTouches(true);
 //2.重载onTouch*函数,使用的时lambda方法,如果使用函数重载,需要在.h文件中声明。        //或者在TouchableTest的头文件中声明onTouchBegan的函数重载;          //listener1->onTouchBegan = CC_CALLBACK_2(TouchableSpriteTest::onTouchBegan,this);      //在TouchableTest的cpp文件中重新定义。
 listener1->onTouchBegan = [](Touch* touch, Event* event)          {
  auto target = static_cast(event->getCurrentTarget());
  log("target.Tag = %d",target->getTag());
  auto locationInNode = target->convertToNodeSpace(touch->getLocation());
  auto s = target->getContentSize();
  auto rect = Rect(0,0,s.width,s.height);
  
  if(rect.containsPoint(locationInNode))
  {
  log("sprite begin...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(event->getCurrentTarget());
  log("target.Tag = %d",target->getTag());
  target->setPosition(target->getPosition() + touch->getDelta());
  log("target.x = %lf, target.y = %lf
 touch.x = %lf,touch.y = %lf",target->getPosition().x,target->getPosition().y,touch->getDelta().x,touch->getDelta().y);
 };
 
 listener1->onTouchEnded = [=](Touch* touch,Event* event){
  auto target = static_cast(event->getCurrentTarget());
  log("sprite onTouchedEnded..");
  target->setOpacity(255);
  if(target == sprite2)
  {
  containerForSprite1->setLocalZOrder(100);
  }
  else if(target == sprite1)
  {
  containerForSprite1->setLocalZOrder(0);
  }
 };
 //3.加入事件侦听序列
 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);
 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite2);
 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite3);
 bRet = true;
 }while(0);
 return bRet;
}
(2)自定义触摸事件

在NewEventDispatcher.h中添加如下代码:

//.h
class CustomEvent : public Scene
{
public:
 CREATE_FUNC(CustomEvent);
 virtual bool init();
private:
 EventListenerCustom* _listener1;//自定义事件
 EventListenerCustom* _listener2;
};
在NewEventDispatcher.cpp中添加如下代码:
//.cpp
bool CustomEvent::init()
{
 bool bRet = false;
 do{
 CC_BREAK_IF(!Scene::init());
 
 auto origin = Director::getInstance()->getVisibleOrigin();
 auto size = Director::getInstance()->getVisibleSize();
 
 MenuItemFont::setFontSize(20);
 
 auto statusLabel = Label::createWithSystemFont("No custom event 1 received!", "", 20);
 statusLabel->setPosition(origin + Vec2(size.width/2, size.height-90));
 addChild(statusLabel);
 //1.创建侦听事件及回调函数,该自定义事件监听的时game_custom_event1事件
 _listener1 = EventListenerCustom::create("game_custom_event1", [=](EventCustom* event){
  std::string str("Custom event 1 received, ");
  char* buf = static_cast(event->getUserData());
  str += buf;
  str += " times";
  statusLabel->setString(str.c_str());
 });
 //2.将侦听事件加入事件侦听序列
 _eventDispatcher->addEventListenerWithFixedPriority(_listener1, 1);
 //设置MenuItem,名字叫Send Custom Event 1,触发的事件是lambda函数,点击“Send Custom Event 1”,触发
 auto sendItem = MenuItemFont::create("Send Custom Event 1", [=](Ref* sender){
  static int count = 0;
  ++count;
  char* buf = new char[10];
  sprintf(buf, "%d", count);
  EventCustom event("game_custom_event1");//创建自定义事件,名字为“game_custom_event1”
  event.setUserData(buf);
  _eventDispatcher->dispatchEvent(&event);//将自定义事件加入侦听,触发事件,
  CC_SAFE_DELETE_ARRAY(buf);
 });
 sendItem->setPosition(origin + Vec2(size.width/2, size.height/2));

 
 auto statusLabel2 = Label::createWithSystemFont("No custom event 2 received!", "", 20);
 statusLabel2->setPosition(origin + Vec2(size.width/2, size.height-120));
 addChild(statusLabel2);
 //同_listener1
 _listener2 = EventListenerCustom::create("game_custom_event2", [=](EventCustom* event){
  std::string str("Custom event 2 received, ");
  char* buf = static_cast(event->getUserData());
  str += buf;
  str += " times";
  statusLabel2->setString(str.c_str());
 });
 //同_listener1
 _eventDispatcher->addEventListenerWithFixedPriority(_listener2, 1);
 
 auto sendItem2 = MenuItemFont::create("Send Custom Event 2", [=](Ref* sender){
  static int count = 0;
  ++count;
  char* buf = new char[10];
  sprintf(buf, "%d", count);
  EventCustom event("game_custom_event2");
  event.setUserData(buf);
  _eventDispatcher->dispatchEvent(&event);
  CC_SAFE_DELETE_ARRAY(buf);
 });
 sendItem2->setPosition(origin + Vec2(size.width/2, size.height/2 - 40));
 
 auto menu = Menu::create(sendItem, sendItem2, nullptr);
 menu->setPosition(Vec2(0, 0));
 menu->setAnchorPoint(Vec2(0, 0));
 addChild(menu, -1);
 
 bRet = true;
 }while(0);
 return bRet;
}

热心网友 时间:2022-05-05 00:48

崇高的理想就象生长在高山上的鲜花。如果要搞下它,勤奋才能是攀登的绳索。

热心网友 时间:2022-05-05 02:06

看下API 有一个参数是设定优先级的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 形体训练起源于芭蕾舞蹈什么的基本功训练 刚买的被子洗过之后就有股很浓的柴油味,怎么办? 新买了一床棉被,有味道怎么办 技嘉GA-MA770-US3主板怎么开启VT 技嘉GA-MA770-DS3主板跑AMD9650会不会太累 qq钱包注销问题描述怎么写 主板技嘉GA-MA770-US3..CPU 速龙X245 技嘉GA-MA770-S3 主板可以插AMD 羿龙IIX4 955的CPU吗? 技嘉主板GAMA770-US3(rev.2.00) 可以插几个机箱风扇 技嘉GA-MA770-US3主板支持什么样的显卡 "技嘉 ga-ma770-us3"与"华擎a770de+"两个主板哪个更强? 技嘉GA_MA770主板-是否支持大硬盘 主板是技嘉 GA-MA770-UD3,支持的升级的最大CPU和显卡能升到什么型号? 技嘉GA-MA770-UD3主板能支持2TB的硬盘吗? 技嘉ga-ma770-ud3主板支持什么CPU呢?老电脑想升级一下 技嘉GA-MA770-ES3搭配什么CPU? 主板GA-MA770-ES3配置方案? GA-MA770-S3P配置方案? 技嘉主板GA-MA770-ES3 配置方案 MA770一ds3主板支持多大功耗cPU 奔驰的耳机能连蓝牙吗? 什么是 人格解体 什么叫人格解体? 人格解体是怎么回事,太痛苦了 人格解体的人格解体概念 如何 与有人格解体综合症的人相处 不属于心理疾病的是 求固定资产折旧计算表(带分式), 心理疾病除了抑郁症和强迫症,还有哪些? 人格解体综合症相关书籍 佛教描述的很多东西为什么和人格解体综合症很像 固定资产折旧计算表是会计人员填制吗 巴士模拟2线路到底是怎么设置的, 巴士模拟怎么查看路线,我都不知道往哪里开 巴士模拟,设置好线路也没人上车。。是不是要还设置车头和那个电牌?这个怎么设置的? 巴士模拟2怎么开后门啊,设置没看到有设置,只有前门,还有如何看路线 巴士模拟2012怎么玩 巴士模拟要怎么操作怎么玩 ?设置都设置好了。就是启动不了?车开不动呀!???、 巴士模拟2 怎么玩? 巴士模拟2怎么玩