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

cocos2dx中地图拖拽(任意方向拖拽+固定方向拖拽)

发布时间:2020-12-14 20:13:12 所属栏目:百科 来源:网络整理
导读:在游戏开发中,经常会碰见需要使用地图拖拽,例如通关关卡地图,可以允许用户拖拽选择进入哪个关卡,那么在cocos2dx中如何来实现呢?请见如下方案。 我们先创建一个精灵: auto s_map= Sprite::create(s_map_img); s_map_img是纹理图片路径,我们创建了一个s

在游戏开发中,经常会碰见需要使用地图拖拽,例如通关关卡地图,可以允许用户拖拽选择进入哪个关卡,那么在cocos2dx中如何来实现呢?请见如下方案。

我们先创建一个精灵:

auto s_map= Sprite::create(s_map_img);

s_map_img是纹理图片路径,我们创建了一个s_map的地图精灵。

然后将其添加到层中:

this->addChild(s_map,1);

将其添加到层中,并设置一个tag:1。

然后开始对触摸添加监听:

auto listener = EventListenerTouchAllAtOnce::create();
listener->onTouchesMoved = CC_CALLBACK_2(test_drag::onTouchesMoved,this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);

这里我们创建了一个listener,对其绑定了一个触摸移动的监听,回调函数为test_drag(自己测试随便写的类)的成员函数onTouchesMoved。

然后我们来写这个回调函数:

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);
    }
}

我们可以检查一下diff的x的大小,如果为0,则表示没有横向的移动,就执行移动操作,这样可以保证只进行纵向的移动。这种方式其实不太好,因为有些时候我们滑动的时候并不是那么绝对的纵向,可能会偏一点点横向,对于这类情况,请看第二种方案:
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,这样,我们就可以只进行用户纵向的移动了~

(编辑:李大同)

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

    推荐文章
      热点阅读