本文的实现是參照我之前在做iOS时实现的一个能够循环的列表这里用C++重写一遍。

效果:

原文地址:http://blog.csdn.net/qqmcy/article/details/27393011

用法:能够使用创建project时的HelloWorld測试

,h文件里加入循环列表的监听回调

 void djInfiniteScroll(Ref* sender);
    

.cpp

#include "DJInfiniteScrollPicker.h"
        DJInfiniteScrollPicker* picker = DJInfiniteScrollPicker::create();
picker->setSize(Size(500, 500));
picker->imageAry = set1;
picker->setPosition(Point(10, 100));
picker->setBackGroundColorType(cocos2d::ui::LAYOUT_COLOR_SOLID);
picker->setBackGroundColor(Color3B(128, 128, 128));
picker->initInfiniteScrollView(); addChild(picker); picker->addEventDJInifiteScrollPicker(this, djInfinitescrollvieweventselector(TestScene::djInfiniteScroll));

实现类:

DJInfiniteScrollPicker.h

//
// DJInfiniteScrollPicker.h
// maptest
//
// Created by 杜甲 on 14-5-27.
//
// #ifndef __maptest__DJInfiniteScrollPicker__
#define __maptest__DJInfiniteScrollPicker__ #include "cocos2d.h"
#include "ui/CocosGUI.h"
#include "extensions/cocos-ext.h" USING_NS_CC;
typedef enum
{
sc = 0,
sc1
}ScType; typedef void (Ref::*SEL_InfiniteScrollViewEvent)(Ref*); #define djInfinitescrollvieweventselector(_SELECTOR) (SEL_InfiniteScrollViewEvent)(&_SELECTOR) class DJInfiniteScrollPicker:public ui::Layout,public extension::ScrollViewDelegate
{ public:
CREATE_FUNC(DJInfiniteScrollPicker);
virtual bool init(); static DJInfiniteScrollPicker* create(Size wsize);
virtual bool initWithSize(Size wsize); virtual void scrollViewDidScroll(extension::ScrollView* view);
/**
* @js NA
* @lua NA
*/
virtual void scrollViewDidZoom(extension::ScrollView* view); void initInfiniteScrollView(); extension::ScrollView* infiniteScrollView; std::vector<std::string> imageAry;
Size itemSize;
float alphaOfobjs; float heightOffset;
float positionRatio; void addEventDJInifiteScrollPicker(Ref* sender,SEL_InfiniteScrollViewEvent type); private:
std::vector<Sprite*> imageStore; float beforePointX;
std::string fontName;
void reloadView(float offset);
void snapToAnEmotion(); Sprite* currSprite;
bool isFirstDrag;
int currNum; Ref* _infiniteEventListener;
SEL_InfiniteScrollViewEvent _infiniteEventSelector; }; #endif /* defined(__maptest__DJInfiniteScrollPicker__) */

DJInfiniteScrollPicker.cpp

