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开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
随机推荐
- How to install PL/SQL developer on linux (转)
PL/SQL developer 在linux上的安装方法工欲善其事必先利其器,PL/SQL和toad对于ORACLE从业人员来说都是很重要的工具,但这些工具都没有linux的发行版,如果要在linu ...
- Error Code: 1318. Incorrect number of arguments for PROCEDURE company.new_procedure; expected 2, got
1.错误叙述性说明 20:27:34 call new_procedure(20150112) Error Code: 1318. Incorrect number of arguments for ...
- MATLAB描绘极坐标图像——polar
polar可用于描绘极坐标图像. 最简单而经常使用的命令格式:POLAR(THETA, RHO) 当中,THETA是用弧度制表示的角度,RHO是相应的半径. 例: a=-2*pi:.001:2*pi ...
- nyoj 7 街区最短路径问题 【数学】
找出横纵坐标的中位数,怎么找:先对x排序找x的中位数x0,再对y排序找y的中位数y0:最后统计各点到中位数点(x0, y0)的总距离: 街区最短路径问题 时间限制:3000 ms | 内存限制:6 ...
- 使用axis公布weblogic(一个)
1.在MyEclipse创建一个新的Web Project.新类,声明函数名称.参数,为了不写功能实体. 2.将java2wsdl.bat将文件复制到classes目录,据内部参数更改自己的实际情况 ...
- Team Foundation Server 2013 Update 3 下载激活
http://www.microsoft.com/zh-cn/download/details.aspx?id=43728 支持的操作系统 Windows 7 Service Pack 1, Wind ...
- Linux在什么样的从脚本文件数据库sh格式改变sql格式
在软件开发过程中,经常参与Linux从下一个脚本文件数据库sh格式改变sql格式问题.在本文中,一个实际的脚本文件,例如.描述格式转换过程. 1. sh文件内容 本文中的文件名称为exa ...
- SqlServer 添加列并赋值
有个需求,需要给某张表添加一列并且赋值,分解需求,一共分两部走: 添加列 赋值 两个功能都不难,很快实现. --add column alter table Med_Summary_Template ...
- Sphinx/Coreseek 4.1 跑 buildconf.sh 一个错误,无法生成configure档
安装前 coorseek 什么时候,遇到一些错误.该官方网站无法看到的解决方案,终于 google 在大牛的博客评论区找到一个解决方案.突然跑到他的膝盖介绍~~ 这里整理是为了方便一些人发现,墙毕竟让 ...
- linux虚拟机网络配制方法及遇到问题的解决方法
linux虚拟机网络问题 刚安装一个vmware虚拟机.并在上面安装了一个redhat linux操作系统. 安装完后配制了下网络. 首先观察windows上的网络配制. ip:192.168.1.1 ...