#pragma once #ifndef __CONTROLL_MOVE_H_ #define __CONTROLL_MOVE_H_ #include "cocos2d.h" USING_NS_CC; class ControllMoveLayer :public Layer { public : CREATE_FUNC(ControllMoveLayer); bool init(); void setPlayer(Node *player); private: void update(float dt); bool onTouchBegan(Touch *touch,Event *unused_event); void onTouchCancelled(Touch *touch,Event *unused_event); void onTouchMoved(Touch *touch,Event *unused_event); void onTouchEnded(Touch *touch,Event *unused_event); float mDeltaX; float mDeltaY; Node *mPlayer; bool isControlled; }; #endif
#include "ControllMoveLayer.h" bool ControllMoveLayer::init() { if (!Layer::init()) { return false; } mPlayer = NULL; mDeltaX = 0; mDeltaY = 0; isControlled = false; scheduleUpdate(); return true; } void ControllMoveLayer::setPlayer(Node *player) { if (mPlayer != NULL) { removeChild(player); CC_SAFE_DELETE(player); } mPlayer = player; addChild(player); auto listeScene = EventListenerTouchOneByOne::create(); listeScene->onTouchBegan = CC_CALLBACK_2( ControllMoveLayer::onTouchBegan,this); listeScene->onTouchCancelled = CC_CALLBACK_2 (ControllMoveLayer::onTouchCancelled,this); listeScene->onTouchMoved = CC_CALLBACK_2( ControllMoveLayer::onTouchMoved,this); listeScene->onTouchEnded = CC_CALLBACK_2( ControllMoveLayer::onTouchEnded,this); Director::getInstance()->getEventDispatcher() ->addEventListenerWithSceneGraPHPriority(listeScene,this); } void ControllMoveLayer::update(float dt) { if (mPlayer == NULL) { return; } } bool ControllMoveLayer::onTouchBegan(Touch *touch,Event *unused_event) { auto playerBox = mPlayer->getBoundingBox(); auto touchPos = Director::getInstance() ->convertToGL(touch->getLocationInView()); if (playerBox.containsPoint(touchPos)) { isControlled = true; auto playerPos = mPlayer->getPosition(); mDeltaX = touchPos.x - playerPos.x; mDeltaY = touchPos.y - playerPos.y; return true; } return true; } void ControllMoveLayer::onTouchCancelled(Touch *touch,Event *unused_event) { isControlled = false; } void ControllMoveLayer::onTouchMoved(Touch *touch,Event *unused_event) { if (isControlled) { Point mMovedPos = touch->getLocationInView(); mMovedPos = Director::getInstance()->convertToGL(mMovedPos); Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin(); //記得減去偏移量 float x = mMovedPos.x - mDeltaX; float y = mMovedPos.y - mDeltaY; //x到达屏幕左边界 if (x <= mPlayer->getContentSize().width / 2 + origin.x) x = mPlayer->getContentSize().width / 2 + origin.x; //x到达屏幕右边界 else if (x >= visibleSize.width - mPlayer->getContentSize().width / 2) x = visibleSize.width - mPlayer->getContentSize().width / 2; //y到达屏幕下边界 if (y <= mPlayer->getContentSize().height / 2 + origin.y) y = mPlayer->getContentSize().height / 2 + origin.y; //x到达屏幕上边界 else if (y >= visibleSize.height - mPlayer->getContentSize().height / 2) y = visibleSize.height - mPlayer->getContentSize().height / 2; //飞机跟随手指移动 mPlayer->setPosition(Point(x,y)); } } void ControllMoveLayer::onTouchEnded(Touch *touch,Event *unused_event) { isControlled = false; }