cocos2dX 事件之触摸事件和触摸事件集合
今天, 我们来学习cocos2dX里面的触摸事件与触摸事件合集, 如今的手机游戏交互基本上都是通过触摸交互的, 所以大家明确这节的重要性了吧, 本节篇幅比較大, 所以我就不扯闲话了
先来看看经常使用函数:
触摸事件:
addTargeteDelegate( 谁使用, 优先级, 是否拦截触摸消息);
//注冊单点触摸
virtual bool ccTouchBegan(CCTouch * touch,CCEvent * event);
//触摸開始
virtual void ccTouchMoved(CCTouch * touch,CCEvent * event);
//触摸滑动
virtual void ccTouchEnded(CCTouch * touch,CCEvent * event);
//结束触摸
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);//其它事件中断触摸
触摸事件集合:
virtual void registerWithTouchDispatcher( void);
//注冊多点触摸
addStandardDelegate();
//加入托付
setTouchEnabled( bool);
//开启多点触摸, 貌似使用了这个之后就不能使用单点
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);
我们先来实现触摸事件:
在头文件中面声明我们要重写的函数:
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre"> </span>//触摸開始函数
<span style="white-space:pre"> </span>virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre"> </span>//触摸移动函数
<span style="white-space:pre"> </span>virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre"> </span>//触摸结束函数
开启单点触摸, 而且创建三个标签用来显示信息:
注意: 一定要开启单点触摸, 不然没有效果
//开启单点触摸
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate( this, 0, false); //创建三个标签
CCLabelTTF* begin = CCLabelTTF::create( "begin:-->X:0.0, -->Y:0.0", "Arial", 24);
CCLabelTTF* move = CCLabelTTF::create( "move:-->X:0.0, -->Y:0.0", "Arial", 24);
CCLabelTTF* end = CCLabelTTF::create( "end:-->X:0.0, -->Y:0.0", "Arial", 24);
begin->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 + 50));
move->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
end->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 - 50));
addChild( begin, 0, 101);
addChild( move, 0, 102);
addChild( end, 0, 103);
我们来重写这三个函数:
getLocationInView()取得坐标系是以左上角为原点的哦
我们来看看效果:
看, 我们截取到了触摸事件的消息了吧
好了, 我们再来看看触摸事件集合:
为什么有了触摸事件之后我们还要使用触摸事件集合呢?如今的手机基本都支持多点触控, 而CCTouch不能获取多点触摸的事件, 所以触摸事件集合就应运而生了
我们 还是声明一下须要重写的函数:
virtual void registerWithTouchDispatcher();
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
在init里面开启多点触摸
//开启多点触摸
setTouchEnabled( true);
实现重写的函数:
void HelloWorld::registerWithTouchDispatcher()
{
//注冊多点触摸
CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate( this, 0);
} void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator iter = pTouches->begin();
for ( ; iter != pTouches->end(); ++iter)
{
CCTouch* pTouch = (CCTouch*)(*iter);
switch ( pTouch->getID())
{
case 0:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "1", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 101);
}break;
case 1:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "2", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 102);
}break;
case 2:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "3", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 103);
}break;
case 3:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "4", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 104);
}break;
case 4:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "5", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 105);
}break;
default:
break;
}
} } void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator iter = pTouches->begin();
for ( ; iter != pTouches->end(); ++iter)
{
CCTouch* pTouch = (CCTouch*)(*iter);
switch ( pTouch->getID())
{
case 0:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 101);
ttf->setPosition( pTouch->getLocation());
}break;
case 1:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 102);
ttf->setPosition( pTouch->getLocation());
}break;
case 2:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 103);
ttf->setPosition( pTouch->getLocation());
}break;
case 3:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 104);
ttf->setPosition( pTouch->getLocation());
}break;
case 4:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 105);
ttf->setPosition( pTouch->getLocation());
}break;
default:
break;
}
}
} void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator iter = pTouches->begin();
for ( ; iter != pTouches->end(); ++iter)
{
CCTouch* pTouch = (CCTouch*)(*iter);
switch ( pTouch->getID())
{
case 0:{
removeChildByTag( 101);
}break;
case 1:{
removeChildByTag( 102);
}break;
case 2:{
removeChildByTag( 103);
}break;
case 3:{
removeChildByTag( 104);
}break;
case 4:{
removeChildByTag( 105);
}break;
default:
break;
}
}
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
看看效果:
额, 电脑上仅仅能显示一个触摸点, 我刚刚在手上測试了一下, 能够同一时候操作多个点的, 我等会上传安装文件,
我们来看看代码:
首先, 我们设置多点触控可用, 而且注冊了它, 这是必须的哦
我们在開始触摸的时候传了两个參数, 第一个參数是个容器, 我们将它取出来, 将begin()取出来作为開始标志, end()取出来作为结束标志, 遍历了这个容器, 在遍历的过程中, 我们取出了每一个对象的ID, 我们全部的触摸点都在这个容器里面, 和数组下标同样, 也是从0開始的, 所以我们取出当ID等于0的时候, 我们就绘制出第一个标签, 我们这里依次取出了5个, 同理, 在移动里面, 我们依据ID改动了他们的位置, 在结束触摸里面, 我们依据标记, 移除了对应的对象
好了, 今天的就到这里, 希望大家还是多多练习, 有什么疑问就加群: 223856254
cocos2dX 事件之触摸事件和触摸事件集合的更多相关文章
- cocos2d-x 详解之 CCLayer(触摸事件)
CCLayer继承自CCNode,在CCLayer中可以实现单点触摸.多点触摸和重力感应回调3种不同形式的交互.这部分的难点在于,当存在多个层都要去接收触摸时它的响应机制是如何处理的.了解内部的处理机 ...
- Android 使用代码主动去调用控件的点击事件(模拟人手去触摸控件)
使用代码主动去调用控件的点击事件(模拟人手去触摸控件) //View 可以是LinearLayout,Button,TextView View.performClick();
- ##DAY4 事件的基本概念、触摸的基本概念、响应者链、手势
##DAY4 事件的基本概念.触摸的基本概念.响应者链.手势 #pragma mark ———————事件的基本概念 ——————————— 事件的基本概念: 1)事件是当用户的手指触击屏幕及在屏幕 ...
- 移动端触摸(touch)事件
移动端时代已经到来,作为前端开发的我们没有理由也不应该坐井观天,而是勇敢地跳出心里的那口井,去拥抱蔚蓝的天空.该来的总会来,我们要做的就是接受未知的挑战.正如你所看到的,这是一篇关于移动端触摸事件的文 ...
- 2019-11-29-WPF-从触摸消息转触摸事件
原文:2019-11-29-WPF-从触摸消息转触摸事件 title author date CreateTime categories WPF 从触摸消息转触摸事件 lindexi 2019-11- ...
- 移动端触摸、点击事件优化(fastclick源码学习)
移动端触摸.点击事件优化(fastclick源码学习) 最近在做一些微信移动端的页面,在此记录关于移动端触摸和点击事件的学习优化过程,主要内容围绕fastclick展开.fastclick githu ...
- 2019-5-13-WPF-从触摸消息转触摸事件
title author date CreateTime categories WPF 从触摸消息转触摸事件 lindexi 2019-05-13 09:43:48 +0800 2019-05-12 ...
- 【Cocos2dx 3.3 Lua】触屏事件
cocos2dx 3.x触屏时间分为单点触摸和多点触摸: 单点触摸:(即只有注册的Layer才能接收触摸事件) 多点触摸点单用法(多个Layer获取屏幕事件): ...
- 深入理解DOM事件机制系列第四篇——事件模拟
× 目录 [1]引入 [2]模拟机制 [3]自定义事件 前面的话 事件是网页中某个特别的瞬间,经常由用户操作或通过其他浏览器功能来触发.但实际上,也可以使用javascript在任意时刻来触发特定的事 ...
- 深入理解DOM事件类型系列第一篇——鼠标事件
× 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...
随机推荐
- java--匿名类
匿名类的使用 package Test; abstract class C525{ abstract void foo(); } class B525{ // 局部类只能访问外包方法中的final成员 ...
- 2个NASM开发环境下载以及30篇教程(lostspeed)
http://download.csdn.net/detail/lostspeed/8958175http://download.csdn.net/detail/lostspeed/8954263 h ...
- HTTP1.1协议中文版-RFC2616
转自:http://www.cnpaf.net/Class/HTTP/200811/23277.html 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善.请参考 “互联网官方协 ...
- poj 1155 TELE (树形背包dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ...
- Codeforces Round #189 (Div. 2)
题目地址:http://codeforces.com/contest/320 第一题:基本题,判断mod 1000,mod 100.,mod 10是不是等于144.14.1,直到为0 代码如下: #i ...
- 蛋疼的Apple IOS Push通知协议
简单介绍 Apple Push通知机制事实上非常easy,就是Apple的APNsserver做为中间人,把消息推送到相应的设备上. 一张来自Apple文档的图: 当然,示意图看起来简单,可是另一些实 ...
- C# - 使用皮肤
运行效果: 项目目录结构: 主窗体代码: using System; using System.Collections.Generic; using System.ComponentModel; us ...
- Troubleshooting:oVirt-engine
问题:执行./create_db_devel.sh -u postgres创建数据库时出错 描述: [root@localhost dbscripts]# ./create_db_devel.sh - ...
- WebBrowser与IE的关系,如何设置WebBrowser工作在IE9模式下?
原文 WebBrowser与IE的关系,如何设置WebBrowser工作在IE9模式下? 一.问题的提出 偶然发现,Winform里的WebBrowser和IE实际安装的版本似乎并不同步,很有趣! 下 ...
- boost::property_tree读取解析ini文件--推荐
boost::property_tree读取解析ini文件 #include "stdafx.h" #include <iostream> #include <b ...