创建一个项目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在判断滑动的方向后会调用相应的方法。到此手势滑动的框架就搭建完成。
最后还是上一张图: