由于镜面反射涉及到openGL,不会。

h文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#ifndef __CoverView_H__
#define __CoverView_H__
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
class CoverView : public CCNode,public CCScrollViewDelegate,public CCTouchDelegate
{
public:
CoverView();
~CoverView();
/**
*
* @param scrollView的rect
* @param scrollView滚动size
* @param card之间的距离
* @param card之间的缩放
*/
static CoverView* create(CCRect swBox,CCSize slSize,float disdistance,float disScale );
virtual bool init(CCRect swBox,float disScale);
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(CCTouch* pTouch,CCEvent* pEvent);
virtual void ccTouchMoved(CCTouch* pTouch,CCEvent* pEvent);
virtual void ccTouchEnded(CCTouch* pTouch,CCEvent* pEvent);
void initData();
void scrollViewDidScroll(CCScrollView* view);
void scrollViewDidZoom(CCScrollView* view);
void adjustCardScale(CCPoint adjustPoint);
void adjustScrollView(CCPoint adjustPoint);
void adjusetEndScrollView();
void cardViewEnd_callBack(CCNode* pSender);
int getCurCardindex(); //当前中间card索引 从0开始
void addCard(CCNode * card);
void addCard(CCNode * card,int zOrder);
void addCard(CCNode* card,int zOrder,int tag);
CC_SYNTHESIZE(CCPoint,swPosition,SwPosition); //scrollView 位置
CC_SYNTHESIZE(CCSize,swSize,SwSize); //scrollView大小
CC_SYNTHESIZE(CCSize,slSize,SlSize); //scrollLayer 大小
CC_SYNTHESIZE(float,disdistance,disdistance); //card距离间隔
CC_SYNTHESIZE(float,disScale,disScale); //crad缩放间隔
CC_SYNTHESIZE(CCRect,swBox,SwBox); //scrollview 边框
CC_SYNTHESIZE(cclayer*,scrollLayer,scrollLayer); //scrollView的containLayer
CC_SYNTHESIZE(int,cardNum,CardNum); //card索引
CC_PROPERTY(CCPoint,offsetPosition,OffsetPosition); //card起始位置
private:
CCSize wSize;
CCArray* cardArray;
CCScrollView* scrollView;
};
#endif
.cpp文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#include "CoverView.h"
CoverView::CoverView()
{
}
CoverView::~CoverView()
{
CC_SAFE_RELEASE_NULL(cardArray);
}
CoverView* CoverView::create(CCRect swBox,float disScale)
{
CoverView* cover = new CoverView();
if (cover && cover->init(swBox,disScale))
{
cover->autorelease();
return cover;
}
CC_SAFE_DELETE(cover);
return NULL;
}
bool CoverView::init(CCRect swBox,float disScale)
{
if (!CCNode::init()) return false ;
this ->swBox = swBox;
this ->swPosition = swBox.origin;
this ->swSize = swBox.size;
this ->slSize = slSize;
this ->disdistance = disdistance;
this ->disScale = disScale;
initData();
return true ;
}
void CoverView::initData()
{
wSize = CCDirector::sharedDirector()->getWinSize();
cardArray = CCArray::create();
cardArray->retain();
cardNum = 0;
offsetPosition = ccp(swSize.width/2,swSize.height/2);
scrollLayer = cclayer::create();
scrollLayer->setAnchorPoint(CCPointZero);
scrollLayer->setPosition(CCPointZero);
scrollLayer->setContentSize(slSize);
scrollView = CCScrollView::create(swSize,scrollLayer);
scrollView->setAnchorPoint(CCPointZero);
scrollView->setContentOffset(ccp(0,0));
scrollView->setTouchEnabled( false );
scrollView->setDelegate( this );
scrollView->setDirection(kCCScrollViewDirectionHorizontal);
addChild(scrollView,1);
}
void CoverView::onEnter()
{
CCNode::onEnter();
CCDirector::sharedDirector()->getTouchdispatcher()->addTargetedDelegate( this , false );
}
void CoverView::onExit()
{
CCDirector::sharedDirector()->getTouchdispatcher()->removeDelegate( this );
removeAllChildren();
CCNode::onExit();
}
bool CoverView::ccTouchBegan(CCTouch* pTouch,CCEvent* pEvent)
{
return true ;
}
void CoverView::ccTouchMoved(CCTouch* pTouch,CCEvent* pEvent)
{
CCPoint scroll_prepoint = pTouch->getPrevIoUsLocation();
CCPoint scroll_movepoint = pTouch->getLocation();
if (swBox.containsPoint(scroll_movepoint))
{
CCPoint adjustPoint = scroll_movepoint-scroll_prepoint;
adjustScrollView(adjustPoint);
adjustCardScale(adjustPoint);
}
}
void CoverView::ccTouchEnded(CCTouch* pTouch,CCEvent* pEvent)
{
CCPoint scroll_prepoint = pTouch->getPrevIoUsLocation();
CCPoint scroll_endpoint = pTouch->getLocation();
float disX = scroll_endpoint.x - scroll_endpoint.x;
adjusetEndScrollView();
}
void CoverView::adjustCardScale(CCPoint adjustPoint)
{
float disX = adjustPoint.x;
CCObject* obj = NULL;
CCARRAY_FOREACH(cardArray,obj)
{
CCNode* card = (CCNode*) obj;
float offset = scrollView->getContentOffset().x;
float posX = card->getPositionX() + offset;
float disMid = abs(swSize.width/2-posX);
float scale = 1- disMid/disdistance*disScale;
card->setScale(scale);
int zOr = (int) (1000-disMid*0.1);
card->setZOrder(zOr);
}
}
void CoverView::adjustScrollView(CCPoint adjustPoint)
{
CCPoint endPoint = ccpAdd(scrollView->getContentOffset(),ccp(adjustPoint.x,0));
scrollView->unscheduleAllSelectors();
scrollView->setContentOffset(endPoint, false );
}
void CoverView::adjusetEndScrollView()
{
CCObject* obj = NULL;
float minX = wSize.height;
float midX = swSize.width/2;
//获取距离中间最小值的card
CCARRAY_FOREACH(cardArray,obj)
{
CCNode* card = (CCNode*) obj;
float offset = scrollView->getContentOffset().x;
//转化父类坐标
float posX = card->getPositionX() + offset;
float disMid = midX-posX;
if (abs(disMid) < abs(minX)) minX = disMid;
}
CCARRAY_FOREACH(cardArray,obj)
{
CCNode* item = (CCNode*) obj;
//转化父类坐标
float offset = scrollView->getContentOffset().x;
float posX = item->getPositionX() + offset ;
//距离中间长度
float disMid = abs(midX - posX - minX);
//目标scale
float scale = 1- disMid/disdistance*disScale;
CCScaleto* scaleBy = CCScaleto::create(0.2f,scale);
item->runAction(scaleBy);
int zOr = (int) (1000-disMid*0.1);
item->setZOrder(zOr);
}
cclayer* scrollLayer = (cclayer*)scrollView->getContainer();
CCMoveBy* moveBy = CCMoveBy::create(0.2f,ccp(minX,0));
//CCCallFuncN* callFuncN = CCCallFuncN::create(this,callfuncN_selector(CoverView::cardViewEnd_callBack));
//CCSequence* seq = CCSequence::create(moveBy,callFuncN,NULL);
//scrollLayer->runAction(seq);
scrollLayer->runAction(moveBy);
}
void CoverView::cardViewEnd_callBack(CCNode* pSender)
{
getCurCardindex();
}
void CoverView::scrollViewDidScroll(CCScrollView* view)
{
}
void CoverView::scrollViewDidZoom(CCScrollView* view)
{
}
void CoverView::addCard(CCNode * card)
{
int zOrder = 1000 - cardNum;
this ->addCard(card,zOrder,0);
}
void CoverView::addCard(CCNode * card,int zOrder)
{
this ->addCard(card,0);
}
void CoverView::addCard(CCNode* card,int tag)
{
float positionX = offsetPosition.x + disdistance*cardNum;
float scale = 1 - disScale*cardNum;
card->setPosition(ccp(positionX,offsetPosition.y));
card->setScale(scale);
cardArray->addobject(card);
scrollLayer->addChild(card,tag);
cardNum++;
//cclog("crad%d:[%f,%f]",card->getPositionX(),card->getPositionY());
}
int CoverView::getCurCardindex()
{
float distance1 = - scrollLayer->getPositionX();
float distance2 = swSize.width/2 - offsetPosition.x;
//+5 浮点数误差
int index = (distance1 + distance2 + 5) / (disdistance);
//cclog("card index:%d distance1:%f",index,distance1);
return index;
}
void CoverView::setoffsetPosition(CCPoint var )
{
offsetPosition = var ;
CCObject* obj = NULL;
cardNum = 0;
CCARRAY_FOREACH(cardArray,obj)
{
CCNode* card = (CCNode*) obj;
float positionX = offsetPosition.x + disdistance*cardNum;
card->setPosition(ccp(positionX,offsetPosition.y));
cardNum++;
}
adjustCardScale(CCPointZero);
}
CCPoint CoverView::getoffsetPosition()
{
return offsetPosition;
}
在HelloWorld中调用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
bool HelloWorld::init()
{
if ( !cclayer::init() )
{
return false ;
}
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile( "image/logoLayer.plist" );
float winWidth = CCDirector::sharedDirector()->getWinSize().width;
float winHeight = CCDirector::sharedDirector()->getWinSize().height;
CCRect swRect = CCRectMake(0.01f*winWidth,0.4f*winHeight,0.98f*winWidth,0.33f*winHeight);
CCSize slSize = CCSizeMake(2.3f*winWidth,0.33f*winHeight);
float disdistance = 0.2f*winWidth;
float disScale = 0.25f;
CoverView* coverView = CoverView::create(swRect,disScale);
cclog( "add card" );
for (int i = 0 ; i< 11 ; i++)
{
CCSprite* player = CCSprite::createWithSpriteFrameName( "hero_bg.png" );
coverView->addCard(player);
}
//coverflow1.png默认第一张在coverView的正中间 coverflow2.png改变第一张的位置有卡片初始不一定在最中间 需要手动调整
//coverView->setoffsetPosition(ccp(0.1f*winWidth,swRect.size.height/2));
coverView->setPosition(swRect.origin);
addChild(coverView);
return true ;
}

