- 说在前面
操作系统:win10 64位
vs版本:2017
python版本:2.7
Cocos2d-x版本:3.17
- 运行结果
(这是个gif)
- 代码
PlaneSprite.h
#include "cocos2d.h"
#include "ui\CocosGUI.h"
typedef enum tagPlaneState
{
kPaddleStateGrabbed,//精灵被选中
kPaddleStateUngrabbed//未被选中
} PlaneState;
//继承自Sprite\Clonable
class PlaneSprite : public cocos2d::Sprite, public cocos2d::Clonable
{
PlaneState _state;//精灵状态
public:
PlaneSprite(void);
virtual ~PlaneSprite(void);
cocos2d::Rect getRect();
bool initWithTexture(cocos2d::Texture2D* aTexture) override;//重载初始化函数
virtual void onEnter() override;
virtual void onExit() override;
bool containsTouchLocation(cocos2d::Touch* touch);
bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);//三个触摸事件
void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event);
void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event);
virtual PlaneSprite* clone() const override;//重载clone函数
static PlaneSprite* createWithTexture(cocos2d::Texture2D* aTexture);
};
PlaneSprite.cpp
实现方法,可以在onTouchxxx函数中定义对应的响应事件
#include "PlaneSprite.h"
#include "Global.h"
USING_NS_CC;
PlaneSprite::PlaneSprite(void)
{
}
PlaneSprite::~PlaneSprite(void)
{
}
Rect PlaneSprite::getRect()
{
auto s = getTexture()->getContentSize();
return Rect(-s.width / 2, -s.height / 2, s.width, s.height);
}
PlaneSprite* PlaneSprite::createWithTexture(Texture2D* aTexture)
{
PlaneSprite* pPlaneSprite = new (std::nothrow) PlaneSprite();
pPlaneSprite->initWithTexture(aTexture);
pPlaneSprite->autorelease();
return pPlaneSprite;
}
bool PlaneSprite::initWithTexture(Texture2D* aTexture)
{
if (Sprite::initWithTexture(aTexture))
{
_state = kPaddleStateUngrabbed;
}
return true;
}
void PlaneSprite::onEnter()
{
Sprite::onEnter();
// Register Touch Event
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(PlaneSprite::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(PlaneSprite::onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(PlaneSprite::onTouchEnded, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
}
void PlaneSprite::onExit()
{
// auto director = Director::getInstance();
// director->getTouchDispatcher()->removeDelegate(this);
Sprite::onExit();
}
bool PlaneSprite::containsTouchLocation(Touch* touch)
{
return getRect().containsPoint(convertTouchToNodeSpaceAR(touch));
}
bool PlaneSprite::onTouchBegan(Touch* touch, Event* event)
{
//CCLOG("Paddle::onTouchBegan id = %d, x = %f, y = %f", touch->getID(), touch->getLocation().x, touch->getLocation().y);
if (_state != kPaddleStateUngrabbed) return false;
if (!containsTouchLocation(touch)) return false;
_state = kPaddleStateGrabbed;
//CCLOG("return true");
return true;
}
void PlaneSprite::onTouchMoved(Touch* touch, Event* event)
{
//CCLOG("Paddle::onTouchMoved id = %d, x = %f, y = %f", touch->getID(), touch->getLocation().x, touch->getLocation().y);
CCASSERT(_state == kPaddleStateGrabbed, "Paddle - Unexpected state!");
auto touchPoint = touch->getLocation();
setPosition(Vec2(touchPoint.x, touchPoint.y));
}
PlaneSprite* PlaneSprite::clone() const
{
PlaneSprite* ret = PlaneSprite::createWithTexture(_texture);
ret->_state = _state;
ret->setPosition(getPosition());
ret->setAnchorPoint(getAnchorPoint());
return ret;
}
void PlaneSprite::onTouchEnded(Touch* touch, Event* event)
{
CCASSERT(_state == kPaddleStateGrabbed, "Paddle - Unexpected state!");
_state = kPaddleStateUngrabbed;
}
SetPlaneScene.cpp
在场景中生成自定义的PlaneSprite ,与cocos2d::Sprite使用方法类似;
#include "SetPlaneScene.h"
#include "PlaneSprite.h"
USING_NS_CC;
Scene* SetPlaneScene::createScene()
{
auto scene = Scene::create();
auto layer = SetPlaneScene::create();
scene->addChild(layer);
return scene;
}
// on "init" you need to initialize your instance
bool SetPlaneScene::init()
{
if (!Scene::init())
{
return false;
}
auto visibleSize = Director::getInstance()->getVisibleSize();
//设置背景(精灵)为白色
CCSprite* spBack = CCSprite::create("back.jpg");
spBack->setPosition(visibleSize.width / 2, visibleSize.height / 2);
spBack->setAnchorPoint(Point(0.5, 0.5));
this->addChild(spBack);
auto planeTexture = Director::getInstance()->getTextureCache()->addImage("lplane.png");
PlaneSprite* PlaneSp1 = PlaneSprite::createWithTexture(planeTexture);
PlaneSp1->setPosition(visibleSize.width / 2, 0.1f * visibleSize.height);//设置初始位置
PlaneSp1->setAnchorPoint(Point(0.4, 0.5));//设置锚点
this->addChild(PlaneSp1);
return true;
}