cocos2dx实现环形角色选择界面

数据结构采用双向循环链表。由候选角色组成链表的节点,将链表中的节点在屏幕上按照椭圆分布。

.h:

 1 //链表节点——候选角色
 2 class CandidateRole :public CCNode{
 3 public:
 4     CandidateRole();
 5     ~CandidateRole();
 6     virtual bool init(const char* name);
 7     static CandidateRole* create(const char* name);
 8     CandidateRole* mpNextRole; //节点右面角色的指针
 9     CandidateRole* mpForeRole;  //..左..........
10
11      void setPositionIndex(int );
12      int getPositionIndex();
13
14     int mDistance;     //到椭圆最低点的距离
15     int mPositionIndex;     //节点在链表中的序号
16     int mNextPositionX;
17     int mNextPositionY;
18     int mColorR;
19     int mColorG;
20     int mColorB;
21     CCArmature* mpArmature;
22     bool mbIsSelected;   // 是否被选中
23
24 };
25
26
27 //由候选角色组成的链表,在屏幕上成椭圆分布
28 class CircleStage :public CCNode{
29
30 public:
31     CircleStage();
32     ~CircleStage();
33     virtual bool init();
34
35     CREATE_FUNC(CircleStage);
36     void addRole(CandidateRole *);    //添加一个角色到链表
37     void changeToNext();    //顺时针旋转
38     void changeToFore();    //逆时针旋转
39
40     bool isOnAction();
41     void actionEnd();
42
43 private:
44     bool mbOnAction;
45     int mRoleNum;
46     CandidateRole* mpCurrentRole;     //操作链表用的指针
47     CandidateRole* mpHead;
48     CandidateRole* mpLast;
49     CandidateRole* mpSelectRole;    //被选中的角色,在椭圆最低点
50     int mCircleA;    //椭圆的a
51     int mCircleB;    //椭圆的b
52     void updateColor();    //更新每个节点的明暗,越远越暗
53     void updateZorders();    //更新遮盖关系
54         void updateZordersCallBack();
55     void updateDistances();    //更新每个节点到中央节点的距离
56     void initAppearance();    //初始化颜色和缩放
57
58 };        

.cpp:

  1 CandidateRole::CandidateRole()
  2 {
  3
  4 }
  5 CandidateRole::~CandidateRole()
  6 {
  7
  8 }
  9 bool CandidateRole::init(const char* name)
 10 {
 11
 12     mPositionIndex=0;
 13     mbIsSelected=false;
 14     mDistance=0;
 15     mColorB=255;
 16     mColorG=255;
 17     mColorR=255;
 18
 19     mpArmature = CCArmature::create(name);
 20     this->addChild(mpArmature);
 21
 22     return true;
 23 }
 24
 25 CandidateRole* CandidateRole::create(const char* name)
 26 {
 27     CandidateRole* pRet = new CandidateRole();
 28     if (pRet && pRet->init(name))
 29     {
 30         pRet->autorelease();
 31     }
 32     else
 33     {
 34         CC_SAFE_DELETE(pRet);
 35     }
 36     return pRet;
 37 }
 38
 39 void CandidateRole::setPositionIndex(int index)
 40 {
 41     mPositionIndex=index;
 42 }
 43
 44 int CandidateRole::getPositionIndex()
 45 {
 46     return mPositionIndex;
 47
 48 }
 49
 50 CircleStage::CircleStage()
 51 {
 52
 53 }
 54
 55 CircleStage::~CircleStage()
 56 {
 57
 58 }
 59
 60 bool CircleStage::init()
 61 {
 62
 63     mCircleA=ScreenWidth*0.4;
 64     mCircleB=80;
 65     mRoleNum=0;
 66     mpHead=NULL;
 67     mbOnAction=false;
 68     for(int i=0;i<8;i++)
 69     {
 70         CandidateRole* role=CandidateRole::create("role");
 71         this->addRole(role);
 72
 73     }
 74     updateDistances();
 75     updateZorders();
 76     initAppearance();
 77     return true;
 78
 79 }
 80 void CircleStage::updateColor()
 81 {
 82     mpCurrentRole=mpSelectRole;
 83     for (int i=0;i<mRoleNum;i++)
 84     {
 85         mpCurrentRole->mColorR=255;
 86         mpCurrentRole->mColorG=255;
 87         mpCurrentRole->mColorB=255;
 88         for (int j=0;j<mpCurrentRole->mDistance;j++)
 89         {
 90
 91             mpCurrentRole->mColorR*=0.6;
 92             mpCurrentRole->mColorG*=0.6;
 93             mpCurrentRole->mColorB*=0.6;
 94         }
 95         mpCurrentRole->mpArmature->setColor(ccc3(mpCurrentRole->mColorR,mpCurrentRole->mColorG,mpCurrentRole->mColorB));
 96         mpCurrentRole=mpCurrentRole->mpNextRole;
 97     }
 98 }
 99
