#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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。