Cocos2d-x之Touch事件处理机制
一、两种机制的四种不同的事件
CCStandardTouchDelegate 默认事件 | |
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); |
处理打断事件 |
CCTargetedTouchDelegate | |
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); |
处理用户按下事件,true表示继续处理, 否则false. |
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); |
处理按下并移动事件 |
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); |
处理松开事件 |
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); |
处理打断事件 |
两者的区别: CCSet
与 CCTouch
,一个事件集合一个单个事件。
事件分发的顺序: CCTargetedTouchDelegate
→ CCStandardTouchDelegate
。
默认情况下所有 CCLayer
都没有启用触摸事件,需要 this->setTouchEnabled(true);
启用。
如需更改事件:
void registerWithTouchDispatcher(void) {} class MyLayer: public cocos2d:CCLayer {
public:
virtual void registerWithTouchDispatcher(void); // addStandardDelegate()
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); // addTargetedDelegate()
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
} void MyLayer::registerWithTouchDispatcher(void) {
// 委托,优先级
CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, kCCMenuTouchPriority);
// 委托,优先级,是否继续处理
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority, true); // 2.0版本以后
CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, kCCMenuHandlerPriority);
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority, true);
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
二、 如果实现回调函数?
利用 ccTouchBegan
或 ccTouchesBegan
加以实现点击的回调
void MyLayer::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {
// 单点
CCTouch *pTouch = (CCTouch*)(pTouches->anyObject()); // 所有点
for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++) {
CCTouch *pCurTouch = (CCTouch*)(*iterTouch);
} // 获取点在视图中的坐标(左上角为原点)
CCPoint touchLocation = pTouch->getLocationInView();
// 把点的坐标转换成OpenGL坐标(左下角为原点)
touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation);
// 把OpenGL的坐标转换成CCLayer的坐标
CCPoint local = convertToNodeSpace(touchLocation)
// 大小为100x100,坐标为(0, 0)的矩形
CCRect * rect = CCRectMake(0, 0, 100, 100);
// 判断该坐标是否在rect矩形内
bool flag = rect.containsPoint(local);
if(flag) {
// 回调
} else {
// 不执行
}
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Cocos2d-x之Touch事件处理机制的更多相关文章
- Android的Touch事件处理机制
Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一 ...
- Cocos2d-x Touch事件处理机制
在Cocos2d-x中提供两种触摸事件处理机制:CCStandardTouchDelegate和CCTargetedTouchDelegate. 一.如何使用 0.默认情况下CCLayer都是没有启动 ...
- Cocos2d-x-3.0 Touch事件处理机制
在学习Cocos2d-html5游戏例子的时候,注册事件代码一直提示:TypeError: cc.Director._getInstance(...).getTouchDispatcher is no ...
- Cocos2d-x之事件处理机制
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 事件处理机制分为单点触屏,多点触屏,加速度事件,键盘事件和鼠标事件.在现在的智能手机中,触屏的应用比较的广泛,尤其是多点触屏事件的技术,使 ...
- 【Cocos2d-x 3.x】 事件处理机制源码分析
在游戏中,触摸是最基本的,必不可少的.Cocos2d-x 3.x中定义了一系列事件,同时也定义了负责监听这些事件的监听器,另外,cocos定义了事件分发类,用来将事件派发出去以便可以实现相应的事件. ...
- Android的两种事件处理机制
UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理. 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事 ...
- 自定义View系列教程06--详解View的Touch事件处理
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- Cocoa Touch事件处理流程--响应者链
Cocoa Touch事件处理流程--响应者链 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9264335 转载请注明 ...
- java 事件处理机制:按下上下左右键控制小球的运动
/** * 加深对事件处理机制的理解 * 通过上下左右键来控制一个小球的位置 */package com.test3;import java.awt.*;import javax.swing.*;im ...
随机推荐
- 156. Binary Tree Upside Down
题目: Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node ...
- [译]GotW #6a: Const-Correctness, Part 1
const 和 mutable在C++存在已经很多年了,对于如今的这两个关键字你了解多少? Problem JG Question 1. 什么是“共享变量”? Guru Question 2. con ...
- Import Items – Validation Multiple Languages Description
ð 提交标准请求创建和更新物料,因语言环境与处理次序方式等因素,造成物料中英(更多语言)描述和长描述混乱刷新. 症状: >>> Submit Standard Op ...
- 利用if else判断是否及格
static void Main(string[] args) { while (true) { string ...
- ☀【offset() / position()】
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- Windows中APACHE开启fastcgi后无法连接数据库
环境:Windows server 2003 x64Apache 2.2.14mod_fcgid-2.2b-w32.zipPHP VC9 x86 Non Thread Safe(用Visual C++ ...
- Using the Task Parallel Library (TPL) for Events
Using the Task Parallel Library (TPL) for Events The parallel tasks library was introduced with the ...
- QT学习(对话框)codeblock版本
参考: http://www.cnblogs.com/JohnShao/archive/2011/09/26/2191627.html http://www.cnblogs.com/xiao-chen ...
- 杨氏矩阵 leecode 提
提交网址https://oj.leetcode.com/problems/search-a-2d-matrix/ 有个矩阵中的数,从左向右递增,从上而下递增,快速查找是一个数是是否存在,剑指offer ...
- NOIP2015 运输计划(二分+LCA+差分)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 308 Solved: 208[Submit][Status] ...