请参考《Ubuntu18.04搭建Cocos2d开发环境》搭建项目

默认情况下,Cocos2d-x会将鼠标左点击当作触摸。

第一步:在/home/kyun/Desktop/Games/MyGame/CMakeLists.txt文件添加TouchScene.h和TouchScene.cpp:

# add cross-platforms source files and header files
list(APPEND GAME_SOURCEClasses/AppDelegate.cppClasses/TouchScene.cpp)
list(APPEND GAME_HEADERClasses/AppDelegate.hClasses/TouchScene.h)

第二步:编写TouchScene.h和TouchScene.cpp

TouchScene.h:


#include "cocos2d.h"class TouchScene : public cocos2d::Layer {public:static cocos2d::Scene* createScene();virtual  bool init();//Touch事件回调方法virtual bool onTouchBegan(cocos2d::Touch*,cocos2d::Event*);virtual void onTouchEnded(cocos2d::Touch*,cocos2d::Event*);virtual void onTouchMoved(cocos2d::Touch*,cocos2d::Event*);virtual void onTouchCancelled(cocos2d::Touch*,cocos2d::Event*);CREATE_FUNC(TouchScene);
private:cocos2d::Label* labelTouchInfo;};

TouchScene.cpp:

//
// Created by kyun on 20-3-12.
//#include "TouchScene.h"USING_NS_CC;Scene* TouchScene::createScene() {auto scene = Scene::create();auto layer = TouchScene::create();scene->addChild(layer);return scene;
}bool TouchScene::init() {if(!Layer::init()){return false;}// Label标签labelTouchInfo = Label::createWithSystemFont("Touch or clicksomewhere to begin","Arial",30);labelTouchInfo->setPosition(Vec2(Director::getInstance()->getVisibleSize().width/2,Director::getInstance()->getVisibleSize().height/2));// 创建EventListenerTouchOneByOne类型的事件监听器auto touchListener = EventListenerTouchOneByOne::create();// 将处理函数绑定到事件监听器上touchListener->onTouchBegan = CC_CALLBACK_2(TouchScene::onTouchBegan,this);touchListener->onTouchEnded = CC_CALLBACK_2(TouchScene::onTouchEnded,this);touchListener->onTouchMoved = CC_CALLBACK_2(TouchScene::onTouchMoved,this);touchListener->onTouchCancelled = CC_CALLBACK_2(TouchScene::onTouchCancelled,this);// 将事件监听器注册到节点的_eventDispatcher上_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,this);this->addChild(labelTouchInfo);return true;
}bool TouchScene::onTouchBegan(cocos2d::Touch * touch, cocos2d::Event * event) {labelTouchInfo->setPosition(touch->getLocation());labelTouchInfo->setString("You touched here");return true;}void TouchScene::onTouchEnded(cocos2d::Touch * touch, cocos2d::Event * event) {cocos2d::log("touch ended");
}void TouchScene::onTouchMoved(cocos2d::Touch *touch, cocos2d::Event * event) {cocos2d::log("touch moved");
}void TouchScene::onTouchCancelled(cocos2d::Touch *touch, cocos2d::Event *event) {cocos2d::log("touch cancelled");
}

第三步:修改AppDelegate.cpp

#include "TouchScene.h"
...
bool AppDelegate::applicationDidFinishLaunching() {...// create a scene. it's an autorelease objectauto scene = TouchScene::createScene();// rundirector->runWithScene(scene);return true;
}

最后,运行就可以了。

分析TouchScene中的用到的方法

  • 关于EventListenerTouchOneByOne事件监听器处理函数的定义
class CC_DLL EventListenerTouchOneByOne : public EventListener
{   public:typedef std::function<bool(Touch*, Event*)> ccTouchBeganCallback;typedef std::function<void(Touch*, Event*)> ccTouchCallback;ccTouchBeganCallback onTouchBegan;ccTouchCallback onTouchMoved;ccTouchCallback onTouchEnded;ccTouchCallback onTouchCancelled;
...};

我们根据此来定义我们的函数,上面规定了处理函数的返回值形参顺序。其实我们也可以使用Lambda表达式来定义处理函数,如:

touchListener->onTouchBegan = [](Touch* touch,Event* event)->bool{// todo
}

完整的例子,我们修改init方法,让其使用lambda表达式来定义处理函数:

//
// Created by kyun on 20-3-12.
//#include "TouchScene.h"USING_NS_CC;Scene* TouchScene::createScene() {auto scene = Scene::create();auto layer = TouchScene::create();scene->addChild(layer);return scene;
}bool TouchScene::init() {if(!Layer::init()){return false;}auto sprite = Sprite::create("logo2.png");sprite->setAnchorPoint(Vec2(0.5,0.5));auto visibleSize = Director::getInstance()->getVisibleSize();Vec2 origin = Director::getInstance()->getVisibleOrigin();sprite->setPosition(Vec2(visibleSize.width/2+origin.x,visibleSize.height/2+origin.y));auto touchListener = EventListenerTouchOneByOne::create();touchListener->onTouchBegan = [](Touch* touch,Event* event)->bool{auto bounds = event->getCurrentTarget()->getBoundingBox();if(bounds.containsPoint(touch->getLocation())){std::stringstream touchDetails;touchDetails <<"Touched at OpenGL coordinates:" <<touch->getLocation().x << "," << touch->getLocation().y << std::endl<<"Touched at UI coordinate:"<<touch->getLocationInView().x << "," << touch->getLocationInView().y << std::endl <<"Touched at local coordinate:" <<event->getCurrentTarget()->convertToNodeSpace(touch->getLocation()).x << "," <<event->getCurrentTarget()->convertToNodeSpace(touch->getLocation()).y << std::endl<<"Touch moved by:" << touch->getDelta().x << "," << touch->getDelta().y;ccMessageBox(touchDetails.str().c_str(),"Touched");}return true;};// Add a "touch" event listener to our spriteDirector::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(touchListener,sprite);this->addChild(sprite,0);this->addChild(labelTouchInfo);return true;
}

