cocos2d-x開發 之 地圖拖動

先看看效果

在cocos2d-x引擎中,層有以下的虛函數觸摸響應函數

    //觸摸開始(也就是人們第一次觸摸屏幕的點)
    virtual bool onTouchBegan(Touch * touch, Event * unused_envent);
    //觸摸過程中(移動過程中的觸摸點)
    virtual void onTouchMoved(Touch * touch, Event * unused_envent);
    //結束點
    virtual void onTouchEnded(Touch * touch, Event * unused_envent);
    virtual void onTouchCancelled(Touch * touch, Event * unused_envent);

在層的設置中進行自己想要的觸摸響應事件,如層的拖動

首先,我們腦海中想的是我們在玩遊戲時,如王者榮耀的拖動視角

1.人觸摸一個點(onTouchBegan),記錄層座標以及觸摸點的座標(getPosition獲取層的座標和touch->getLocation獲得觸摸點座標)

2.根據這個點的實時移動(onTouchMoved)做出相應的動作(拖動)

3.其中有一些算法,如拖動使用的是:開始時本身層的座標點+(移動時的座標點-移動開始時的座標點)= 拖動效果。

話不多少,看看代碼吧:

頭文件

#ifndef LayerDemo_h
#define LayerDemo_h
#include "cocos2d.h"
using namespace cocos2d;

class LayerDemo : public Layer
{
public:
    CREATE_FUNC(LayerDemo);
    virtual bool init();
    virtual bool onTouchBegan(Touch * touch, Event * unused_envent);
    virtual void onTouchMoved(Touch * touch, Event * unused_envent);
    virtual void onTouchEnded(Touch * touch, Event * unused_envent);
    virtual void onTouchCancelled(Touch * touch, Event * unused_envent);
    //層的精靈
    Sprite * sprite_3;
    //記錄開始觸摸的點
    Point touch_began;
    //滑動過程中的點
    Point touch_p;
    //記錄觸摸開始的層的座標。
    Vec2 p;
};

#endif /* LayerDemo_h */

cpp文件

#include "LayerDemo.h"
#include <iostream>
using namespace std;
bool LayerDemo::init()
{
    if(!Layer::init())
    {
        return false;
    }
    auto visitable = Director::getInstance()->getVisibleSize();
    this->setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
    this->setTouchEnabled(true);
    sprite_3 = Sprite::create("diban.jpg");
    sprite_3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
    sprite_3 ->setPosition(Director::getInstance()->getVisibleSize()/2 + Size(0,49.3));
    sprite_3->setScale((visitable.width / sprite_3->getContentSize().width)* 2, visitable.height / sprite_3->getContentSize().height);
    this->addChild(sprite_3);
    //初始化
    touch_p = Vec2(0,0);
    touch_began =Vec2(0,0);
    return true;
}

//觸摸開始
bool LayerDemo::onTouchBegan(Touch *touch, Event *unused_envent)
{
    CCLOG("Touch Began");
    p = sprite_3->getPosition();
    touch_began = touch->getLocation();
    cout << touch_began.x << endl;
    return true;
}

//觸摸按下
void LayerDemo::onTouchMoved(Touch *touch, Event *unused_envent)
{
    CCLOG("Touch Moved");
    touch_p = touch->getLocation();
    //存在邊界
    if(p.x + (touch_p.x - touch_began.x) >= 0 && p.x + (touch_p.x - touch_began.x) <= Director::getInstance()->getVisibleSize().width)
        {
              sprite_3->setPositionX(p.x + (touch_p.x - touch_began.x));
        }
    cout << touch_p.x << endl;
}

//觸摸消失
void LayerDemo::onTouchEnded(Touch *touch, Event *unused_envent)
{
    CCLOG("Touch Ended");
   
}

void LayerDemo::onTouchCancelled(Touch *touch, Event *unused_envent)
{
    CCLOG("Touch Cancelled");
   
}

快去自己試試吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章