Cocos2d-X采用CCScrollView创建滚动视图
CCScrollView滚动视图可以让游戏有效果,并能够通过滚动视图切换游戏场景,滚动视图通常用来选择在游戏中的级别
实例1:使用CCScrollView创建一个简单的滚动视图
首先创建一个ScrollView类
然后在ScrollView.h中加入以下的代码
- #ifndef __ScrollView_H__
- #define __ScrollView_H__
- #include "cocos2d.h"
- #include "cocos-ext.h"
- USING_NS_CC;
- USING_NS_CC_EXT;
- class ScrollView : public CCLayer
- {
- public:
- virtual bool init();
- static CCScene* scene();
- CREATE_FUNC(ScrollView);
- //响应触摸事件
- bool ccTouchBegan(CCTouch* touch, CCEvent*);
- void ccTouchEnded(CCTouch* touch, CCEvent*);
- CCNode* _contaner;
- };
- #endif // __ScrollView_H__
在ScrollView.cpp中加入以下的代码
- #include "ScrollView.h"
- CCScene* ScrollView::scene()
- {
- CCScene *scene = CCScene::create();
- ScrollView *layer = ScrollView::create();
- scene->addChild(layer);
- return scene;
- }
- bool ScrollView::init()
- {
- CCLayer::init();
- CCSize winSize = CCDirector::sharedDirector()->getWinSize();
- CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
- //创建一个结点
- CCNode* c = CCNode::create();
- //创建5个紧挨着的精灵
- for(int i = 0; i < 5; i++)
- {
- CCSprite* sprite = CCSprite::create("HelloWorld.png");
- c->addChild(sprite);
- //设置图片的位置,每两张图片相差一张图片的宽度
- sprite->setPosition(ccpAdd(center, ccp(i*winSize.width, 0)));
- }
- //滚动视图
- //第一个參数:显示的视图大小
- //第二个參数:视图的实际大小
- CCScrollView* view = CCScrollView::create(winSize, c);
- addChild(view);
- //设置视图运动的方向为水平运动
- view->setDirection( kCCScrollViewDirectionHorizontal);
- //设置视图的宽度和高度
- view->setContentSize(CCSize(winSize.width * 5, winSize.height * 5));
- return true;
- }
运行结果
实例2:CCScrollView的高级应用
不会出现两张图片的相交位置在窗体中(当切换完毕图片后总会在窗体上显示一张完整的图片)
在ScrollView.cpp中加入以下的代码
- #include "ScrollView.h"
- CCScene* ScrollView::scene()
- {
- CCScene *scene = CCScene::create();
- ScrollView *layer = ScrollView::create();
- scene->addChild(layer);
- return scene;
- }
- bool ScrollView::init()
- {
- CCLayer::init();
- CCSize winSize = CCDirector::sharedDirector()->getWinSize();
- CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
- //创建一个结点
- CCNode* c = CCNode::create();
- _contaner = c;
- //创建5个紧挨着的精灵
- for(int i = 0; i < 5; i++)
- {
- CCSprite* sprite = CCSprite::create("HelloWorld.png");
- c->addChild(sprite);
- //设置图片的位置。每两张图片相差一个屏幕的宽度
- sprite->setPosition(ccpAdd(center, ccp(i*winSize.width, 0)));
- //给视图编号
- char buf[10];
- sprintf(buf, "%d", i);
- CCLabelTTF* label = CCLabelTTF::create(buf, "Arial", 36);
- sprite->addChild(label);
- label->setPosition(center);
- }
- //滚动视图
- //第一个參数:在窗体显示的视图大小
- //第二个參数:结点CCNode
- CCScrollView* view = CCScrollView::create(winSize, c);
- addChild(view);
- //设置视图运动的方向为水平运动
- view->setDirection( kCCScrollViewDirectionHorizontal);
- //设置视图的宽度和高度
- view->setContentSize(CCSize(winSize.width * 5, winSize.height * 5));
- //取消ScrollView的弹性
- view->setBounceable(false);
- //注冊触摸事件
- setTouchEnabled(true);
- setTouchMode(kCCTouchesOneByOne);
- return true;
- }
- //鼠标点下的时候
- bool ScrollView::ccTouchBegan(CCTouch* touch, CCEvent* ev)
- {
- return true;
- }
- //鼠标起来的时候
- void ScrollView::ccTouchEnded(CCTouch* touch, CCEvent*)
- {
- //得到鼠标点下去的时候的位置
- CCPoint ptDown = touch->getStartLocation();
- //得到鼠标松开时的位置
- CCPoint ptUp = touch->getLocation();
- //当两个位置的距离的平方小于25时(觉得是点击,否则是滑动)
- if(ptUp.getDistanceSq(ptDown) <= 25)
- {
- //检查点击的是哪一个图片
- //将世界坐标转换成结点坐标
- CCPoint ptInContainer = _contaner->convertToNodeSpace(ptUp);
- //定义一个数组保存5个精灵
- CCArray* arr = _contaner->getChildren();
- for(int i = 0; i < 5; ++i)
- {
- //获取精灵的索引(获取点击的是哪个精灵)
- CCSprite* sprite = (CCSprite*)arr->objectAtIndex(i);
- //boundingBox()获取精灵的边框(推断触摸点是否在边框内,当在的时候。打印精灵的编号)
- if(sprite->boundingBox().containsPoint(ptInContainer))
- {
- CCLog("click i is %d", i);
- break;
- }
- }
- }
- else
- {
- //滑动
- int x = _contaner->getPositionX();
- if (x >= -1920 && x <= 0)
- {
- // adjust
- // 0, -480, -960, -1440, -1920
- int idx = (-x +240)/ 480;
- x = -idx * 480;
- CCMoveTo* moveTo = CCMoveTo::create(0.5f, ccp(x, this->_contaner->getPositionY()));
- this->_contaner->runAction(moveTo);
- }
- }
- }
运行结果:
当在图片中点击后会打印点击的图片的编号
改进后不会出现的情形
版权声明:本文博主原创文章,博客,未经同意不得转载。
Cocos2d-X采用CCScrollView创建滚动视图的更多相关文章
- Cocos2d-X 使用CCTableView创建滚动视图
CCTableView和CCScrollView如创建滚动视图,CCTableView该函数将是更,制造更多麻烦 实例1:使用CCTableView创建滚动视图 首先创建一个TableView类 Ta ...
- swift:创建滚动视图的图片轮播器
用swift创建图片轮播器和用OC创建的方式是一样的,都主要用到UIScrollView和UIImageview这两个控件,有几张图片,就将滚动视图的内容区域大小设置为每一张图片的大小乘以张数即可.然 ...
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应
MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文: http://blog.csdn.net/supermanking/article/detail ...
- cocos2dx基础篇(14) 滚动视图CCScrollView
[3.x] (1)去掉 "CC" (2)滚动方向 > CCScrollViewDirection 改为强枚举 ScrollView::Dire ...
- 滚动视图和页面控制UIScollView,UIpageControlDemo
//// ViewController.m// UIScollView//// Created by hehe on 15/9/25.// Copyright (c) 2015年 wang.h ...
- 制作滚动视图(ScrollView)
怎样判断是否应当使用滚动视图 所谓的滚动视图,是指一个可以滑动的视窗,视窗大小和位置固定不变,视窗内的内容用户可以通过手指滑动或者拖动滚动天来进行滚动浏览. 滚动视图的目的是为了解决同类内容过多,一个 ...
- Cocos2d-x学习笔记(14)(更新函数scheduleUpdate、进度计时器CCProgressTo、滚动视图CCScrollView)
一.scheduleUpdate 1.scheduleUpdate:此函数是CCNode的函数,每一个CCNode仅仅要调用scheduleUpdate更新函数,那么这个CCNode就会响应当前类的u ...
- iOS 滚动视图的复用问题解决方案
LazyScroll是什么 LazyScrollView 继承自ScrollView,目标是解决异构(与TableView的同构对比)滚动视图的复用回收问题.它可以支持跨View层的复用,用易用方式来 ...
- 【Android】10.5 滚动视图(RecyclerView)
分类:C#.Android.VS2015: 创建日期:2016-02-19 一.简介 滚动视图(RecyclerView)的用法与布局控件的用法类似,唯一不同的是,所有布局控件中都可以包含多个组件,而 ...
随机推荐
- java.io.FileNotFoundException: /home/hadoop/hadoop/dfs/namenode/current/VERSION (Permission denied)
今天布置hadoop集群,尝试单独将secondarynamenode分属到一台独立的虚拟机上, 当格式化后,start-dfs.sh.namenode没启动.查看日志.报错例如以下 查看权限才发现, ...
- SQL声明大全
1.随机选择3记录 select top 3 * from tablename newid() 2.随机选记录 select newid(). 3.删除反复记录 1) delete f ...
- 微软中国裁员曝光:在CD结束后!薪酬不变!
聚众抗议的前诺基亚员工(腾讯科技配图) 腾讯科技 郭晓峰 腾讯科技刚刚获取了一份微软设备事业部中国区管理团队4日晚间发给被裁员工的补偿方案邮件. 邮件内容显示,微软承诺在收购诺基亚交易结束(2014年 ...
- BackGroundWorker使用总结
方法: backgroundWorker1.CancelAsync() 用于取消异步执行 backgroundWorker1.ReportProgress(int ,object)用于向主线层报告进度 ...
- C++习题 商品销售
Description 商店销售某一商品,每天公布统一的折扣(discount).同时允许销售人员在销售时灵活掌握售价(price),在此基础上,一次购10件以上者,还可以享受9.8折优惠.现已知当天 ...
- ZOJ Monthly, October 2010 ABEFI
ZOJ 3406 Another Very Easy Task #include <cstdio> #include <cstring> const int N = 10000 ...
- 为什么windows dos和Linux shell有这样的差别??
Windows dos随着impdp导入数据库: impdp "sys/password@ip:1521/sidname as sysdba" directory=dbdir du ...
- iframe滚动条问题:显示/隐藏滚动条
iframe 问题2008-01-22 16:37****** 显示 iframe 内容 XHTML 1.0 Transitional 标准不能显示 <!DOCTYPE html PUBLI ...
- SDUT 2498-AOE网上的关键路径(spfa+字典序路径)
AOE网上的关键路径 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 一个无环的有向图称为无环图(Directed Acycl ...
- jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)
原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jd ...