zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Django的路由系统
    Django的View(视图)
    Django模板语言相关内容
    pip国内镜像
    TestNG 入门教程
    Spring MVC
    Git:代码冲突常见解决方法
    运行Maven项目时出现invalid LOC header (bad signature)错误,Tomcat不能正常启动
    annotation(@Retention@Target)详解
    JavaWeb:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
  • 原文地址:https://www.cnblogs.com/BlueBeauty/p/3771402.html
Copyright © 2011-2022 走看看