最终效果图


英雄联盟皮肤选择


设计说明

实现目标所需要的动作

移动(Moveto),伸缩(Scaleto),倾斜(OrbitCamera)


实现目标所需要函数(这是一个数学函数)

x/(x+a)

其中a为常量,用来计算上面三个动作的值

大小

与原版Menu不同,大小不是全屏的,默认是屏幕的(2/3),可以通过setContentSize()函数设置

_index变量

将所有的菜单项平铺构成一个长方形,_index表示目前在中间位置的点,如下图

显示方式

将菜单项距中心的距离(i-_indxe)作为函数变量x,具体内容查看LOLMenu::updatePosition();

操作说明

滑动四分之一菜单宽的距离为一个单位的_index,距离大于0.6小于1.0的部分进1

使用

使用这个菜单只要知道两个函数:

1.构造函数:LOLMenu::create()(由CREATE_FUNC创建)

2.添加MenuItem:void addMenuItem(cocos2d::MenuItem *item);

其它函数可以看代码

菜单代码

LOLMenu.h

#ifndef__LOL__TE_MENU_H__
#define__LOL__TE_MENU_H__
#include"cocos2d.h"
/*
*模仿英雄联盟的皮肤选择菜单
*不同点在于,英雄联盟当皮肤过多时,部分皮肤会移出边缘,不显示
*我会显示所以菜单项,向边缘移动会不断减缓
*/
class LOLMenu: public cocos2d::Layer{
:
//构造方法
CREATE_FUNC(LOLMenu);
//添加菜单项
void addMenuItem(cocos2d::MenuItem*item);
//位置矫正修改位置forward为移动方向当超过1/3,进1
//true为正向false负
rectify( bool forward);
//初始化
virtual init();
//重置显示所引号设置为0
reset();
//设置当前显示索引
void setIndex( int index);
//设置当前显示菜单项的索引号
float getIndex();
//返回被选中的item
cocos2d::MenuItem*getCurrentItem();
private :
//更新位置
updatePosition();
//更新位置,有动画
updatePositionWithAnimation();
//数学计算式width*index/(abs(index)+CALC_A),其中CALC_A为常数
float calcFunction( index, width);
:
//菜单菜单项的索引号
_index;
//上一次菜单项的索引号
_lastIndex;
//菜单项集合,_children顺序会变化,新建数组保存顺序
cocos2d::Vector<cocos2d::MenuItem*>_items;
//监听函数
onTouchBegan(cocos2d::Touch*touch,cocos2d::Event*event);
virtual onTouchEnded(cocos2d::Touch*touch,cocos2d::Event*event);
onTouchMoved(cocos2d::Touch*touch,cocos2d::Event*event);
//动画完结调用函数,这个主要是确定哪一个菜单项在前面
actionEndCallBack( dx);
//当前被选择的item
cocos2d::MenuItem*_selectedItem;
};
#endif

LOLMenu.cpp