100 void CircleStage::updateDistances()
101 {
102     mpCurrentRole=mpSelectRole;
103     int distance=0;
104     for (int i=0;i<=mRoleNum/2;i++)
105     {
106     mpCurrentRole->mDistance=distance;
107     ++distance;
108     mpCurrentRole=mpCurrentRole->mpNextRole;
109
110     }
111     mpCurrentRole=mpSelectRole;
112     distance=0;
113     for (int i=0;i<=mRoleNum/2;i++)
114     {
115     mpCurrentRole->mDistance=distance;
116     ++distance;
117     mpCurrentRole=mpCurrentRole->mpForeRole;
118     }
119
120     mpSelectRole->mDistance=0;
121 }
122 void CircleStage::initAppearance()
123 {
124     mpCurrentRole=mpSelectRole;
125
126     for (int i=0;i<mRoleNum;i++)
127     {
128         double scale=1;
129
130         for (int j=0;j<mpCurrentRole->mDistance;j++)
131         {
132             scale*=0.8;
133             mpCurrentRole->mColorR*=0.6;
134             mpCurrentRole->mColorG*=0.6;
135             mpCurrentRole->mColorB*=0.6;
136         }
137         mpCurrentRole->setScale(scale);
138
139         mpCurrentRole->mpArmature->setColor(ccc3(mpCurrentRole->mColorR,mpCurrentRole->mColorG,mpCurrentRole->mColorB));
140         mpCurrentRole=mpCurrentRole->mpNextRole;
141     }
142     mpSelectRole->setScale(1.0f);
143
144 }
145
146 void CircleStage::updateZorders()
147 {
148     mpSelectRole->setZOrder(mRoleNum);
149     mpSelectRole->mDistance=0;
150     mpCurrentRole=mpSelectRole;
151
152     for (int i=0;i<=mRoleNum/2;i++)
153     {
154
155         mpCurrentRole->setZOrder(mRoleNum-mpCurrentRole->mDistance);
156         mpCurrentRole=mpCurrentRole->mpNextRole;
157     }
158     for (int i=mRoleNum/2+1;i<mRoleNum;i++)
159     {
160
161         mpCurrentRole->setZOrder(abs(mRoleNum/2-mpCurrentRole->mDistance));
162         mpCurrentRole=mpCurrentRole->mpNextRole;
163     }
164
165 }
166
167
168
169
170 void CircleStage::addRole(CandidateRole *newRole)
171 {
172     if (!mpHead)
173     {
174         mpHead=newRole;
175         this->addChild(newRole);
176         mpLast=mpHead;
177         mpLast->mpNextRole=mpHead;
178         mpHead->mpForeRole=mpHead;
179         mpCurrentRole=mpHead;
180         mRoleNum++;
181         mpCurrentRole->setPositionIndex(mRoleNum);
182         mpSelectRole=newRole;
183     }
184     else
185     {
186         mpLast->mpNextRole=newRole;
187         newRole->mpNextRole=mpHead;
188         newRole->mpForeRole=mpLast;
189         mpHead->mpForeRole=newRole;
190         this->addChild(newRole);
191         mpLast=newRole;
192         mRoleNum++;
193         newRole->setPositionIndex(mRoleNum);
194     }
195     int x,y;
196     double t;
197     while(1)
198     {
199         t=360/mRoleNum*(mpCurrentRole->getPositionIndex()-1)-90;
200         t=t*3.14/180;//convert t to radian
201         x=mCircleA*cos(t);
202         y=mCircleB*sin(t);
203         mpCurrentRole->setPositionX(x);
204         mpCurrentRole->setPositionY(y);
205         mpCurrentRole=mpCurrentRole->mpNextRole;
206
207         if (mpCurrentRole==mpHead)
208         {
209             break;
210         }
211
212     }
213 }
214
215 void CircleStage::changeToNext() //从右向左
216 {
217     mpSelectRole=mpSelectRole->mpNextRole;
218     CCCallFunc* callFuncActionEnd = CCCallFunc::create(this,callfunc_selector(CircleStage::actionEnd));
219     CCCallFunc* callUpdateZorder = CCCallFunc::create(this,callfunc_selector(CircleStage::updateZordersCallBack));
220     if (mpCurrentRole->mpNextRole)
221     {
222
223         mpSelectRole->setZOrder(mRoleNum);
224         for (int i=0;i<mRoleNum;i++)
225         {
226
227             mpCurrentRole->mNextPositionX=mpCurrentRole->mpForeRole->getPositionX();
228             mpCurrentRole->mNextPositionY=mpCurrentRole->mpForeRole->getPositionY();
229             mbOnAction=true;
230             CCMoveTo *moveToNext=CCMoveTo::create(0.4f,ccp(mpCurrentRole->mNextPositionX,mpCurrentRole->mNextPositionY));
231             CCScaleTo *scaleToFore=CCScaleTo::create(0.4f,mpCurrentRole->mpForeRole->getScale());
232             CCFiniteTimeAction*  spawnAction = CCSpawn::create(moveToNext,scaleToFore,NULL);
233
234             CCSequence* actions = CCSequence::create(spawnAction,callUpdateZorder,callFuncActionEnd,NULL);
235             mpCurrentRole->runAction(actions);
236
237             mpCurrentRole=mpCurrentRole->mpNextRole;
238
239         }
240         updateDistances();
241         updateColor();
242
243     }
244
245
246 }
247
248 void CircleStage::updateZordersCallBack()
249 {
250   updateZorders();
251 }
252 void CircleStage::actionEnd()
253 {
254     mbOnAction=false;
255
256 }
257
258 void CircleStage::changeToFore() //从左向右
259 {
260     mpSelectRole=mpSelectRole->mpForeRole;
261     CCCallFunc* callFuncActionEnd = CCCallFunc::create(this,callfunc_selector(CircleStage::actionEnd));
262
263     if (mpCurrentRole->mpForeRole)
264     {
265         for (int i=0;i<mRoleNum;i++)
266         {
267             mpCurrentRole->mNextPositionX=mpCurrentRole->mpNextRole->getPositionX();
268             mpCurrentRole->mNextPositionY=mpCurrentRole->mpNextRole->getPositionY();
269             mbOnAction=true;
270
271             CCMoveTo *moveToFore=CCMoveTo::create(0.4f,ccp(mpCurrentRole->mNextPositionX,mpCurrentRole->mNextPositionY));
272             CCScaleTo *scaleToFore=CCScaleTo::create(0.4f,mpCurrentRole->mpNextRole->getScale());
273             CCFiniteTimeAction*  spawnAction = CCSpawn::create(moveToFore,scaleToFore,NULL);
274             CCSequence* actions = CCSequence::create(spawnAction,callFuncActionEnd,NULL);
275             mpCurrentRole->runAction(actions);
276             mpCurrentRole=mpCurrentRole->mpNextRole;
277
278         }
279         updateDistances();
280         updateZorders();
281         updateColor();
282
283     }
284 }
285
286 bool CircleStage::isOnAction()
287 {
288     return mbOnAction;
289 }

