cocos::触摸跟随移动

来源:互联网 发布:苹果的c语言编程软件 编辑:程序博客网 时间:2024/05/17 07:51
#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;}


0 0