于MenuScene.cpp
点击单机游戏后会调用

Director::getInstance()->pushScene(MapChooseScene::createScene());

进入到关卡选择界面,我们採用ScrollView控件制作这个界面

因为scrollview拖动后,位置比較任意,我想是拖动到第二张图片,就完整的显示第二张图片,不要产生偏离位置的现象。所以在移动之后须要进行位置的校正,写了一个adjustScrollView()方法,用来进行该调整。

详细代码例如以下:

MapChooseScene.h内容:

const int  MAP_COUNT = 3;//定义了三张关卡图片
const int TOUCH_DISTANCE = 50; //手势滑动距离 class MapChooseScene : public Layer,public ScrollViewDelegate //使用scrollview须要继承此类
{
…………….
private:
Size visibleSize; Layer* _spritesContainer; //用于存放3张关卡图片的sprite 容器 int currentPage; //当前所在的是第几张关卡地图
Point beginTouchPoint; //触摸按下时的位置
ScrollView *scrollView; //scrollview对象 void singleTouchDown(Object* pSender,Control::EventType event);
void addBackgroundSprite(); //加入背景方法 void addScrollView(); //加入scrollview对象及其包括的sprite
//继承 ScrollViewDelegate 类须要实现的3个方法
void scrollViewDidScroll(ScrollView* view);
void scrollViewDidZoom(ScrollView* view);
void scrollViewMoveOver(ScrollView* view); void adjustScrollView(float distance);//自己定义方法。用来进行拖动后位置调整
void onTouchEnded(Touch*touch,Event *unused_event);
bool onTouchBegan(Touch * touch,Event *unused_event);
void onTouchMoved(Touch *touch,Event *unused_event); };

MapChooseScene.cpp文件内容:

bool MapChooseScene::init()
{
if ( !Layer::init() )
{
return false;
}
visibleSize = Director::getInstance()->getVisibleSize(); currentPage = 1;//默认当前是第一张关卡图片
addBackgroundSprite(); //加入背景 addScrollView();//加入scrollview //加入触摸监听
setTouchMode(Touch::DispatchMode::ONE_BY_ONE); auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan=CC_CALLBACK_2(MapChooseScene::onTouchBegan,this); listener->onTouchMoved=CC_CALLBACK_2(MapChooseScene::onTouchMoved,this);
listener->onTouchEnded=CC_CALLBACK_2(MapChooseScene::onTouchEnded,this); Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,this);
return true;
}

主要来看addScrollView()方法,他的主要功能就是创建3个关卡图片sprite。并加入到Layer类容器spritesContainer对象中。水平排列显示

