cocos::触摸跟随移动
发布时间:2020-12-14 16:59:44 所属栏目:百科 来源:网络整理
导读:#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
#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;
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
