3.9触摸事件分发的例子-选择英雄图标,切换对应英雄,控制其移动。

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;
}

猜你喜欢

转载自blog.csdn.net/u012839224/article/details/54236764