为了让大家掌握Cocos2d-x中的事件机制,下面我们以触摸事件为例,使用事件触发器实现单点触摸事件。该实例如图8-3所示,场景中有三个方块精灵,显示顺序如图8-3所示,拖拽它们可以移动它们,事件响应优先级是按照它们的显示顺序。
下面我们再看看具体的程序代码,首先看一下HelloWorldScene.h文件,它的代码如下:
- #ifndef __HELLOWORLD_SCENE_H__
- #define __HELLOWORLD_SCENE_H__
- #include "cocos2d.h"
- typedef enum ①
- {
- kBoxA_Tag = 102
- ,kBoxB_Tag
- ,kBoxC_Tag
- } SpriteTags; ②
- class HelloWorld : public cocos2d::Layer
- {
- public:
- static cocos2d::Scene* createScene();
- virtual bool init();
- virtualvoid onEnter(); ③
- virtualvoid onExit(); ④
- booltouchBegan(cocos2d::Touch* touch, cocos2d::Event* event); ⑤
- void touchMoved(cocos2d::Touch *touch, cocos2d::Event *event); ⑥
- void touchEnded(cocos2d::Touch *touch, cocos2d::Event *event); ⑦
- CREATE_FUNC(HelloWorld);
- };
- #endif // __HELLOWORLD_SCENE_H__
上述代码第①~②行是定义个枚举类型SpriteTags,枚举类型SpriteTags中定义了三个常量,这三个常量对应场景中的三个精灵的标签(Tag)属性。代码第③行声明了层声明周期的onEnter()函数,我们将在该函数中注册监听器和初始化设置。第④行代码是声明了层声明周期的onExit()函数,我们将在该函数中注销监听器和释放一些资源。代码第⑤~⑥行是声明单点触摸事件回调函数。
HelloWorldScene的实现代码HelloWorldScene.ccp文件,它的HelloWorld::init()代码如下:
- bool HelloWorld::init()
- {
- if( !Layer::init() )
- {
- returnfalse;
- }
- SizevisibleSize = Director::getInstance()->getVisibleSize();
- Pointorigin = Director::getInstance()->getVisibleOrigin();
- //贴图的纹理图片宽高必须是2的n次幂,128x128
- autobg = Sprite::create("BackgroundTile.png",
- Rect(0,0, visibleSize.width, visibleSize.height)); ①
- //贴图的纹理参数,水平重复平铺,垂直重复平铺
- Texture2D::TexParamstp = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT}; ②
- bg->getTexture()->setTexParameters(tp); ③
- bg->setPosition(origin+ Point(visibleSize.width/2, visibleSize.height/2));
- addChild(bg,0); ④
- Sprite*boxA = Sprite::create("BoxA2.png"); ⑤
- boxA->setPosition(origin+Point(visibleSize.width/2,visibleSize.height/2) + Point(-120, 120));
- addChild(boxA,10, kBoxA_Tag);
- Sprite*boxB = Sprite::create("BoxB2.png");
- boxB->setPosition(origin+Point(visibleSize.width/2,visibleSize.height/2));
- addChild(boxB,20, kBoxB_Tag);
- Sprite*boxC = Sprite::create("BoxC2.png");
- boxC->setPosition(origin+Point(visibleSize.width/2,visibleSize.height/2) + Point(120, 160));
- addChild(boxC,30, kBoxC_Tag); ⑥
- returntrue;
- }
我们在HelloWorld::init()函数中初始化了场景中的背景和三个方块精灵。代码第①~④行是创建并添加背景,图8-3所示的背景是由一个128x128纹理图片(BackgroundTile.png)反复贴图上,这样可以减少内存消耗,在第①行代码中创建背景精灵对象,注意背景的大小仍然是整个屏幕。第②行代码是设置贴图的纹理的参数,Texture2D::TexParams类型是一个结构体。第③行代码是将参数设置到背景精灵的纹理上。第④行代码是添加背景精灵到当前层。
代码第⑤~⑥行是创建了三个方块精灵,在添加它到当前层的时候我们使用三个参数的addChild(Node* child,int localZOrder,int tag)函数,这样可以通过localZOrder参数指定精灵的显示顺序。
- HelloWorldScene.ccp中的HelloWorld::onEnter()代码如下:
- void HelloWorld::onEnter()
- {
- Layer::onEnter();
- log("HelloWorldonEnter");
- autolistener = EventListenerTouchOneByOne::create(); ①
- listener->setSwallowTouches(true); ②
- listener->onTouchBegan= CC_CALLBACK_2(HelloWorld::touchBegan, this); ③
- listener->onTouchMoved= CC_CALLBACK_2(HelloWorld::touchMoved,this); ④
- listener->onTouchEnded= CC_CALLBACK_2(HelloWorld::touchEnded,this); ⑤
- //添加监听器
- EventDispatcher*eventDispatcher = Director::getInstance()->getEventDispatcher(); ⑥
- eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
- getChildByTag(kBoxA_Tag)); ⑦
- eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(),
- getChildByTag(kBoxB_Tag)); ⑧
- eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(),
- getChildByTag(kBoxC_Tag)); ⑨
- }
上述代码第①行是创建一个单点触摸事件监听器对象。第②行代码是设置是否吞没事件,如果设置为true,那么在onTouchBegan函数返回 true 时吞没事件,事件不会传递给下一个Node对象。第③行代码是设置监听器的onTouchBegan属性回调函数。第④行代码是设置监听器的onTouchMoved属性回调函数。第⑤行代码是设置监听器的onTouchEnded属性回调函数。
代码第⑥~⑨行是添加监听器,其中第⑦行使用精灵显示优先级添加事件监听器,其中参数getChildByTag(kBoxA_Tag)是通过精灵标签Tag实现获得精灵对象。第⑧行和第⑨行代码是为另外两精灵添加事件监听器,其中listener->clone()获得listener对象,使用clone()函数是因为每一个事件监听器只能被添加一次,addEventListenerWithSceneGraphPriority和addEventListenerWithFixedPriority会在添加事件监听器时设置一个注册标识,一旦设置了注册标识,该监听器就不能再用于注册其它事件监听了,因此我们需要使用listener->clone()克隆一个新的监听器对象,把这个新的监听器对象用于注册。
HelloWorldScene.ccp中的触摸事件回调函数代码如下:
- bool HelloWorld::touchBegan(Touch*touch, Event* event) ①
- {
- //获取事件所绑定的 target
- autotarget = static_cast<Sprite*>(event->getCurrentTarget()); ②
- PointlocationInNode = target->convertToNodeSpace(touch->getLocation()); ③
- Sizes = target->getContentSize(); ④
- Rectrect = Rect(0, 0, s.width, s.height); ⑤
- //点击范围判断检测
- if(rect.containsPoint(locationInNode)) ⑥
- {
- log("spritex = %f, y = %f ", locationInNode.x, locationInNode.y);
- log("spritetag = %d", target->getTag());
- target->runAction(ScaleBy::create(0.06f,1.06f)); ⑦
- returntrue; ⑧
- }
- returnfalse;
- }
- void HelloWorld::touchMoved(Touch*touch, Event *event) ⑨
- {
- log("onTouchMoved");
- autotarget = static_cast<Sprite*>(event->getCurrentTarget());
- target->setPosition(target->getPosition()+ touch->getDelta()); ⑩
- }
- void HelloWorld::touchEnded(Touch*touch, Event *event) ⑪
- {
- log("onTouchEnded");
- autotarget = static_cast<Sprite*>(event->getCurrentTarget());
- log("spriteonTouchesEnded.. ");
- PointlocationInNode = target->convertToNodeSpace(touch->getLocation());
- Sizes = target->getContentSize();
- Rectrect = Rect(0, 0, s.width, s.height);
- //点击范围判断检测
- if(rect.containsPoint(locationInNode))
- {
- log("spritex = %f, y = %f ", locationInNode.x, locationInNode.y);
- log("spritetag = %d", target->getTag());
- target->runAction(ScaleTo::create(0.06f,1.0f));
- }
- }
上代码第①行是定义回调函数touchBegan。第②行代码是获取事件所绑定的精灵对象,其中event->getCurrentTarget()语句返回值是Node对象,static_cast<Sprite*>是强制类型转换为Sprite对象。第③行代码是获取当前触摸点相对于target对象的本地坐标。第④行代码是获得target对象的尺寸。第⑤行代码是通过target对象的尺寸创建Rect变量。第⑥行代码rect.containsPoint(locationInNode)是判断是否触摸点在target对象范围。第⑦行代码是放大target对象。第⑧行代码返回true,表示可以回调第⑨行touchMoved函数和第⑪行touchEnded函数。第⑩行代码是移动target对象的位置。
HelloWorldScene.ccp中的HelloWorld::onExit()代码如下:
- void HelloWorld::onExit()
- {
- Layer::onExit();
- log("HelloWorldonExit");
- Director::getInstance()->getEventDispatcher()->removeAllEventListeners();
- }
上述HelloWorld::onExit()函数是退出层时候回调,我们在这个函数中注销所有的监听事件。
提示 多点触摸事件是与具体的平台有关系的,在Win32平台下我们无法测试多点触摸。事实上多点触摸和单点触摸开发流程基本相似,这里我们就不再赘述了。
相关推荐
本资料集合旨在为初学者提供一个全面的cocos2d-x学习路径,从环境搭建到实际项目开发,涵盖了所有必要的知识点。 一、环境配置 在开始cocos2d-x游戏开发之前,你需要先安装和配置一系列的开发工具。这包括但不限于...
一、单点触摸事件处理 1. `onTouchesBegan`: 当用户首次触摸屏幕时,这个回调会被调用。参数是一个`std::vector*>`类型的数组,包含了所有新开始的触摸点。开发者可以遍历这个数组,获取每个触摸点的位置。 2. `...
### cocos2d-x 触摸事件讲解 在游戏开发领域,特别是移动平台上的游戏开发,交互体验至关重要。本文将深入探讨cocos2d-x框架下的触摸事件处理机制,旨在帮助开发者更好地理解和掌握如何通过cocos2d-x实现高质量的...
总之,《cocos2d-x3.2贪吃蛇游戏代码与资源》是学习cocos2d-x引擎的理想实践案例,它涵盖了场景管理、图形绘制、事件处理、资源管理等多个重要知识点,对于初学者来说,通过分析和修改这个游戏的源码,能够深入理解...
例如,`EventListenerTouchOneByOne`用于监听单点触摸事件,当用户点击开始按钮时,触发转轮旋转。 此外,动画是游戏中的关键部分。cocos2d-x提供了`CCAction`类,允许我们创建各种动画效果,如平移、旋转、缩放等...
### Cocos2d-x基础教程知识点详解 #### Cocos2d-x环境搭建 在开始使用Cocos2d-x进行游戏开发之前,需要进行环境的搭建。这部分主要介绍了如何在Windows系统中使用Visual Studio 2008和Cocos2d-x引擎创建HelloWorld...
在cocos2d-x的学习过程中,首先我们需要了解项目的基本结构和入口点。cocos2d-x项目通常包含三个主要文件夹:Classes、Resources和win32。Classes文件夹存储程序的核心源代码,Resources用于存放图像、音频等资源...
### cocos2d-android游戏引擎详解 #### 一、游戏引擎概览 游戏引擎是一套预构建的游戏开发系统,旨在简化游戏开发过程并提高效率。它为开发者提供了丰富的工具集,帮助他们无需从头开始就可以创建游戏。Cocos2d-...
在`Classes`目录下,我们可以学习到Cocos2d-X的几个关键知识点: - `Scene` 类:游戏中的每一个场景,如主菜单、游戏关卡、设置等,都是一个独立的Scene实例。 - `Layer` 类:Scene可以包含多个Layer,Layer是场景的...
这可以通过继承`CCEventListenerTouchOneByOne`类来完成,该类提供了对单点触摸事件的处理。我们需要覆盖其`onTouchBegan`, `onTouchMoved` 和 `onTouchEnded` 方法,以在触摸开始、移动和结束时获取相应的坐标。 1...
在玩手机游戏的时候,屏幕接收我们的触摸消息是必不可少的,根据我们的触摸事件,去实现相应的功能,这里我们就来学习一下cocos2d-x中的触摸是怎么实现的。触摸分为单点触摸和多点触摸,先来看单点触摸,就是接收一...
本话题主要关注的是在Cocos2D-X中处理触摸事件,即单点触摸和多点触摸的实现,并通过实际代码示例进行解析。 首先,我们来看单点触摸。在Cocos2D-X中,触摸事件的处理通常涉及到`cc.Touch`类和`cc.EventTouch`类。...
Cocos2d-x提供了一套完整的事件监听机制,开发者可以通过`EventListenerTouchOneByOne`监听单点触摸事件,当用户点击棋子时,触发相应的响应,如检查并消除匹配的棋子。 在`Classes`文件夹中,我们可能看到包含游戏...
2. **Input Handling**:展示了触摸事件的处理,包括单点触摸、多点触摸以及手势识别,这对于实现游戏的用户交互至关重要。 3. **Physics**:包含使用Box2D物理引擎创建的示例,如物体碰撞、弹性运动和重力效果。 ...
《Cocos2d-x SimpleGame第三章源码详解》 在游戏开发领域,Cocos2d-x是一款广泛应用的跨平台2D游戏引擎,它基于C++,并支持iOS、Android、Windows等多个操作系统。本篇文章将深入探讨使用Cocos2d-x 2.0.4版本开发的...
Cocos2d-x中,`AppDelegate` 类作为应用的入口点,相当于游戏的总导演,控制整个游戏的生命周期。`main.cpp` 文件中的 `_tWinMain` 函数是程序的起点,初始化了`AppDelegate`实例,并通过`CCEGLView`单例来创建并...
在这款强大的工具包中,"cocos demo里的rabbit素材"是一个典型的实例,它展示了如何在Cocos2d-x项目中使用和管理游戏资源。本文将深入探讨这一主题,帮助开发者更好地理解和应用Cocos2d-x中的资源管理,特别是涉及到...
在处理用户输入方面,Cocos2d-x提供了触摸事件监听器。你可以创建一个`EventListenerTouchOneByOne`,监听用户的触摸和拖动操作。当用户触摸屏幕时,人物开始跟随手指移动;当用户松开手指时,你可以应用一个向下的...
Cocos2d-x提供了`EventListenerTouchOneByOne`类来处理单点触摸事件。创建一个事件监听器,然后将它添加到事件调度器中,这样当触摸事件发生时,监听器就会接收到相应的通知。`...