#include"LOLMenu.h"
#include<math.h>
#definePIacos(-1)
//菜单的缩小比例最小的比例是1-MENU_SCALE
#defineMENU_SCALE0.3
//菜单的倾斜度最多为45度
#defineMENU_ASLOPE60.0
//calcFunction(x)为x/(x+a),其中a为常数
#defineCALC_A1
//动画运行时间
#defineANIMATION_DURATION0.3f
//菜单项的大小与屏幕的比例,当然可以通过setContentSize设置
#defineCONTENT_SIZE_SCALE(2.0/3)
//菜单项长度与菜单长度的比例滑动一个菜单项长度,菜单项变化一个
#defineITEM_SIZE_SCALE(1.0/4)
/*
代码里面还有可以设置的参数,这里没有一一例出或给出函数
*/
USING_NS_CC;
bool LOLMenu::init(){
if (!Layer::init())
return false ;
_index=0;
_lastIndex=0;
this ->ignoreAnchorPointForPosition( );
_selectedItem=nullptr;
autosize=Director::getInstance()->getWinSize();
->setContentSize(size*CONTENT_SIZE_SCALE);
->setAnchorPoint(Vec2(0.5f,0.5f));
autolistener=EventListenerTouchOneByOne::create();
listener->onTouchBegan=CC_CALLBACK_2(LOLMenu::onTouchBegan, );
listener->onTouchMoved=CC_CALLBACK_2(LOLMenu::onTouchMoved,monospace!important; font-size:1em!important; min-height:inherit!important; color:black!important">);
listener->onTouchEnded=CC_CALLBACK_2(LOLMenu::onTouchEnded,monospace!important; font-size:1em!important; min-height:inherit!important; color:black!important">);
getEventdispatcher()->addEventListenerWithSceneGraPHPriority(listener,monospace!important; font-size:1em!important; min-height:inherit!important; color:black!important">);
true ;
};
void LOLMenu::addMenuItem(cocos2d::MenuItem*item){
item->setPosition( ->getContentSize()/2);
->addChild(item);
_items.pushBack(item);
reset();
//如果希望开始没有移动效果,改成updatePosition函数即可
updatePositionWithAnimation();
return ;
}
LOLMenu::updatePosition(){
automenuSize=getContentSize();
for ( int i=0;i<_items.size();i++){
//设置位置
float x=calcFunction(i-_index,menuSize.width/2);
_items.at(i)->setPosition(Vec2(menuSize.width/2+x,menuSize.height/2));
//设置zOrder,即绘制顺序
_items.at(i)->setZOrder(- abs ((i-_index)*100));
//设置伸缩比例
_items.at(i)->setScale(1.0- (calcFunction(i-_index,MENU_SCALE)));
//设置倾斜,Node没有setCamera函数,将OrbitCamera的运行时间设为0来达到效果
autoorbit1=OrbitCamera::create(0,1,calcFunction(i-_lastIndex,MENU_ASLOPE),MENU_ASLOPE)-calcFunction(i-_index,0);
_items.at(i)->runAction(orbit1);
}
;
}
LOLMenu::updatePositionWithAnimation(){
//先停止所有可能存在的动作
i=0;i<_items.size();i++)
_items.at(i)->stopAllActions();
automenuSize=getContentSize();
i=0;i<_items.size();i++){
((i-_index)*100));
automoveto=Moveto::create(ANIMATION_DURATION,Vec2(menuSize.width/2+x,menuSize.height/2));
_items.at(i)->runAction(moveto);
autoscaleto=Scaleto::create(ANIMATION_DURATION,(1- ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,MENU_SCALE))));
_items.at(i)->runAction(scaleto);
autoorbit1=OrbitCamera::create(ANIMATION_DURATION,calcFunction(i-_index,MENU_ASLOPE)-calcFunction(i-_lastIndex,0);
_items.at(i)->runAction(orbit1);
}
scheduleOnce(schedule_selector(LOLMenu::actionEndCallBack),ANIMATION_DURATION);
;
}
LOLMenu::reset(){
_lastIndex=0;
_index=0;
}
LOLMenu::setIndex( index){
_lastIndex=_index;
->_index=index;
}
LOLMenu::getIndex(){
_index;
}
MenuItem*LOLMenu::getCurrentItem(){
(_items.size()==0)
nullptr;
_items.at(_index);
}
LOLMenu::onTouchBegan(Touch*touch,Event*event){
//先停止所有可能存在的动作
i=0;i<_items.size();i++)
_items.at(i)->stopAllActions();
(_selectedItem)
_selectedItem->unselected();
autoposition= ->convertToNodeSpace(touch->getLocation());
autosize= ->getContentSize();
autorect=Rect(0,size.width,size.height);
(rect.containsPoint(position)){
;
}
;
}
LOLMenu::onTouchEnded(Touch*touch,Event*event){
autosize=getContentSize();
autoxDelta=touch->getLocation().x-touch->getStartLocation().x;
rectify(xDelta>0);
( (xDelta)<size.width/24&&_selectedItem)
_selectedItem->activate();
updatePositionWithAnimation();
;
}
LOLMenu::onTouchMoved(Touch*touch,Event*event){
autoxDelta=touch->getDelta().x;
autosize=getContentSize();
_lastIndex=_index;
_index-=xDelta/(size.width*ITEM_SIZE_SCALE);
updatePosition();
;
}
LOLMenu::rectify( forward){
autoindex=getIndex();
(index<0)
index=0;
(index>_items.size()-1)
index=_items.size()-1;
(forward){
index=( )(index+0.4);
}
else
)(index+0.6);
setIndex(( )index);
}
LOLMenu::actionEndCallBack( dx){
_selectedItem=getCurrentItem();
(_selectedItem)
_selectedItem->selected();
}
LOLMenu::calcFunction( index, width){
width*index/( (index)+CALC_A);
}
LOLMenuDemo.cpp