void MapChooseScene::addScrollView()
{ _spritesContainer = Layer::create(); //创建地图sprite,加入到spritesContainer中
Sprite* beachSprite = Sprite::create(BEACH_ITEM);
Sprite* seaSprite = Sprite::create(SEA_ITEM);
Sprite* moonSprite = Sprite::create(MOON_ITEM); _spritesContainer->addChild(beachSprite);
beachSprite->setPosition(ccpAdd(center, ccp(0, 0))); _spritesContainer->addChild(seaSprite);
seaSprite->setPosition(ccpAdd(center, ccp(visibleSize.width, 0))); _spritesContainer->addChild(moonSprite);
moonSprite->setPosition(ccpAdd(center, ccp(2*visibleSize.width, 0))); _spritesContainer->setPosition(CCPointZero);
_spritesContainer->setContentSize(CCSize(visibleSize.width * MAP_COUNT, visibleSize.height));//容器大小 //进行scrollView对象的创建 并进行相关设置
scrollView = ScrollView::create(); scrollView->setContainer(_spritesContainer);
scrollView->setDirection(ScrollView::Direction::HORIZONTAL);//水平显示
scrollView->setTouchEnabled(true);
scrollView->setPosition(CCPointZero); scrollView->setViewSize(CCSizeMake(visibleSize);//每一个关卡图片显示的大小
scrollView->setContentOffset(CCPointZero,true);
scrollView->setContentSize(CCSize(visibleSize.width * MAP_COUNT, visibleSize.height));//scrollview 大小同spritesContainer同样 scrollView->setDelegate(this); scrollView->setBounceable(false); addChild(scrollView);
}
按下后给beginTouchPoint赋值
bool MapChooseScene::onTouchBegan(Touch * touch,Event *unused_event) {
beginTouchPoint = Director::getInstance()->convertToGL(touch->getLocationInView());
log("touch begain");
return true; }
//触摸结束后,获取触摸距离。并调用图片位置校正方法adjustScrollView
void MapChooseScene::onTouchEnded(Touch*touch,Event *unused_event)
{ Point endPoint = Director::getInstance()->convertToGL(touch->getLocationInView());
float distance = endPoint.x - beginTouchPoint.x;
if(fabs(distance) > TOUCH_DISTANCE)
{
adjustScrollView(distance);
}
}

校正方法。依据触摸滑动的位置距离差值,确认是向左或向右滑动,假设是向左滑动当前页递增,否则递减 。最小值为1 最大值为3

然后依据图片是第几页设置scrollview的Offset ,从而实现位置校正

void MapChooseScene::adjustScrollView(float offset)
{ if (offset<0)
{
currentPage ++;
}else
{
currentPage --;
} if (currentPage <1)
{
currentPage = 1;
} if(currentPage > MAP_COUNT)
{
currentPage = MAP_COUNT;
} CCPoint adjustPos = ccp(- visibleSize.width * (currentPage-1), 0);
scrollView->setContentOffset(adjustPos, true); }

点击下载代码       地址     http://download.csdn.net/detail/lideguo1979/8268033

未完待续..............................

版权声明:本文博主原创文章,博客,未经同意不得转载。

Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView的更多相关文章

  1. Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色的散步路径

    获得所述路径之后.我们将能够使根据的步行路径的作用,当您点击gobutton什么时候.我们呼吁player的startGo()办法.传入的参数是保存路径2一维数组 void GameBaseScene ...

  2. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3

    点击下载代码   http://download.csdn.net/detail/lideguo1979/8291803 新建一个类RouteNavigation,定义getPath()方法.用来获取 ...

  3. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

    以下是一些设计略显繁琐,有必要清除思维. 下一个主要的成就,当我们点击Gobutton后,得到一个随机数骰子,是走了几步,它是基于以下步骤行走路径的数目,然后移动位置的基于角色的路径. 流程如图普遍认 ...

  4. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2

    在编写获取路径方法前,我们先把角色须要的动画文件载入进来,角色的文件为png 和 plist格式. player1_anim.png.plist             player1_anim.pn ...

  5. cocos2d-x游戏开发系列教程-坦克大战游戏关卡选择场景的编写下

    上篇文章写了Paddle类来处理精灵的点击.触摸事件,现在我们在Paddle的基础上 写一个MyPaddle类,来处理上一关.下一关.开始游戏按钮的点击事件. 1.类声明如下: class MyPad ...

  6. 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...

  7. 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

    [COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...

  8. openresty 前端开发入门五之Mysql篇

    openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...

  9. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

随机推荐

  1. UITabBarController详细说明(简介和设置)

    [objc] view plaincopy - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions ...

  2. Android Studio 1.0 苹果电脑安装配置

    ​ 前言 近日Google终于不负众望,发布了期待已久的Android Studio 1.0正式版.小编自己是Android开发者,之前使用过Eclipse,也试用过Android Studio 0. ...

  3. 1!到n!的和

    Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 23  Solved: 14 [Submit][Status][Web Board] Descriptio ...

  4. MyReport报表引擎2.0.0.0新功能

    Web报表引擎:Web上的良好的打印解决方式,WinForm的打印预览体现,报表自己主动化,支持直接打印,页小计,统计,转成金额大写,一维码显示等功能,满足中国式报表的常见功能需求.Web报表编辑器: ...

  5. IDF - CTF - 牛刀小试

    找学校CTF好地方,IDF实验室CTF训练营(http://ctf.idf.cn/). . 刚接触CTF.来玩下牛刀小试.AK了. . 好爽好爽.. 1.摩斯password 嘀嗒嘀嗒嘀嗒嘀嗒 时针它 ...

  6. 纯洁CSS实现下拉菜单和下拉容器(纯洁CSS导航栏和导航下拉容器)

    虽然网上课程似即使案件大同小异,但我还是写,记笔记,也为您提供参考 我希望你能指导批评~~ 首先,我们必须列出ul li 开始我们的导航栏菜单也能说生产: 在下面的页面,我们先建XHTML结构体: & ...

  7. android 如何将电话簿SDN数字和其他普通的数字混合在一起?

    最初的设计将默认SDN单独分出来,副标题"SDN". 下面的变化可以通过例如实现SDN并安排普通相同数量在一起,按字母顺序排列. DefaultContactListAdapter ...

  8. DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息

    原文:DBA工具--DMV--通过sys.dm_exec_procedure_stats查看存储过程执行信息 对于DBA来说,经常要手机存储过程的某些信息: 执行了多少次 执行的执行计划如何 执行的平 ...

  9. android:GLSurfaceView绘制bitmap图片及glViewport调整的效果

    首先看一下GLSurfaceView是怎样绘制的.正如android开发文档中描写叙述的那样,我们须要new一个GLSurfaceView对象,然后设置一个实现了Renderer接口的对象,我们须要写 ...

  10. C++学习笔记36 (模板的细节明确template specialization)和显式实例(template instantiation)

    C++有时模板很可能无法处理某些类型的. 例如: #include <iostream> using namespace std; class man{ private: string n ...