02--2048实例搭建滑动框架

          创建一个项目Number2048(创建项目文章文章中新建了一个批处理文件很有用,再次记录一下),然后清除不必要的代码。

@echo off
:label1
@cls
echo 欢迎使用Python创建Cocos2d-x工程
set /p project=请输入需要创建的工程名:
set /p aID=请输入需要创建的android版本包标识名:
echo 您输入的工程名为%project%
echo 您输入的android版本包标识名为%aID%
echo 确认创建工程吗?
CHOICE /C 123 /M "确认请按 1,取消请按 2,或者退出请按 3。"
echo %errorlevel%
if %errorlevel%==1 goto label2
if %errorlevel%==2 goto label1
if %errorlevel%==3 goto label3
:label2
echo 正在创建工程...
python create_project.py -project %project% -package %aID% -language cpp
:label3
pause

修改HelloWorldScene头文件如下:

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

using namespace cocos2d;  // 需要的

class HelloWorld : public cocos2d::CCLayer
{
public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();  

    // there's no 'id' in cpp, so we recommend returning the class instance pointer
    static cocos2d::CCScene* scene();
    
  
    // implement the "static node()" method manually
    CREATE_FUNC(HelloWorld);

    //这里得到起点和终点就可以判断滑动方向,所以Move回调不用处理
    virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);

    //滑动后要做到事情在这里
    void doUp();
    void doDown();
    void doLeft();
    void doRight();
    //判断滑动的方向
    void determineDirection();

private :
    //记录起点和终点的变量
    int startX , startY , endX , endY;
};

#endif // __HELLOWORLD_SCENE_H__

在头文件中声明了要使用到的触屏回调和几个函数以及记录滑动的起点和终点的变量;接下来就要实现滑动的回调函数,修改cpp如下

#include "HelloWorldScene.h"

using namespace cocos2d;

CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();
    
    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }
    //打开触屏功能
    setTouchEnabled(true);

    return true;
}


void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent){
    CCSetIterator iter = pTouches->begin();
    for (; iter!=pTouches->end(); iter++) {
        CCTouch * pTouch=(CCTouch * )(* iter);
        CCPoint loaction = pTouch->getLocation();
        startX = loaction.x;
        startY = loaction.y;
        CCLog("pTouch start :x=%f , y=%f",loaction.x ,loaction.y);
    }
}

void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent){
    CCSetIterator iter = pTouches->begin();
    for (;iter!=pTouches->end();iter++)
    {
        CCTouch* pTouch=(CCTouch*)(*iter);
        CCPoint location = pTouch->getLocation();
        endX = location.x;
        endY = location.y;
        CCLog("pTouch end :x=%f , y=%f",location.x ,location.y);
    }

    determineDirection();
}

void HelloWorld::determineDirection()
{
    if(abs(startX-endX)>abs(startY-endY)) //左右滑动
    {
        if(startX < endX)   //向右滑动
            doLeft();
        else
            doRight();
    }
    else     //上下滑动
    {
        if(startY < endY)  //向上滑动
            doUp();
        else
            doDown();
    }
}

void HelloWorld::doUp()
{
    CCLog("doUp");
}
void HelloWorld::doDown()
{
    CCLog("doDown");
}
void HelloWorld::doLeft()
{
    CCLog("doLeft");
}
void HelloWorld::doRight(){
    CCLog("doRight");
}

这个地方我使用的是多点触屏回调,在获取滑动起点和终点的是有点繁琐,看前人的文章使用的单点触屏回调感觉代码要清爽很多,这也是引擎设计者这样设计的原因之一。多点触屏虽然能完全实现单点触屏操作,但单点触屏也有它的长处。

在触屏开始和结束回调中分别记录下起点和终点的x和y坐标到成员变量中。然后在触屏结束回调中调用determineDirection方法判断滑动的方向。determineDirection在判断滑动的方向后会调用相应的方法。到此手势滑动的框架就搭建完成。

最后还是上一张图:

image

原文地址:https://www.cnblogs.com/BlueBeauty/p/3771402.html