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();
void menuCloseCallback(cocos2d::Ref* pSender);
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();
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()
{
auto scene = Scene::create();
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
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));
auto menu = Menu::create(closeItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);
auto P1sprite = Sprite::create("CloseNormal.png");
P1sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
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);
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);
_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);
_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::removeAllListener()
{
removeHero1Listener();
removeHero2Listener();
}
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 = touch->getLocation();
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)
{
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)
{
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;
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;
}