cocos2dx实现环形角色选择界面

时间: 2024-10-28 23:40:05

cocos2dx实现环形角色选择界面的相关文章

DoTween应用在炉石传说,从开始界面到角色选择界面动画切换

动画播放步骤前面有... 然后在moveStart脚本里面添加 public DOTweenAnimation Hero_SelectPage;    public bool isCanShowSelectRole = false;//是否进入角色选择界面 public DOTweenAnimation WelcomPage;    public bool isWelcomFinished = false; 在inspector面板上进行拖拽赋值 “Welcom Page”是开始界面的logo

Unity3D开发——LeRunning角色选择界面制作

//////////////////2015/08/20/////////////////// /////////////////by  xbw///////////////////////// /////////////////环境 unity4.6.1///////////// 今天的玲珑杯数字媒体创意大赛算是差不多结束了,做了一个多月的也积累了不少经验,写一下教程吧,关于这个人物角色选择的界面 先看一下效果图 UI内容不少吧,现在先说一下这个人物切换, 这个呢就用预制体了,把需要的角色添加

cocos2dx3.2格斗类游戏人物选择界面

先看最终实现的效果图: 创建以人物选择场景 ChooseHero.h #ifndef __CHOOSE_HERO_H__ #define __CHOOSE_HERO_H__ #include "cocos2d.h" #include "ui/CocosGUI.h" #include "cocos-ext.h" #include "cocostudio/CocoStudio.h" using namespace cocos2d:

