加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读