Cocos2d-x 3.0 屏幕触摸及消息分发机制
***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
题外话:
唉。
开学了! 好烦。
这就已经大三了,
两年前的这时候,我还是懵懂的大一小学弟,
两年后。就要奔上社会就业了。
光阴似箭。日月如梭呀~
正文:
好久没做cocos2d-x了,这次练习一下。屏幕触摸及消息分发机制。
这里,我用的是cocos2d-x 3.0版本号来进行练习的,环境是 VS2012+WIN7
首先。新建一个项目,并向场景增加一个精灵。
新建项目: cocos new -p xxx(包名) -l xxx(语言) -d xxx(保存路径)
选择一个精灵,放到resource文件夹下,并在VS2012中增加资源项。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHR0cmVl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
然后。建立一个新的精灵。加入到当前场景Hello World
auto sprite_2 = Sprite::create("player.png");
sprite_2->setPosition(Point(visibleSize.width/2+origin.x,visibleSize.height/2+origin.y));
// 图片略大,缩小一下
sprite_2->setScale(0.4f);
this->addChild(sprite_2);
这样。已经增加了一个精灵,接下来要做的就是触摸事件的处理。
我们要实现触摸一个位置,让精灵跟着移动到该位置。步骤为:
——定义监听事件的侦听对象
——定义侦听对象的回调方法
——在事件分发器上注冊
由于点击一个位置,用OneByOne这个单点触摸就可以。
首先。定义监听事件的侦听对象:
auto listener=EventListenerTouchOneByOne::create();
然后。定义回调方法。
我们精灵所在的scene类继承自Layer类,Layer类中。有触摸的虚函数,
因此,我们仅仅须要复制过来,进行覆盖就能够定制回调函数了。
先到Layer类中,找到onTouchBegan,onTouchMoved,onTouchEnded
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHR0cmVl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
然后,拷贝到HelloWorldScene.h中声明,并在.cpp中定义
先进行一些简单的定义,然后在文件里,要制定回调方法,从下图可知:
CC_CALLBACK_2有两个參数,_selector_ and _target_
_selector_:选择哪个函数进行回调? ——显然是当前类中的对应函数啦
_target_:由哪个对象触发?——就是当前的场景
所以,最后应该是:
// 定义监听对象的回调方法
listener->onTouchBegan=CC_CALLBACK_2(HelloWorld::onTouchBegan,this);
listener->onTouchMoved=CC_CALLBACK_2(HelloWorld::onTouchMoved,this);
listener->onTouchEnded=CC_CALLBACK_2(HelloWorld::onTouchEnded,this);
(PS:为虾米用CC_CALLBACK_2?
点击进入它的定义。能够看到:
// new callbacks based on C++11
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)
CC_CALLBACK_.. 这个事实上都是在用std::bind来进行的操作。
白话来说,就是实现了一个对象和一个方法的绑定执行。
要注意的是,后面的_几,并非代表有几个參数,而是有几个占位符。
更加具体内容,能够看这个→ std::bind与CC_CALLBACK不得不说的故事 )
*****这里也体现出了cocos2d-x 2.x和3.x的小差别:
在2.x中。须要注冊一个事件侦听。
而在3.x中。则须要定义一个侦听器的对象。然后定义回调方法。最后还要将侦听和事件分发器绑定。
如今来向事件分发器加入:
_eventDispatcher
注冊一个侦听事件,主要有以下几种:
我们用的是最后一种。基于场景图的优先级的。
// 在事件分发器中注冊
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
两个參数,第一个表示侦听对象,第二个表示在哪个节点进行。
说了这么多了。我们来试一试,到眼下为止。是否正确。
也就是检測一下,我们的点击动作是否能被获取并分发。
在,HelloWorld::onTouchBegan中,设置在控制台输出所点击的坐标:
bool HelloWorld::onTouchBegan(Touch *touch, Event *unused_event)
{
log("the location is: %lf,%lf !",touch->getLocationInView().x,touch->getLocationInView().y);
return true;
}
log就是打印功能。
%lf,输出的坐标为 double型,
getLocation是得到OpenGL坐标系(左下角为0,0点)
getLocationInView是得到当前屏幕坐标系(左上角为0,0点)
OK,搞定。执行!
有错误!
将Layer里onTouchBegan复制过来,没有给他们加命名空间,
能够直接在HelloWorldScene.h中加一句:
using namespace cocos2d;
或者 USING_NS_CC;
再或者。不嫌麻烦。就在对应Touch和Event前加cocos2d::
bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event);
void onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *unused_event);
void onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *unused_event);
好了,如今执行一下吧~
恩,点击鼠标。输出对应的位置坐标。
我们能够继续做下去了!
我们的目标是。点击屏幕,然后让我们指定的精灵移动到该位置。
如今,我们能够获取到点击屏幕的位置了,怎样让指定的精灵移动到该位置呢?
要想指定精灵。那就要用到Tag,给精灵做一个标记,setTag
sprite_2->setTag(33);
我给它定义了一个编号33(当然,依照心情。随便设置的。)
编号设置了,如今,让用户触摸这个点以后,得到这个精灵,便于后面进行对应操作。
bool HelloWorld::onTouchBegan(Touch *touch, Event *unused_event)
{
log("the location is: %lf,%lf !",touch->getLocationInView().x,touch->getLocationInView().y);
// 新建一个精灵。通过编号得到这个精灵
auto sprite=this->getChildByTag(33);
sprite->setPosition(Point(touch->getLocation().x,touch->getLocation().y));
return true;
}
如今,我们能够通过点击某个点。我们的精灵的中心就会在该点了,
接下来。能够做一些动作了。不要立即出现,让它移动过去。
这个,能够通过之前学习的 runAction中的MoveTo来解决:
bool HelloWorld::onTouchBegan(Touch *touch, Event *unused_event)
{
log("the location is: %lf,%lf !",touch->getLocationInView().x,touch->getLocationInView().y);
// 新建一个精灵。通过编号得到这个精灵
auto sprite=this->getChildByTag(33);
// sprite->setPosition(Point(touch->getLocation().x,touch->getLocation().y));
sprite->runAction(MoveTo::create(0.5,Point(touch->getLocation().x,touch->getLocation().y)));
return true;
}
完毕了,~(*^__^*) ~
如今。来个更加难一点的。怎样进行拖动?
事实上,也不难的,就是在onTouchMoved中,获取这个精灵,并setPosition。当然之前onTouchBegan的对应都要删除。
void HelloWorld::onTouchMoved(Touch *touch, Event *unused_event)
{
auto sprite=this->getChildByTag(33);
sprite->setPosition(Point(touch->getLocation().x,touch->getLocation().y));
}
OK,执行一下,耍一耍吧。
恩,这次就到这里了。
这次做的是。通过点击屏幕让 角色 移动到该位置,能够直接出现。也能够移动过去,还能够拖动。
过程例如以下:
1.创建一个所须要操作的精灵于场景中
2.创建监听事件的侦听对象
3.定义对象的回调函数
4.在事件分发器中进行注冊
5.更改onTouchBegan,onTouchMoved内对应内容,来实现目的。
。。
End。。
***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
Cocos2d-x 3.0 屏幕触摸及消息分发机制的更多相关文章
- delphi VCL研究之消息分发机制-delphi高手突破读书笔记
1.VCL 概貌 先看一下VCL类图的主要分支,如图4.1所示.在图中可以看到,TObject是VCL的祖先类,这也是Object Pascal语言所规定的.但实际上,TObject以及TObject ...
- Android 消息分发机制
Android 中针对耗时的操作,放在主线程操作,轻者会造成 UI 卡顿,重则会直接无响应,造成 Force Close.同时在 Android 3.0 以后,禁止在主线程进行网络请求. 针对耗时或者 ...
- 轻松搞定RabbitMQ(二)——工作队列之消息分发机制
转自 http://blog.csdn.net/xiaoxian8023/article/details/48681987 上一篇博文中简单介绍了一下RabbitMQ的基础知识,并写了一个经典语言入门 ...
- Android触摸事件的分发机制
---恢复内容开始--- 一.MotionEvent : ACTION_DOWN(下按事件).ACTION_UP(松开事件).ACTION_MOVE(移动事件) 二.三大函数 1.dispatchTo ...
- Android正在使用Handler实现消息分发机制(两)
在开始这篇文章之前,.首先,我们在总结前两篇文章Handler, Looper和MessageQueue像一些关键点: 0)在创建线程Handler之前,你必须调用Looper.prepare(), ...
- Android正在使用Handler实现消息分发机制(零)
演讲前,AsyncTask文章.我们在最后谈到.AsyncTask它是利用Handler异步消息处理机制,操作结果.使用Message回到主线程,从而执行UI更新线程. 而在我们的日常开发工作,Han ...
- RabbitMQ中交换机的消息分发机制
RabbitMQ是一个消息代理,它接受和转发消息,是一个由 Erlang 语言开发的遵循AMQP协议的开源实现.在RabbitMQ中生产者不会将消息直接发送到队列当中,而是将消息直接发送到交换机(ex ...
- IOS 触摸事件分发机制详解
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:MelonTeam 前言 很多时候大家都不关心IOS触摸事件的分发机制的实现原理,当遇到以下几种情形的时候你很可能抓破头皮都找不到解决方案 ...
- Provider:SSL提供程序,error:0 - 接收到的消息异常,或格式不正确
引自 :http://www.cnblogs.com/liuguozhu2015/p/3413496.html 非常感谢这位同学 我用笔记本的sql客户端去连服务器,正常连接. 在页面中连接时,直接导 ...
随机推荐
- postgresql connection failure:SQLSTATE[08006] [7] could not connect to server: Permission denied Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432?
PHP 程序无法连接到 CentOS 上的PostgreSQL,但是在 CentOS 服务器上却能正常运行 psql, 操作如下:多次重启 PG 数据库后发现 CGI 脚本无法连接数据库,但是可以使用 ...
- sqlserver不能创建数据库关系图
use [你的数据库名]EXEC sp_changedbowner 'sa'
- ansible Failed to connect to the host via ssh: no such identity: /root/.ssh/id_rsa.bak
中控机和远端主机配置完密钥后,在中控台上通过ansible检测联通性 ansible -i inventory.cfg all -m ping 10.1.1.1 | UNREACHABLE! => ...
- UVA 12633 Super Rooks on Chessboard ——FFT
发现对角线上的和是一个定值. 然后就不考虑斜着,可以处理出那些行和列是可以放置的. 然后FFT,统计出每一个可行的项的系数和就可以了. #include <map> #include &l ...
- SGU 乱搞日志
SGU 100 A+B :太神不会 SGU 101 Domino: 题目大意:有N张骨牌,两张骨牌有两面有0到6的数字,能相连当且仅当前后数字相同,问能否有将N张骨牌连接的方案?思路:裸的欧拉回路,注 ...
- hdu5834 Magic boy Bi Luo with his excited tree 【树形dp】
题目链接 hdu5834 题解 思路很粗犷,实现很难受 设\(f[i][0|1]\)表示向子树走回来或不回来的最大收益 设\(g[i][0|1]\)表示向父亲走走回来或不回来的最大收益 再设\(h[i ...
- 3984: 玩具(toy)
3984: 玩具(toy) 题目描述 这个故事发生在很久以前,在 IcePrincess_1968 和 IcePrince_1968 都还在上幼儿园的时候. IcePrince_1968 最近迷上了一 ...
- import组件的时候报错
去webpack.base.js配置 resolve: { extensions: ['.js', '.vue', '.json'], alias: { 'vue$': 'vue/dist/vue.e ...
- jquery 实践操作:iframe 相关操作
此篇记录关于HTML 的 iframe 元素 的相关记录 定义:iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 常用的基本 iframe 设置(详细设置属性参考API:http:/ ...
- poj 1743 Musical Theme 后缀自动机/后缀数组/后缀树
题目大意 直接用了hzwer的题意 题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题."主题&qu ...