大佬教程收集整理的这篇文章主要介绍了cocos2dx中地图拖拽(任意方向拖拽+固定方向拖拽),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在游戏开发中,经常会碰见需要使用地图拖拽,例如通关关卡地图,可以允许用户拖拽选择进入哪个关卡,那么在cocos2dx中如何来实现呢?请见如下方案。
我们先创建一个精灵:
auto s_map= Sprite::create(s_map_img);
然后将其添加到层中:
this->addChild(s_map,1);
然后开始对触摸添加监听:
auto listener = EventListenerTouchAllAtOnce::create(); listener->onTouchesMoved = CC_CALLBACK_2(test_drag::onTouchesMoved,this); _eventDispatcher->addEventListenerWithSceneGraphpriority(listener,this);
然后我们来写这个回调函数:
void test_drag::onTouchesMoved(const std::vector<Touch*>& touches,Event *event) { auto diff = touches[0]->getDelta(); auto node = getChildByTag(1); auto currentPos = node->getPosition(); node->setPosition(currentPos + diff); }这里我们可以看到首先获取了移动的相对距离diff,然后通过tag获取到了s_map的指针,随后将现在的距离加上移动的相对距离diff,再设置一下精灵的位置即可。
到此时,我们已经可以任意拖拽地图了,那么,如果我们需要限定地图只向指定方向拖拽移动呢,例如,我们的地图只允许往纵向移动,不允许其他方向的移动。这里给出两种方案:
现在我们知道了,支持拖拽的本质就是根据偏移量重新设置精灵的位置,那么,我们可以在这个偏移量上动手脚,先来看第一种方式:
void <span style="font-family: Arial,Helvetica,sans-serif;">test_drag</span>::onTouchesMoved(const std::vector<Touch*>& touches,Event *event) { auto diff = touches[0]->getDelta(); if(diff.x == 0){ auto node = getChildByTag(kTagNodE); auto currentPos = node->getPosition(); node->setPosition(currentPos + diff); } }
void test_drag::onTouchesMoved(const std::vector<Touch*>& touches,Event *event) { auto diff = touches[0]->getDelta(); auto new_diff; new_diff.x = 0; new_diff.y = diff.y; auto node = getChildByTag(kTagNodE); auto currentPos = node->getPosition(); node->setPosition(currentPos + new_diff); }这里,我们定义一个新的偏移量new_diff,使用其获取diff的纵向移动,然后将横向始终设置为0,这样,我们就可以只进行用户纵向的移动了~
以上是大佬教程为你收集整理的cocos2dx中地图拖拽(任意方向拖拽+固定方向拖拽)全部内容,希望文章能够帮你解决cocos2dx中地图拖拽(任意方向拖拽+固定方向拖拽)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。