//
// DJInfiniteScrollPicker.cpp
// maptest
//
// Created by 杜甲 on 14-5-27.
//
// #include "DJInfiniteScrollPicker.h"
bool DJInfiniteScrollPicker::init()
{
bool bRet = false; do {
CC_BREAK_IF(!ui::Layout::init()); bRet = true;
} while (0);
return bRet;
} DJInfiniteScrollPicker* DJInfiniteScrollPicker::create(Size size)
{
DJInfiniteScrollPicker* pRet = new DJInfiniteScrollPicker();
if (pRet && pRet->initWithSize(size))
{
pRet->autorelease();
}
else
{
CC_SAFE_DELETE(pRet);
}
return pRet; } bool DJInfiniteScrollPicker::initWithSize(cocos2d::Size size)
{
bool bRet = false;
do {
CC_BREAK_IF(!ui::Layout::init()); bRet = true;
} while (0);
return bRet;
} void DJInfiniteScrollPicker::initInfiniteScrollView()
{
isFirstDrag = false;
fontName = "TrebuchetMS-Bold"; alphaOfobjs = 1.0f;
heightOffset = 0.0f;
positionRatio = 1.0f; beforePointX = 0.0f; infiniteScrollView = extension::ScrollView::create(getSize());
infiniteScrollView->retain();
infiniteScrollView->setPosition(Point(0, 0)); infiniteScrollView->setBounceable(false);
infiniteScrollView->setDelegate(this);
//infiniteScrollView->setContentSize(get);
addChild(infiniteScrollView); Sprite* temp = Sprite::create("res/set2/s2_1.png");
// log("anchor = %f",temp->getAnchorPoint().x);
// temp->setPosition(Point(temp->getContentSize().width / 2, temp->getContentSize().height / 2));
// // temp->setPosition(Point( itemSize.width, 0));
// infiniteScrollView->addChild(temp); if (imageAry.size() > 0) { itemSize = temp->getContentSize();
} //
if (imageAry.size() > 0) {
for (int i = 0; i < (imageAry.size() * 5); i++) {
//ui::Text* temp = ui::Text::create(StringUtils::format("%d",i % (int)imageAry.size()), fontName, 23);
Sprite* sprite = Sprite::create(imageAry.at(i % imageAry.size()));
sprite->setTag(i % imageAry.size());
sprite->setPosition(Point(i * itemSize.width + itemSize.width / 2, itemSize.height / 2));
imageStore.push_back(sprite);
infiniteScrollView->addChild(sprite);
}
} infiniteScrollView->setContentSize(Size(imageAry.size() * 5 * itemSize.width, getSize().height));
float viewMiddle = imageAry.size() * 2 * itemSize.width; infiniteScrollView->setContentOffset(Point(-viewMiddle , 0)); } void DJInfiniteScrollPicker::scrollViewDidScroll(extension::ScrollView *view)
{
float sectionSize = imageAry.size() * itemSize.width;
log("QQQQQQQQQQQQ%f,%f",infiniteScrollView->getContentOffset().x,beforePointX); if (beforePointX != infiniteScrollView->getContentOffset().x)
{ if (infiniteScrollView->getContentOffset().x < 0)
{
if (infiniteScrollView->getContentOffset().x >= (-sectionSize + sectionSize / 2))
{
view->setContentOffset(Point(-sectionSize * 2 +sectionSize / 2, 0));
}
else if (view->getContentOffset().x <= (-sectionSize * 3 - sectionSize / 2))
{
view->setContentOffset(Point(-sectionSize * 2 - sectionSize / 2, 0));
}
// if (infiniteScrollView->isDragging()) {
// log("拖拽中");
reloadView(view->getContentOffset().x - getSize().width / 2);
// } }
else
{
view->setContentOffset(Point(-sectionSize * 2 + sectionSize / 2, 0));
} //推断是否被拖拽
if (!infiniteScrollView->isDragging()) { //推断是否是首次进入,首次不拖拽
if (isFirstDrag) {
beforePointX = -currSprite->getPosition().x + getSize().width / 2;
view->setContentOffset(Point(beforePointX, 0));
//log("停止拖拽view->getContentOffset().xQQ = %f",view->getContentOffset().x);
if (_infiniteEventListener && _infiniteEventSelector) {
(_infiniteEventListener->*_infiniteEventSelector)(currSprite); } // if (_scrollViewEventListener && _scrollViewEventSelector)
// {
// (_scrollViewEventListener->*_scrollViewEventSelector)(this, SCROLLVIEW_EVENT_SCROLL_TO_TOP);
// } } isFirstDrag = true;
} }
log("view->getContentOffset().x = %f",view->getContentOffset().x); beforePointX = view->getContentOffset().x; } void DJInfiniteScrollPicker::reloadView(float offset)
{ float biggestSize = 0.0f;
Ref* biggestView;
Sprite* sprite = imageStore.at(2); for (int i = 0; i < imageStore.size(); i++)
{
Sprite* sprite = imageStore.at(i); if (-sprite->getPosition().x > (offset - itemSize.width / 2) && -sprite->getPosition().x < (offset + itemSize.width / 2)) { currSprite = sprite;
currNum = i; sprite->setScale(2); }else
{
sprite->setScale(1);
}
}
} void DJInfiniteScrollPicker::snapToAnEmotion()
{ float offset = infiniteScrollView->getContentOffset().x - getSize().width / 2; } void DJInfiniteScrollPicker::scrollViewDidZoom(extension::ScrollView *view)
{ } void DJInfiniteScrollPicker::addEventDJInifiteScrollPicker(cocos2d::Ref *sender, SEL_InfiniteScrollViewEvent type)
{
_infiniteEventListener = sender;
_infiniteEventSelector = type;
}

Cocos2d-x3.0下实现循环列表的更多相关文章

  1. iOS6.0下获取通讯录用户列表

    自iOS6.0后获取通讯录列表需要询问用户,经过用户同意后才可以获取通讯录用户列表.而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函数转变为ABAddres ...

  2. 《Python基础教程》 读书笔记 第五章(下)循环语句

    5.5.1while循环 x=1 while x<=100: print x x+=1 确保用户输入了名字: name="" while not name: name=raw ...

  3. python 单向循环列表

    # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/23 下午 6:54 # 单向循环列表 # 单向循环列表与单向列表的不同之处在于最后 ...

  4. 微信小程序循环列表点击每一个单独添加动画

    首先,咱们看一下微信小程序动画怎么实现,我首先想到的是anime.js,但是引入之后用不了,微信小程序内的css也无法做到循环的动态,我就去找官方文档看看有没有相应的方法,哎,还真有 点击这里查看 微 ...

  5. Unity-UGUI-无限循环列表

    前言:项目准备新增一个竞技场排行榜,策划规定只显示0-400名的玩家.我一想,生成四百个游戏物体,怕不是得把手机给卡死?回想原来在GitHub上看到过一个实现思路就是无限循环列表,所以就想自己试试.公 ...

  6. js 递归下的循环

    的递归下的循环不能使用forEach  可以使用for代替 错误写法 // 获取完整名字 var getFullName = function(code, resultName) { if (code ...

  7. Debian8.3.0下安装Odoo8.0步骤

    Debian8.3.0下安装Odoo8.0的方法 假设你已经安装好了Debian 系统,使用root帐号执行如下命令 # apt-get update && apt-get upgra ...

  8. 第三方开源框架的下拉刷新列表(QQ比较常用的)。

    PullToRefreshListView是第三方开源框架下拉刷新列表,比较流行的QQ 微信等上面都在用. 下载地址(此开源框架于2013年后不再更新) 点此下载 package com.lixu.k ...

  9. 循环列表的Java实现,解决约瑟夫环问题

    import java.util.Scanner; /** * 循环列表的Java实现,解决约瑟夫环问题 * * @author LIU * */ public class LinkedList { ...

随机推荐

  1. blog迁移

    blog迁移到: https://github.com/for-firecat/

  2. python模块分析之hashlib加密(二)

    前言 hashlib模块是py3.+用来对字符串进行hash加密的模块,核心算法是md5,明文与密文是一一对应不变的关系:用于注册.登录时用户名.密码等加密使用. 模块分析 hashlib模块有多种加 ...

  3. C#上传图片(含有图片大小格式过滤以及改变像素安全存储)

    示例一: public JsonResult Upload(string parameter) { ]; try { //LogHelper.Info("文件长度:" + file ...

  4. Python_oldboy_自动化运维之路_面向对象2(十)

    本节内容: 面向对象程序设计的由来 什么是面向对象的程序设计及为什么要有它 类和对象 继承与派生 多的态与多态性 封装 静态方法和类方法 面向对象的软件开发 反射 类的特殊成员方法 异常处理 1.面向 ...

  5. 嵌入式telnet的安装

    一 在已经安装telnet上,执行查询命令将查到的命令拷贝的未安装telnet的134上. [NTP-Fedora20 system]#whereis xinetd xinetd: /usr/sbin ...

  6. ntpdate时间同步

    为什么需要网络同步时间: Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用nt ...

  7. 【已解决】Chrome提示:"请停用以开发者模式运行的扩展程序"的解决办法

    chrome用户在安装了一些第三方的chrome插件后,每次打开浏览器的时候都会出现“请停用以开发者模式运行的扩展程序”的提示,只有每次点击取消之后才能正常使用扩展.如下图所示 那么有没有什么方法可以 ...

  8. 004.iSCSI客户端配置示例-Linux

    一 安装软件 [root@system2 ~]# yum -y install iscsi-initiator-utils 二 修改相关参数 [root@system2 ~]# vi /etc/isc ...

  9. C#开发Unity游戏教程之Scene视图与脚本的使用

    C#开发Unity游戏教程之Scene视图与脚本的使用 Unity中Scene视图的快捷操作 Scene视图是开发者开发游戏时,操作最频繁的视图.因为一旦一个游戏对象被添加到游戏的场景中,就需要首先使 ...

  10. react运行阶段

    运行中可以使用的函数componentWillReceiveProps:父组件修改属性触发,可以修改新属性,修改状态.字面意思,组件将要接收属性,这个函数触发的时机就是组件的属性将要发生改变的时候,但 ...