#include"LOLMenuDemo.h"

基于Cocos2d-x的英雄联盟皮肤选择菜单的更多相关文章

  1. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  2. ios – 将两个字符串转换为一组布尔值的快速方法是什么?

    我有一个长字符串,我想转换为一个布尔值数组.而且它需要很多次,很快.我天真的尝试是这样的:但这比我想要的要慢很多.我的剖析告诉我,地图是减速的地方,但我不知道我能做多么简单.我觉得如果没有Swift’s/ObjC的开销,这样做会很快.在C中,我认为这是一个简单的循环,其中一个字节的内存与一个常量进行比较,但我不知道我应该看的是什么函数或语法.有更好的办法吗?

  3. ios – .rangeOfString()与Swift中的开关

    我想检查我的输入是否有一个rangeOfString必须要检查很多不同的字符串.基本上这个if语句,但使用开关来检查不同字符串的大列表我试过这样做但是没有用.解决方法虽然其他答案可能是正确的,如果是一个更好的方式,你可以通过英雄滥用=运算符做这样的事情:Swift中的switch语句可以通过=运算符的重载来扩展.例如,这是有效的原因:是因为有一个=运算符的定义,它将任何类型的Comparable类

  4. swift中string操作

    在swift中得string操作和OC稍有不同。一些基本操作苹果文档已经有描述。但是关于index的操作则没有提到。如果想删除或者得到字串,首先需要得到String.Index这个类型和Int不同,不能直接转换,所以需要用到advance函数。比如上面的例子,就是获取最后一个字符,然后删除之。

  5. Swift enumerate函数与??操作符

    本文的Swift语言版本,1.2先看看问题把这两个数组合成一个字典期望的合成后结果我给出的答案:能解决问题,但是不够优雅,不够简洁,因为我对Swift很多global的函数掌握的不是很好,最近开发项目还是用OC。Accept的答案enumerate函数-Swift1.2遍历数组和字符串的方式,同时返回index以及数据输出遍历数组的例子输出??操作符例如理解为这个a不为nil的话返回a,否则返回b。所以,在Swift中,这样的语法都可以进行简化。上文的例子就是如果dic[date]为nil,则dic[da

  6. Swift1

    Swift主要是用来干嘛的呢?Swift用来写ios和osx程序;Swift吸取了C和Objective-C的优点,且更加强大易用,特别注意一点,在写Swift语言的时候,可以不用在加“;”了,当然加上也可以。Swift可以使用现有的Cocoa和CocoaTouch框架;Swift兼具编译语言的高性能和脚本语言的交互性;学习Swift可以参照TheSwiftProgrammingLanguage这本官方参考书。

  7. 早期Swift中Cocos2D初始化代码的重构

    但是遗憾的是Swift2.2中还是不支持Type的class属性关键字,只能用static,我们期待Swift3的改进吧!

  8. Swift 不完全函数第 1 部分:如何避免

    实际上,预处理并避免不完全函数能够让我们的程序无论在如何情况下都能可靠地运行。Swift有一个函数precondition就是用来干这个的:测试条件是否满足,并在不满足的情况下触发一个致命错误。事实上在Swift标准库中,几乎每个Swift程序都在间接地使用这种方式,包括了各种和precodition函数类似的断言。不完全函数前置条件会让函数中的某个参数的取值范围缩小为函数签名中指明的范围的一部分。在不完全函数中,已定义的输入值的子集称作已定义域。

  9. Swift enumerate函数

    本文的Swift语言版本,1.2先看看问题把这两个数组合成一个字典期望的合成后结果我给出的答案:能解决问题,但是不够优雅,不够简洁,因为我对Swift很多global的函数掌握的不是很好,最近开发项目还是用OC。以后遇到了我没掌握好的,就用博客记录下来。参考答案enumerate函数-Swift1.2遍历数组和字符串的方式,同时返回index以及数据输出遍历数组的例子输出

  10. 手把手教你swift项目添加cocos2dx-lua

    去倒杯水吧,这个过程会很久。。。至此,工程已经全部配置完毕,你已经解决一个大Boss了;今天就到这里吧,之后我们再续如何用swift调用lua手把手教你swift项目添加cocos2dx-lua

随机推荐

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

返回
顶部