炉石传说之角色选择和对战界面

在建立NGUI的基础之上: 1.在UIRoot上建立一个空物体,并取名为welcome,将UIRoot下的几个子物体移动到welcome下,进行统一管理. 2.选择bg_selectrole图片作为背景选择界面,将此图片加入到Altas. 3.在UIRoot下创建一个精灵,并且将bg_selectrol选择. 4.在背景图片下选择相应的9个英雄.将9个英雄的图标加入到Altas中. 5.在背景下建立一个sprite-children.将hero1做成一个预制.将图片拖到prefab的文件夹中就可

在cocos2dx和unity3d之间选择

人生最纠结的事,莫过于有选择………… cocos2dx和unity3d从某种意义上讲,都很不错.但当面对特定需求以及团队情况的时候,总是能分出高下的. 假设,目标游戏是一款类似 刀塔传奇 的游戏 我们先分析一下游戏特点 1.这是一款2D游戏 2.它没有强烈的玩家互动,也没有玩家互见 3.它适合使用HTTP与服务器进行通信 4.为了资源较小,使用2D骨骼动画 5.为了更好的用户体验,我们需要支持游戏内更新 对于以上5点来说,两个引擎都是可以做到的…… 那针对此目标,我们来说如果使用U3D,应该如何

Cocos2d-JS中使用CocosStudio资源——关卡选择界面

在本篇博客中,我们将通过一个在Cocos2d-JS中使用从CocosStudio导出的关卡选择界面资源的例子,来简要介绍以下内容:Button控件,Text控件,PageView控件,即翻页容器的使用. 一.CocosStudio准备 第一步:从官网下载相应的示例,LevelSelection.效果图如下: 第二步:修改其中的一些控件的名称,方便寻找获取,如: 由于官网给的例子中的控件名字有的较复杂,所以可以按照自己的想法进行修改. 第三步:发布资源.注意发布设置中应该将数据格式改为JSON格式

android中选择控件与选择界面自然过度效果的实现--一种新的交互设计

转载请标明出处: http://blog.csdn.net/jianghejie123/article/details/40648931 在安卓中经常遇到须要选择一个东西的功能,比方选择日期.选择文件,选择地点等,通常我们的做法是使用选择对话框.比方选择日期用datepicker,有时候也使用activity,可是这两种方式都有一个缺点,就是用户非常明显的感觉到了界面之间的切换. 有时候.以下这样的选择数据的交互方式应该会更好些: 事实上上面的app效果来自与CapitaineTrain应用,好

android 视频播放器选择界面弹出机制

1,file manager与videos识别视频的机制不同 a)   file manager简单根据后缀识别,3gp.mp4和avi分别被认为是三种不同的视频格式,因此会分别弹出视频播放器选择界面 b)   videos中视频识别是按照文件mimetype来设定,3gp属于简化的mp4,可以认为是同一类文件.在android设计里3gp和mp4文件使用同一个parser,两种文件的mimetype 也一致,都是video/mp4.由于android default将3gp和mp4使用同一个m

Android照片选择界面

package cc.vv.btongbaselibrary.ui.view.imagepicker; import android.Manifest;import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.ObjectAnimator;import android.app.Activity;import android.app.Aler