3.9触摸事件分发的例子-选择英雄图标,切换对应英雄,控制其移动。
2017-01-08 20:57
746 查看
HelloWorldScene.h
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" USING_NS_CC; class HelloWorld : public cocos2d::Layer { public: static cocos2d::Scene* createScene(); virtual bool init(); // a selector callback void menuCloseCallback(cocos2d::Ref* pSender); // implement the "static create()" method manually CREATE_FUNC(HelloWorld); //精灵-英雄选择图标 Sprite* Hero1Sprite; Sprite* Hero2Sprite; //监听器 EventListenerTouchOneByOne* Hero1Listener; EventListenerTouchOneByOne* Hero2Listener; EventListenerTouchOneByOne* LayerListener; protected: //触摸结束后写响应逻辑 bool Hero1onTouchBegan(Touch *touch, Event *event); void Hero1onTouchEnded(Touch* touch, Event* event); bool Hero2onTouchBegan(Touch* touch, Event* event); void Hero2onTouchEnded(Touch* touch, Event* event); bool LayeronTouchBegan(Touch* touch, Event* event); void LayeronTouchEnded(Touch* touch, Event* event); void setHero1Listener(); void setHero2Listener(); void setLayerListener(); void removeAllListener(); void removeHero1Listener(); void removeHero2Listener(); void removeLayerListener(); //Sprite* P1sprite; //Sprite* P2sprite; // bool _Hero1MoveEnable; bool _Hero2MoveEnable; //英雄移动速度控制 float caculateTime(Point point); enum { P1TagSprite = 1, P2TagSprite = 2 }; }; #endif // __HELLOWORLD_SCENE_H__
HelloWorld.cpp
#include "HelloWorldScene.h" USING_NS_CC; Scene* HelloWorld::createScene() { // 'scene' is an autorelease object auto scene = Scene::create(); // 'layer' is an autorelease object auto layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); //auto layer1 = LayerColor::create(Color4B(0, 128, 128, 255)); //layer1->setContentSize(CCSizeMake(120, 80)); //layer1->setPosition(Point(50, 50)); //layer->addChild(layer1, 10); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); ///////////////////////////// // 2. add a menu item with "X" image, which is clicked to quit the program // you may modify it. // add a "close" icon to exit the progress. it's an autorelease object auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 , origin.y + closeItem->getContentSize().height/2)); // create menu, it's an autorelease object auto menu = Menu::create(closeItem, NULL); menu->setPosition(Vec2::ZERO); this->addChild(menu, 1); ///////////////////////////// // 3. add your codes below... // add a label shows "Hello World" // create and initialize a label //auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24); // position the label on the center of the screen //label->setPosition(Vec2(origin.x + visibleSize.width/2, // origin.y + visibleSize.height - label->getContentSize().height)); // add the label as a child to this layer //this->addChild(label, 1); // add "HelloWorld" splash screen" auto P1sprite = Sprite::create("CloseNormal.png"); // position the sprite on the center of the screen P1sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); // add the sprite as a child to this layer this->addChild(P1sprite, 0,P1TagSprite); auto P2sprite = Sprite::create("CloseSelected.png"); P2sprite->setPosition(Vec2(visibleSize.width / 2 + origin.x+50, visibleSize.height / 2 + origin.y-50)); this->addChild(P2sprite,1,P2TagSprite); //P2sprite->setVisible(false); //Hero1 选择图标 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Hero_select_icon.plist"); Hero1Sprite = Sprite::createWithSpriteFrameName("Hero1_unSelected.png"); Hero1Sprite->setPosition(Vec2(0 + 25, visibleSize.height - 25)); this->addChild(Hero1Sprite,999); Hero1Sprite->setName("inactive"); Hero2Sprite = Sprite::createWithSpriteFrameName("Hero2_unSelected.png"); Hero2Sprite->setPosition(Vec2(0 + 25, visibleSize.height - 125)); this->addChild(Hero2Sprite,999); Hero2Sprite->setName("inactive"); setHero1Listener(); setHero2Listener(); setLayerListener(); return true; _Hero1MoveEnable = true; _Hero2MoveEnable = true; } void HelloWorld::menuCloseCallback(Ref* pSender) { Director::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif } void HelloWorld::setHero1Listener() { Hero1Listener = EventListenerTouchOneByOne::create(); Hero1Listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::Hero1onTouchBegan, this); Hero1Listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::Hero1onTouchEnded, this); //auto P1Sprite = getChildByTag(P1TagSprite); //_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, P1Sprite); //Hero1Listener->setSwallowTouches(true); _eventDispatcher->addEventListenerWithSceneGraphPriority(Hero1Listener, Hero1Sprite); } void HelloWorld::setHero2Listener() { Hero2Listener = EventListenerTouchOneByOne::create(); Hero2Listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::Hero2onTouchBegan, this); Hero2Listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::Hero2onTouchEnded, this); //Hero2Listener->setSwallowTouches(true); _eventDispatcher->addEventListenerWithSceneGraphPriority(Hero2Listener, Hero2Sprite); } void HelloWorld::setLayerListener() { LayerListener = EventListenerTouchOneByOne::create(); LayerListener->onTouchBegan = CC_CALLBACK_2(HelloWorld::LayeronTouchBegan, this); LayerListener->onTouchEnded = CC_CALLBACK_2(HelloWorld::LayeronTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(LayerListener, this); } void HelloWorld::removeHero1Listener() { if (Hero1Listener != NULL) _eventDispatcher->removeEventListener(Hero1Listener); } void HelloWorld::removeHero2Listener() { if (Hero2Listener != NULL) _eventDispatcher->removeEventListener(Hero2Listener); } /* void HelloWorld::removeLayerListener() { if (LayerListener != NULL) _eventDispatcher->removeEventListener(LayerListener); } */ void HelloWorld::removeAllListener() { removeHero1Listener(); removeHero2Listener(); // removeLayerListener(); } bool HelloWorld::Hero1onTouchBegan(Touch *touch, Event *event) { return true; } bool HelloWorld::Hero2onTouchBegan(Touch* touch, Event* event) { return true; } bool HelloWorld::LayeronTouchBegan(Touch* touch, Event* event) { return true; } void HelloWorld::Hero1onTouchEnded(Touch* touch, Event* event) { // CCLOG("Touch Hero1Sprite"); auto target = static_cast<Sprite*>(event->getCurrentTarget()); //判断是否点击到写法一; // Point locationInNode = target->convertTouchToNodeSpace(touch); // Size size = target->getContentSize(); // Rect rect = Rect(0, 0, size.width, size.height); //判断是否点击到写法二; Point locationInNode = touch->getLocation(); Rect rect = target->getBoundingBox(); //Rect rect = target->getBoundingBox(); if (rect.containsPoint(locationInNode)) { _Hero1MoveEnable = false; _Hero2MoveEnable = false; if (Hero1Sprite->getName() == "inactive") { Hero1Sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hero1_Selected.png")); Hero1Sprite->setName("active"); //改变另一个英雄选择状态 Hero2Sprite->setName("inactive"); Hero2Sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hero2_unSelected.png")); } else { Hero1Sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hero1_unSelected.png")); Hero1Sprite->setName("inactive"); } } else { if ((Hero1Sprite->getName() == "active") && (Hero2Sprite->getName() == "inactive")) _Hero1MoveEnable = true; else _Hero1MoveEnable = false; } CCLOG("Hero1Part: _Hero1MoveEnable = %d", _Hero1MoveEnable); } void HelloWorld::Hero2onTouchEnded(Touch* touch, Event* event) { //_HeroMoveEnable = true; CCLOG("Touch Hero2Sprite"); auto target = static_cast<Sprite*>(event->getCurrentTarget()); Point LocationInNode = target->convertTouchToNodeSpace(touch); Size size = target->getContentSize(); Rect rect = Rect(0, 0, size.width, size.height); if (rect.containsPoint(LocationInNode)) { _Hero1MoveEnable = false; _Hero2MoveEnable = false; if (Hero2Sprite->getName() == "inactive") { Hero2Sprite->setName("active"); Hero2Sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hero2_Selected.png")); Hero1Sprite->setName("inactive"); Hero1Sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hero1_unSelected.png")); } else if (Hero2Sprite->getName() == "active") { Hero2Sprite->setName("inactive"); Hero2Sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hero2_unSelected.png")); } } else { if ((Hero1Sprite->getName() == "inactive") && (Hero2Sprite->getName() == "active")) _Hero2MoveEnable = true; else _Hero2MoveEnable = false; } CCLOG("Hero2Part: _Hero2MoveEnable = %d", _Hero2MoveEnable); } //移动目标 void HelloWorld::LayeronTouchEnded(Touch* touch, Event* event) { //auto target = static_cast<Sprite*>(event->getCurrentTarget()); //Point locationInNode = target->convertTouchToNodeSpace(touch); //Size size = target->getContentSize(); //Rect rect = Rect(0, 0, size.width, size.height); //if (rect.containsPoint(locationInNode)) //{ //P2sprite->setPosition(this->getPosition() + ccp(random(-240,240), random(-160,160))); //P2sprite->setVisible(true); //log("Is contains point random =%d",random(10,50)); //} //else{ //log("Not contains point"); //} //Point locationInNode = convertTouchToNodeSpace(touch); //auto moveto = MoveTo::create(caculateTime(locationInNode),locationInNode); //移动精灵 if (_Hero1MoveEnable == true) { auto P1Sprite = getChildByTag(P1TagSprite); P1Sprite->stopAllActions(); Point location = touch->getLocation(); CCLOG("location.x=%f , location.y=%f", location.x, location.y); auto moveto = MoveTo::create(caculateTime(location), location); P1Sprite->runAction(moveto); } else if (_Hero2MoveEnable == true) { auto P2Sprite = getChildByTag(P2TagSprite); P2Sprite->stopAllActions(); Point location = touch->getLocation(); CCLOG("location.x=%f , location.y=%f", location.x, location.y); auto moveto = MoveTo::create(caculateTime(location), location); P2Sprite->runAction(moveto); } } float HelloWorld::caculateTime(Point point) { float moveTime; //moveTime = abs(point.getDistance(this->getPosition()) )/ 100; if (_Hero1MoveEnable == true) { auto P1Sprite = getChildByTag(P1TagSprite); moveTime = point.getDistance(P1Sprite->getPosition()) / 100; } else if (_Hero2MoveEnable == true) { auto P2Sprite = getChildByTag(P2TagSprite); moveTime = point.getDistance(P2Sprite->getPosition()) / 100; } CCLOG("moveTime = %f", moveTime); char str[30]; sprintf(str, "moveTime = %f", moveTime); //CCLOG("str mod of moveTime = %s", str); CCLOG("str mod of moveTime = %s", str); removeChildByTag(666); auto label = Label::createWithTTF(str, "fonts/arial.ttf", 24); // position the label on the center of the screen Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); label->setTag(666); label->setPosition(Vec2(origin.x + visibleSize.width/2, origin.y + visibleSize.height - label->getContentSize().height)); // add the label as a child to this layer this->addChild(label, 1); return moveTime; }
相关文章推荐
- cocos2dx骨骼动画Armature源码剖析(一)
- cocos2dx骨骼动画Armature源码剖析(二)
- 剖析iOS开发中Cocos2d-x的内存管理相关操作
- 详解iOS游戏开发中Cocos2D的坐标位置关系
- iOS 5 cocos2d 游戏开发 3ff8 实战:第4章 你的第一个游戏
- quick-cocos2d-x for mac开发环境安装配置
- 阅读 KBEngine 要理清的问题
- KBEngine 编译、运行、调试
- KBEngine Cocos2d JS 客户端启动过程
- KBEngine 客户端-loginapp-协议加载
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- Cocos Studio的动画系统介绍
- OGEngine新版发布,推开发者服务平台
- Cocos2d 中 fnt文件生产工具 Bitmap Font Generator
- CCLOG调试方法与参数说明
- 你的第一个cocos2d游戏