Cocos2d-x类似coverflow效果的更多相关文章

  1. ios – Swift Bridging Obj和Obj-C类的可见性

    我已经在构建设置中指定了桥接头,它的完整路径,桥接头是自动创建的.在此之后,我在其中包含了我的obj-c头文件.但是每次调用对象构造函数的尝试都会失败:“使用未声明的标识符”.我做过的事情清单:>创建.m文件和Xcode建议创建桥接标头>添加obj-c文件到项目并将其导入标题>在构建设置中提供了桥接头文件的完整路径>在代码中使用了Obj-C类型……

  2. iOS将UIView转换为ScrollView而不破坏布局?

    是否有可能在不破坏所有约束和放置的情况下从UIView移动到UIScrollView.问题是我构建整个UI而不在iPhone4上测试它,现在我看到一些视图应该在ScrollView中工作.我尝试了一些技巧,但没有任何作用.约束被删除.以下是示例的示例图片:现在我希望test1UIView是ScrollView,我试图将ScrollView放在test1View中,然后在滚动视图中递归复制test1

  3. ios – 放大故事板中的任何视图时,Xcode 8.2和8.1崩溃

    当我单击视图框并拖动以放大视图时,视图不会放大.但相反,鼠标等待指示器将持续一秒钟,然后整个xcode将崩溃.这是在我的代码8.2更新后发生的.所以我尝试安装xcode8.1,问题仍然存在于一个特定项目中.所有其他项目都运作良好.故事板中没有警告或冲突.我不记得改变任何设置.附加崩溃日志:CRASH_LOG解决方法修正了问题:在我将ScrollView添加到ViewController并更改了Vi

  4. ios – UIButton在uiscrollView中不起作用

    我有一个将UIView作为子视图的scrollView.这有UIView子视图UIButton.只有scrollView连接到插座,其余全部都是代码.按钮不响应触摸,触摸时不变蓝.我能做些什么才能让它发挥作用?这是代码:解决方法您必须设置视图的内容大小.它必须大于或等于scrollView的内容大小.因为您的视图的默认大小是320*480和320*568.因此,增加视野的高度–self.view.frame=CGRectMake;然后将其添加为scrollView的子视图.将帮助您解决问题.

  5. ios – scrollViewDidEndDecelerating检测哪个集合视图在运行

    我使用这种方法来组织分页:当我滚动我的UICollectionView时,我在屏幕上更改了一些内容.但是我的屏幕上有很少的UICollectionView,我只需要一个.解决方法好吧,UICollectionView继承自UIScrollView,因此您可以检查哪个滚动视图最终从委托方法中减速.

  6. ios – 使用autolayout将子视图的宽度与其超级视图相匹配

    >我做错了什么?

  7. ios – 如何正确观察scrollView子类的contentOffset属性?

    在我的iOS应用程序中,我观察到对scrollView子类的contentOffset属性的更改.我的观察者处理程序如下所示:为简单起见,我将方法的参数任意选为id.我的NSLog’ging看起来像这样:我需要使用x和y值,但我不知道如何得到它们.我已经尝试将id转换为CGPoint,nope.我已经尝试将参数更改为CGPoint,nope.UPDATE它变深了.@mgold没有快乐.以下是我设置

  8. swift UI专项训练38 用代码实现滚屏ScrollView

    有时候我们在一个页面中放不下所有内容,就需要用到ScrollView,多余的内容可以通过滚动来获取。然后在viewDidLoad中初始化一个scrollView:要想实现滚屏,pagingEnabled必须设为true。我们先把它设为true看看效果,别忘了把这个scrollView显示到页面中:然后我们把需要的内容加到这个scrollView中,例如增加一个标题:运行一下看看效果因为我们把scrollView的尺寸设定为高800,超出屏幕的高度,我们向下拖动,注意右侧出现的滚动条:然后继续添加需要的内容

  9. swift scrollView滑动

    ios规划界面是分层的思想,明白这句话。基本也就掌握ios开发的真谛了下面看一下scrollView如何实现界面滑动的。首先我先简单做一个两个图层的UI。所以我们需要先声明一个scrollView.然后再在scrollView上面进行操作废话不多说。直接上代码以上就做好了第一层视图scrollView下面再做第二层view对于第二层你想做什么。注意ios开发的图层概念如果在原先图层添加self.view.addView()会把之前的图层给覆盖掉,本程序里scrollView将失去作用。下一节讲一下,怎么把

  10. 如何创建一个非常酷的3D效果菜单swift

    开始首先下载一个我们的初始项目。第一个页面和点击Cell之后进入的第二个页面是这样的。第二步是添加一个button来控制显示和隐藏我们的菜单。第三步实现我们菜单的3D化,就像Taasky这个APP里面的菜单一样。最后一步,你要将菜单动画和scrollView的offset结合起来。废话不多说,我们新建一个Viewcontroller,用来当做ViewController容器,名字就叫ContainerViewController.确保是继承自UIViewController。

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部