上面的效果就是点sprite后会弹出一个对话框。

  • ccMessageBox()弹窗
  • touch->getLocationInView()返回在屏幕坐标系(原点在屏幕左上角)中的位置
  • touch->getLocation()返回在OpenGL坐标系(原点在屏幕左下角)中的位置

谢谢阅读

Cocos2d-x处理Touch触摸事件Demo相关推荐

  1. touch触摸事件以及常用触摸功能

    文章目录 前言 一.触摸事件 二. 事件对象 event 三. 功能案例 1. 检测滑动方向 2. 实现元素拖拽 3. 实现元素旋转 总结 前言 为了给基于触摸的用户界面提供高质量的支持,触摸事件提供 ...

  2. HTML5滑动(swipe)事件,移动端触摸(touch)事件

    目有个交互需要实现手指滑动的交互,pc端使用mousedown,mousemove,mouseup监听实现. 但在ios设备上mousemove是不好监听的,同类的方法是touchstart,touc ...

  3. iOS实现ScrollView中子控件(Button,自定义View)的触摸事件响应

    最近要做个信息登记界面,在scrollView中添加了多个button和一个自定义的view(画板)来实现签名效果,画板中实现了touchBegin,touchMove等触摸事件方法.为了使butto ...

  4. 为了讲清楚Android触摸事件,我“拆了部手机”

    Android 是一个有用户界面(GUI)的操作系统,在它诞生之初,就是为带有触摸屏的手持设备准备的.作为提供给用户最重要的交互方式之一,了解触摸系统是怎么工作的,对于实际的项目开发有着非常大的帮助. ...

  5. cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate

    cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate    以下内容转载自:http://blog.sin ...

  6. WP7开发—Silverlight多点触摸事件详解【含Demo代码】

    最近在学习WP7的Silverlight编程,就把学习到知识点整理为日志,方便自己理解深刻点,也作为笔记和备忘,如有不合理或者错误之处,还恳请指正. WP7的支持多点触摸,有两种不同的编程模式: 1. ...

  7. Cocos-2d 关于SwallowTouch,进一步解释触摸事件分发机制

    问题情境 模拟一个类似游戏提示信息的层: 1.游戏主场景可触摸,可交互: 2.当提示显示提示信息时,只有提示信息这一层可触摸同用户交互,其背景则不能继续响应触摸事件 3.当提示信息层从主场景中移除之后 ...

  8. iOS UITouch触摸与UIGesture手势.01.事件、触摸(touch)事件

    一.iOS事件: 1.事件:事件就是当你在手机上点击手机屏幕.滑动手机翻面.摇动手机的时候,手机做出一些反应,对应的在应用程序里实现了某些代码的某些功能,完成这个过程就是一个事件. 2.iOS事件类型 ...

  9. 移动端事件--touch事件的分类、touch事件的event对象、 其他触摸事件

    一.touch事件的分类 1.1 触摸事件(touch) .box {width: 150px;height: 150px;background-color: red;margin: 20px aut ...

最新文章

  1. 阿里云RDS的mysql数据库占用空间超过90%的处理
  2. C提高_day03_const小专题
  3. 【工作相关】公子龙:工作后我变强了,暂时没秃
  4. mysql+encode+decode+错误_mysql decode encode 乱码问题
  5. Octave获取使用imnoise函数
  6. 大话数据结构-单链表勘误,计划调整
  7. 百兆5口工业级以太网交换机HY5700-4505F
  8. JAVA中解析XML和书写XML
  9. 31个全网最常用python实现(体系学习,学完显著提高代码复用能力)
  10. Codeforces Gym 100015 简要题解
  11. 保利威视云直播的python API
  12. Jetson TK1 刷机安装Ubuntu系统与Mini PCI-e无线网卡
  13. FIL能涨到多少?2021FIL价格预测
  14. matlab 获得子矩阵,matlab – 获取所有子矩阵
  15. mesh和wifi中继的区别_一文看懂Mesh路由和无线中继的差异
  16. 双基地mimo雷达matlab仿真,双基地MIMO雷达的干扰研究
  17. Win10系统笔记本耳机没有声音而外放却有
  18. HTML_CSS教程
  19. 《程序分析:开胃菜》概览
  20. 互联网商业模式的系统性总结(上)(方法论、价值观、观念、思维模式等)

热门文章

  1. mongodb 探索
  2. 纪念入手第一个机械键盘
  3. Java数组:稀疏数组
  4. 易语言ctrl c复制到文本,复制粘贴你还在用Ctrl C?快捷键里还有这几个隐藏高手,快到爆炸...
  5. 【shell脚本】沐风晓月跟你聊聊for循环中的那些事
  6. iOS学习—调用Face ID
  7. 福尔摩斯探案集(上)第三章 疑案
  8. linux:三剑客老三grep
  9. java判断文件格式_java判断检验各种文件类型,如gz、txt等
  10. 2019马甲包提审近况