这阶段心绪比較乱,所以这篇开头就不扯淡了。(谁说大姨夫来了我跟谁急!~~
说到大姨夫我突然想到英雄联盟有个美女讲解叫伊芙蕾亚,她的堂弟ID居然叫:姨夫累呀,好笑吧(呵呵,有点冷~~额,我都说不扯淡了)。

------------
前天有个网友问我一些关于scrollView的使用方法,因为在QQ上实在讲不清,所以就利用晚上的时间写这篇博客出来了。
本篇要实现的功能是用scrollView 拖动对象时,对象移动到某个固定范围会有放大、缩小的效果。以下開始。

在进入正题前我先简短的介绍下scrollView应该怎么用吧(想必大家也都会用~~):
1、记得在头文件中包括 “../extensions/cocos-ext.h",顺便声明下作用域:USING_NS_CC_EXT;
2、在类的继承里 加上ScrollViewDelegate,例如以下:

class HelloWorld : public cocos2d::Layer,public ScrollViewDelegate

3、在类的声明中,加上三个scrollView的托付函数,例如以下:

void scrollViewDidScroll(ScrollView* view);
void scrollViewDidZoom(ScrollView* view);
void scrollViewMoveOver(ScrollView* view);

4、实在不想继续说废话了,直接看实例吧。

先看头文件:

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__ #include "cocos2d.h"
#include "../extensions/cocos-ext.h" USING_NS_CC;
USING_NS_CC_EXT; class HelloWorld : public cocos2d::Layer,public ScrollViewDelegate
{
public:
static cocos2d::Scene* createScene();//获取欢迎画面的Scene
virtual bool init(); void menuCloseCallback(Ref* pSender); CREATE_FUNC(HelloWorld); //scroll 托付
void scrollViewDidScroll(ScrollView* view);
void scrollViewDidZoom(ScrollView* view);
void scrollViewMoveOver(ScrollView* view); private:
Vector<Sprite*> sp_vec;//声明一个容器
};
#endif // __HELLOWORLD_SCENE_H__

以下看定义

bool HelloWorld::init()
{
//首先创建scrollView
auto scroll_layer = Layer::create();//创建scrollView中的容器层
scroll_layer->setPosition(Point::ZERO);
scroll_layer->setAnchorPoint(Point::ZERO);
scroll_layer->setContentSize(Size(600,300));//设置容器层大小为(600,300) auto scrollView = ScrollView::create(Size(400,300),scroll_layer);//创建scrollView,显示窗体大小为(400,300)
scrollView->setDelegate(this);//设置托付
scrollView->setDirection(ScrollView::Direction::HORIZONTAL);//设置滚动方向为水平
scrollView->setPosition(Point(300,200));
this->addChild(scrollView,2); //创建三个对象
auto boy = Sprite::create("boy.png");//没错,主角又是我们熟悉的那仨。多么温馨。
boy->setPosition(Point(150,100));
scroll_layer->addChild(boy,2); auto girl = Sprite::create("girl_1.png");
girl->setPosition(Point(300,100));
scroll_layer->addChild(girl,2); auto girl3 = Sprite::create("girl_3.png");
girl3->setPosition(Point(450,100));
scroll_layer->addChild(girl3,2); sp_vec.pushBack(boy);//将三个对象放入容器中
sp_vec.pushBack(girl);
sp_vec.pushBack(girl3); return true;
}

接下来看下scrollView的托付函数,这里仅仅要看scrollViewDidScroll 就好了。实现效果是对象在某个坐标范围内移动时会有缩放效果。

void HelloWorld::scrollViewDidScroll(ScrollView* view)
{
//在scrollView拖动时响应该函数 auto offsetPosX = (view->getContentOffset()).x;//获得偏移X坐标(向右移动,偏移量为正数,向左则为负数)
// CCLOG("offset pos is %f , %f",offsetPos.x,offsetPos.y); //for 循环遍历容器中的每一个精灵
for( auto e : sp_vec )
{
auto pointX = e->getPositionX();//获得当前对象的X坐标(无论怎么滚动,这个坐标都是不变的)
float endPosX = pointX + offsetPosX;//将精灵的 X坐标 + 偏移X坐标 //当endPosX在 150~250 范围,则对象的大小从左向右递增
if( endPosX > 150 && endPosX < 250 )
{
float x = endPosX / 150;//放大倍数为 endPosX / 150;
e->setScale(x);
CCLOG("x = %f",x);
}
//当endPosX在 250~350 范围,则对象的大小从左向右递减
else if( endPosX > 250 && endPosX < 350 )
{
//以下这个公式不好解释,我就这么说吧:
//如果 endPosX = 200,那么放大倍数应该是 200 / 150 = 1.33左右,那么当endPosX = 300时,出于对称的原理,我们以250为对称中心,那么
//300 的放大倍数也应该是 1.33。这就是以下的公式由来
float a = endPosX - 250;
float b = 250 - a; float x = b / 150;
e->setScale(x);
}
else
{
//不是在上面的范围,则设置为正常大小
e->setScale(1.0f);
}
}
}
void HelloWorld::scrollViewDidZoom(ScrollView* view)
{
//do something
}
void HelloWorld::scrollViewMoveOver(ScrollView* view)
{
//do something
}

恩,凝视写的非常清楚啦,但我还是要略微补充一些东东:我们应该知道,对象放到滚动层上(如scroll_layer->addChild(boy)),那么无论对象在scrollView上怎样移动,它获得的坐标都是不会变的(如boy->getPosition()是不变的数值),这样的情况下,如果我们想实现对象在某个坐标范围内会有缩放效果,那么仅仅是去获取对象的坐标肯定是行不通的,所以肯定要找一个时刻在变化的”參照物”来利用下,该找什么呢?没错,就是scrollView的偏移坐标(scrollView->getContentOffset())!仅仅要scrollView移动一下,那么它的 偏移量也随之改变。我这里就是利用对象的坐标与scrollView的偏移坐标之间不可告人的秘密,从而实现当前的目的。

以下看下执行效果。

尊重原创,转载请注明来源:http://blog.csdn.net/star530/article/details/25658725

Cocos2dx 小技巧(十四)ScrollView实现缩放效果的更多相关文章

  1. Eclipse用法和技巧十四:自动生成的TODO注释2

    前面介绍了自动生成的TODO注释含义,配置以及如何去除的方法,这里介绍下TODO常见的用途.工作中经常会遇到写代码写到一半,被叫过去开会推动沟通.o(╯□╰)o 一般都有写代码停下来一段时间,再回来就 ...

  2. Cocos2dx 小技巧(十五)话说ScrollView的delegate实现过程

    附:本文參加了CSDN博客大赛.亲假设认为这篇文章不错,就大胆的来投上一票吧! !!http://vote.blog.csdn.net/Article/Details? articleid=34140 ...

  3. Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

    今早发生了一件事让我感觉特气愤!去年的这个时候,我和小伙伴们一起在操场上拍毕业照,之后有个当地报纸的记者来我们学校取材,看到我们后打算给我们拍几张创意张扬点的毕业照.之后呢,照片出来了,拍的效果大伙都 ...

  4. Cocos2dx 小技巧(十六)再谈visit(getDescription)

    之前两篇都是介绍与Value相关的,这篇我继续这个话题吧,正好凑个"Value三板斧系列...".在非常久非常久曾经.我用写过一篇博客,关于怎样查看CCArray与CCDictio ...

  5. Cocos2dx 小技巧(十三)聊聊坐标系

    一好友考上了空姐.她说:以后基本上不会回来了.等下次见面时请叫我白富美!尽管有点羡慕.但我依然不甘示弱回复:下次见面时请叫我高富帅! 未来,谁说得准呢? ------------------有段时间没 ...

  6. 从零开始のcocos2dx生活(十)ScrollView

    目录 简介 基础变量 ScrollViewDelegate Direction _dragging _container _touchMoved _bounceable _touchLength 方法 ...

  7. Cocos2dx 小技巧(十一) 小人虽短,但能够旋转

    转眼五一就到了,放假三天应该做些什么呢?窝在家里钻研技术?写博客?no no no no,这样的"伤害"自己的方式实在让我无法忍受.本来和大学那伙人越好了一起去哪里玩玩,喝酒聊天啥 ...

  8. 【cocos2dx 小技巧】半透明屏蔽罩和弹出框的实现

    今天介绍一下,弹出框的和屏蔽罩的小实现~ 弹出框主要用到了cocos2dx生命周期里面的OnEnter()函数,就是当Layer被addChild的时候会调用的函数(所以假设把OnEnter的代码加到 ...

  9. 【转】cocos2d-x游戏开发(十四)用shader使图片背景透明

    转自:http://blog.csdn.net/dawn_moon/article/details/8631783 好吧,终于抽时间写这篇文章了. 手头上有很多人物行走图,技能特效图等,但这些图都有个 ...

随机推荐

  1. shell实现增加删除Linux系统用户脚本(密码为随机)

    README shell环境下运行脚本,根据需求选择相应的功能. List \t\t create the userlist 这一步是必须执行的,脚本会识别本地当前目录下的文件 Useradd \t\ ...

  2. mysql 存储过程详解

    MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...

  3. Stringbuilder & Stringbuffer

    StringBuilder和StringBuffer的父类都是继承了 AbstractStringBuilder, 他们各自的append方法都是调用了 super.append(str), 但是一个 ...

  4. 美团外卖Android Crash治理之路

    Crash率是衡量一个App好坏的重要指标之一,如果你忽略了它的存在,它就会愈演愈烈,最后造成大量用户的流失,进而给公司带来无法估量的损失.本文讲述美团外卖Android客户端团队在将App的Cras ...

  5. 用profile协助程序性能优化

     程序运行慢的原因有很多,比如存在太多的劣化代码(如在程序中存在大量的“.”操作符),但真正的原因往往是比较是一两段设计并不那么良好的不起眼的程序,比如对一序列元素进行自定义的类型转换等.因为程序性能 ...

  6. session效验

    看代码... <?php $servername = "服务器名"; $username = "账户名"; $password = "密码&qu ...

  7. python ftp操作脚本&常用函数

    需求:快速进行ftp上传 ,下载,查询文件 原来直接在shell下操作: 需要[连接,输用户名,输密码,单文件操作,存在超时限制] 太过于繁琐,容易操作失败 脚本改进: 一句命令,搞定多文件上传,下载 ...

  8. laya IDE 初始化设置

    切换到 编辑模式(显示UI的界面)--按F9--- 修改 资源发布目录为  bin/

  9. poj 3463 次短路

    题意:给定一个有向图,问从起点到终点,最短路+比最短路距离长1的路的个数. 当年数据结构课程设计用A*做过,现在忘光了,2333 #include<stdio.h> #include< ...

  10. 协议栈中使用crc校验函数

    CRC校验介绍:循环冗余校验码,原理是多项式除法 ZigBee协议栈:能够使zigbee节点相互之间组网,数据传输,数据获取,数据显示 思路以及步骤: 1.因为IAR的程序是用c写的,所以上网查找如何 ...