700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 《Cocos Creator游戏实战》实现下拉框按钮ComboBox控件

《Cocos Creator游戏实战》实现下拉框按钮ComboBox控件

时间:2021-05-19 05:18:37

相关推荐

《Cocos Creator游戏实战》实现下拉框按钮ComboBox控件

实现下拉框按钮ComboBox控件

创建节点

编写脚本

该功能已收录在Many Widgets插件中,使用Cocos Creator 3.x版本的小伙伴可以用该插件快速生成下拉框ComboBox控件。

插件地址:/app/detail/3147

演示地址:/video/BV113411q7vJ/

官方目前并没有在Cocos Creator中提供ComboBox控件,不过我们自己完全可以做一个,实现起来并不难。

运行效果如下:

Cocos Creator版本:2.2.0

公众号后台回复"下拉框",获取完整项目源码:

创建节点

1. bg只是一个Sprite节点,用来当做画布背景。

2. 重点是combobox节点。它其实是一个按钮,background子节点为按钮背景,triangle子节点类型同样为Sprite,而label就是按钮上的文本了。

我们将combobox节点上的按钮组件Transition属性设置为None(之后笔者将通过三角形图片的旋转来体现玩家点击操作):

注:关于所有节点的坐标、锚点和大小设置,笔者这里就不再截图,大家可以直接打开项目查看(大家当然也可以根据自己喜好来调整)。

我们给triangle和label节点挂上Widget组件,让他们在按钮上的相对位置固定:

triangle

label

label节点上的Label组件设置如下(默认文本为Cocos Creator,Overflow建议设置成SHRINK):

按钮现在做好了,可以做下拉框了。下拉框我们用ScrollView控件来做,在combobox节点下创建一个dropDown节点:

现将其修改如下:

1. 将原先content节点下的item子节点删掉,换成vLayout节点(垂直布局)。

2. 在vLayout节点下有一个labelBtnItem按钮节点(已将background删掉)。

笔者这里的思路是:下拉框中的每一项内容都是按钮,当玩家点击某个按钮后,combobox下的label节点文本就直接替换为相应按钮上的文本。所有的按钮都放在垂直布局中,方便排版。

查看项目时,大家可以看到笔者将dropDown,view,content和vLayout这几个节点的大小和锚点全部设置成一样的了,大家当然也可以根据自己想法改。笔者设置好后是这个样子:

现在有一个问题:下拉框中的选项怎么添加?

我们自然而然想到将labelBtnItem变为预制,然后在脚本中创建一个包含所有下拉框选项的数组,循环该数组创建各个预制即可。

编写脚本

新建一个ComboBox.js脚本,将其挂到combobox节点上。

我们在properties中添加如下属性:

// ComboBox.jsproperties: {triangle: cc.Node,// 下拉按钮右边的小三角形comboLabel: cc.Label, // 下拉按钮上显示的文本dropDown: cc.Node,// 下拉框vLayoutNode: cc.Node, // 垂直布局contentNode: cc.Node, // 滚动视图内容itemPrefab: cc.Prefab // 下拉框选项},

首先完成"点击出现下拉框"这个功能。在onLoad中新建this.isDropDown布尔类型变量,用于判断当前下拉状态:

// ComboBox.jsonLoad () {// 是否已经下拉this.isDropDown = false;}

编写rotateTriangle方法旋转小三角图案:

// ComboBox.jsrotateTriangle () {// 旋转小三角形(正值为逆时针,负值为顺时针)if (!this.isDropDown) {let rotateAction = cc.rotateTo(0.5, 180).easing(cc.easeCubicActionOut());this.triangle.runAction(rotateAction);}else {let rotateAction = cc.rotateTo(0.5, -90).easing(cc.easeCubicActionOut());this.triangle.runAction(rotateAction);}},

点击前:

点击后:

编写showHideDropDownBox方法来显示与隐藏下拉框:

// ComboBox.jsshowHideDropDownBox () {// 下拉框显示与隐藏if (!this.isDropDown) this.dropDown.active = true;else this.dropDown.active = false;},

注:要先将dropDown节点设置为不可见。

点击前:

点击后:

编写comboboxClicked按钮方法,每当玩家点击了combobox按钮后(记得要绑定该方法),小三角形和下拉框作出相应操作:

// ComboBox.jscomboboxClicked () {// 旋转小三角形this.rotateTriangle();// 下拉框显示与隐藏this.showHideDropDownBox();// 改变isDropDown值if (!this.isDropDown)this.isDropDown = true;else this.isDropDown = false;},

记得最后要改变this.isDropDown的值。

现在来添加下拉框中的选项内容。在onLoad中创建选项数组并调用initItems方法:

// ComboBox.jsonLoad () {// 是否已经下拉this.isDropDown = false;// 下拉框选项内容this.itemArray = ['Cocos Creator', 'Cocos-2dx', 'Cocos2d-js', 'Cocos2d-Lua', 'Cocos Creator 3D', 'Cocos Service', 'Cocos社区'];this.initItems();},

initItems方法编写如下:

// ComboBox.jsinitItems () {// 根据数组初始化下拉框中的各个选项内容let totalHeight = 0;for (let i=0; i<this.itemArray.length; i++) {let item = cc.instantiate(this.itemPrefab);item.children[0].getComponent(cc.Label).string = this.itemArray[i];item.getComponent('Item').initComboBox(this);this.vLayoutNode.addChild(item);totalHeight += item.height;}// 设置content高度if (totalHeight > this.contentNode.height) this.contentNode.height = totalHeight;}

根据数组元素创建相应的预制,各个预制之后都被添加到了vLayoutNode中。

注:我们要根据所有预制的长度总和来调整content节点的长度,否则选项内容过多的话,在滚动视图上不会显示完整的。

大家应该注意到了item.getComponent('Item').initComboBox(this);这行代码,也就是说每个预制上其实挂有一个Item.js脚本,在该脚本中我们将下拉按钮上的文本替换成了被点击按钮上的文本:

// Item.jscc.Class({extends: ponent,properties: {},// LIFE-CYCLE CALLBACKS:// onLoad () {},initComboBox (cb) {this.cb = cb;},itemBtn (event) {// 子项点击后改变下拉按钮上的文本boLabel.string = event.target.children[0].getComponent(cc.Label).string;// 选择后改变小三角和下拉框显示boboxClicked();},// update (dt) {},});

好的,教程到这就结束了,希望大家有所收获!

欢迎关注我的微信公众号,发现更多有趣内容:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。