Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView
于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的更多相关文章
- Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色的散步路径
获得所述路径之后.我们将能够使根据的步行路径的作用,当您点击gobutton什么时候.我们呼吁player的startGo()办法.传入的参数是保存路径2一维数组 void GameBaseScene ...
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3
点击下载代码 http://download.csdn.net/detail/lideguo1979/8291803 新建一个类RouteNavigation,定义getPath()方法.用来获取 ...
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1
以下是一些设计略显繁琐,有必要清除思维. 下一个主要的成就,当我们点击Gobutton后,得到一个随机数骰子,是走了几步,它是基于以下步骤行走路径的数目,然后移动位置的基于角色的路径. 流程如图普遍认 ...
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2
在编写获取路径方法前,我们先把角色须要的动画文件载入进来,角色的文件为png 和 plist格式. player1_anim.png.plist player1_anim.pn ...
- cocos2d-x游戏开发系列教程-坦克大战游戏关卡选择场景的编写下
上篇文章写了Paddle类来处理精灵的点击.触摸事件,现在我们在Paddle的基础上 写一个MyPaddle类,来处理上一关.下一关.开始游戏按钮的点击事件. 1.类声明如下: class MyPad ...
- 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
- openresty 前端开发入门五之Mysql篇
openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...
- Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生
一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
随机推荐
- 自定义错误页面mvc用法
原谅我这个新手,对大神们来说这么简单的问题,竟折腾了我一个上午,仅此文章做个记录,供以后备用. 自定义错误页面(custom error pages)在asp.net webform里的配置请看htt ...
- SQL server 2005 PIVOT运算符的使用
原文:SQL server 2005 PIVOT运算符的使用 PIVOT,UNPIVOT运算符是SQL server 2005支持的新功能之一,主要用来实现行到列的转换.本文主要介绍PIVOT运算符的 ...
- MSMQ学习笔记
这几天学习了一下MSMQ,虽然不能说非常深入的了解其机制与实际用法(具体项目的实现),但也要给自己的学习做个总结.学习心得如下: 一.MSMQ即微软消息队列.用于程序之间的异步消息通信,主要的机制就是 ...
- Maven本地仓库配置
一. 为什么配置? 默认情况下,maven的本地仓库在C盘下用户文件夹: .m2/repository.全部的maven构件(artifact)都被存储到该仓库中.以方便重用. 可是放在C盘一个是占用 ...
- C语言求素数的算法
前言 最后一次是出了素数的问题C语言解决题目(面试),当时用了最粗暴的算法.回来细致參考资料,事实上答案有非常多种: 1,小学生版本号: 推断 x 是否为质数,就从 2 一直算到 x-1. stati ...
- 使用IronPython给.Net程序
使用IronPython给.Net程序加点料 开发的时候,经常被策划频繁变动的方案而苦恼.这时候就想要加入点动态语言来辅助一下. 在考虑用动态语言之前也曾想过使用动态加载dll的方式,实现基础接口来调 ...
- TFS:TF30042 数据库已满 处理方法
原文:TFS:TF30042 数据库已满 处理方法 今天早上,公司打来电话,说TFS(Team Foundation Server)微软源代码管理软件签入不了,报错:TF30042 数据库已满. 经过 ...
- html 块状元素 行内元素 内联元素
块状(Block)类型的元素的width默认为100%,而行内(Inline)类型的元素则是根据自身的内容及子元素来决定宽度. 块元素(block element) address - 地址 bloc ...
- MVC的验证 jquery.validate.unobtrusive
jQuery validate 根据 asp.net MVC的验证提取简单快捷的验证方式(jquery.validate.unobtrusive.js) 2013-07-22 19:07 4568人阅 ...
- spring mvc中实现csrf安全防御简记
1.csrf是什么 csrf全称是Cross-site request forgery,http://en.wikipedia.org/wiki/Csrf 危害:使受害用户在不经意间执行了不是用户意愿 ...