于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

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

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

转载于:https://www.cnblogs.com/mengfanrong/p/4886160.html

Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView相关推荐

  1. Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-关卡选择ScrollView

    在MenuScene.cpp 点击单机游戏后会调用 Director::getInstance()->pushScene(MapChooseScene::createScene()); 进入到关 ...

  2. Cocos2d-x 3.2 大富翁游戏项目开发-第二十八部分 游戏保存和载入存档游戏

    1.游戏保存 如图,在右下角增加保存图标,点击后进行游戏的保存. 游戏保存采用json格式,具体如下: {"map_level":2, // 游戏关卡"gameRound ...

  3. Cocos2d-x 3.2 大富翁游戏项目开发-第三部分 菜单场景

    上一部分介绍到片头动画介绍后进入到菜单场景,场景效果如图 MenuScene.h头文件如下: class MenuScene : public LayerColor { public:static S ...

  4. Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色按路径行走

    路径获得之后,我们就可以让角色按照路径行走了,当点击go按钮的时候,我们调用player的startGo()方法,传入的参数就是保存了路径的2个一维数组 void GameBaseScene::goB ...

  5. Cocos2d-x 3.2 大富翁游戏项目开发

    第一部分开工大吉 大富翁游戏以前采用了AndEngine引擎开发,由于该引擎的天生缺陷,不支持跨平台,只能在Android设备上运行,所以刻苦研究C++ ,搜罗关于Cocos2d-x 的资料,终于把C ...

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

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

  7. Cocos2d-x 3.2 大富翁游戏项目开发-第三十部分 项目移植

    本人只有android设备,没有苹果,无法测试,就不说怎么移植到苹果了.能力有限,请各位见谅 首先调整屏幕适配 修改AppDelegate.cpp文件 //glview->setFrameSiz ...

  8. Cocos2d-x 3.2 大富翁游戏项目开发-第二十六部分 人物技能

    本节主要是添加人物技能,技能包括 暴风骤雨:此技能可以把地块变成空白地块, 随心步:  选择想走的步数,想走几步走几步 巧取豪夺:把对手的土地变成自己的 技能包含的信息:等级 和 耗费体力  等级共5 ...

  9. Cocos2d-x 3.2 大富翁游戏项目开发-第二十五部分 大富翁股市

    当角色走到股市图标时,进入股市界面.每走完一个回合,增加一条股票数据, 股市界面上半部分显示股票信息,包括代码,名称,当前价格,买入价格,涨跌百分比,角色持有的股票数量 下半部分显示股票价格走势,当点 ...

最新文章

  1. 真实,假期无限延长后的研究生们的生活~
  2. 使用idea 在springboot添加本地jar包的方法 部署的时候本地jar没有包含的解决方法
  3. 黑马在线教育项目---15-16、datatables插件
  4. PHP7.0 Window10 Redis安装教程
  5. 英伟达宣布全面支持ARM高性能计算,三周打造全球排名第22超算
  6. vim的配置安装和Python安装细节记录20190109
  7. LL-verilog索引向量+-号用法
  8. Inflater与findViewById()区别
  9. 计算机合计功能,Javascript自动求和,Javascript自动合计
  10. 最近一个快要结束的项目的BUG分析
  11. 初识STM32F407芯片
  12. 安卓Android问卷调查系统app
  13. CCS中CMD文件详解
  14. 解决 chrome 访问 https 网站出现“您的连接不是私密的问题”
  15. Skywalking链路追踪自身耗时和总耗时算法分析
  16. linux文件同步方法,inotify + rsync实现linux文件实时同步
  17. java数字金额大写金额_Java实现 “ 将数字金额转为大写中文金额 ”
  18. 两阶段鲁棒优化程序 采用微网为模型,主要将安装成本、运营成本以及综合效益三个方面纳入考虑范围
  19. 一天写多少行代码才算是好程序员?
  20. QT解决报错registered using qRegisterMetaType()

热门文章

  1. 上市首日市值超过福特汽车,Rivian能否成下一个“特斯拉”?
  2. QQMusic.exe竟然占用了8080端口
  3. 《浪潮之巅》与我的职业选择
  4. WPF 闹钟定时弹出提醒窗口
  5. 用海龟画图画一个写轮眼
  6. ‘数据分析实战’——STP分析案例(甲保险公司客户分类分析)
  7. SuperMap iManager云套件iServer镜像定制与更新-以定制达梦依赖为例
  8. 联想台式电脑开机需要按F2才能继续的解决方法
  9. CSS磨砂质感背景设计
  10. centos桌面版环境打造