您的位置:首页 > 移动开发 > Cocos引擎

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d