关于cocos2d-JS开发看过两本书,《Cocos2d-JS开发之旅》和《Cocos2d-x实战-JS卷》,两本书都不错,各有特点,但是在实际开发中,有很多关于常用的控件这两本书并没有详细的阐述,因此,
关于cocos2d-JS开发看过两本书,《Cocos2d-JS开发之旅》和《Cocos2d-x实战-JS卷》,两本书都不错,各有特点,但是在实际开发中,有很多关于常用的控件这两本书并没有详细的阐述,因此,在接下来的开发中,我会把一些常用的控件,比如TableView和CollectionView之类的使用技巧和说明,会不断更新在此文章中。
1、Cocos Studio ListView 控件监听
if(!cc.Layer.prototype.init.call(this)) { return false; } var objView = ccs.csLoader.createNode(res.StageInfo_Json); this.addChild(objView);
this._tableViewItem1 = ccui.helper.seekWidgetByName(objView, "Tablelist_Item1"); this._tableViewItem1.setScrollBarEnabled(false); this._tableViewItem1.addEventListener(this.onSelectedItemEvent.bind(this), this); this._tableViewItem2 = ccui.helper.seekWidgetByName(objView, "Tablelist_Item2"); this._tableViewItem2.setScrollBarEnabled(false); this._tableViewItem2.addEventListener(this.onSelectedItemEvent.bind(this), this);
onSelectedItemEvent: function (sender, type) { switch (type) { case ccui.ListView.EVENT_SELECTED_ITEM: break; case ccui.ListView.ON_SELECTED_ITEM_END: // alert(sender.getName() + " " + sender.getCurSelectedIndex()); this.showDetail(sender.getCurSelectedIndex()); break; default: break; } }说明:很多时候使用Cocos Studio工具生成的控件,仅仅使用一个坐标而已。
var listView = ccui.helper.seekWidgetByName(objView, "Tablelist"); listView.setScrollBarEnabled(false); this._tableView = new cc.TableView(this, listView.getContentSize()); this._tableView.x = listView.x; this._tableView.y = listView.y; this._tableView.setDelegate(this); this.addChild(this._tableView); numberOfCellsInTableView: function (table) { return this._players.length; }, tableCellSizeForIndex: function (table, idx) { return this._cellSize; }, tableCellAtIndex: function (table, idx) { var att = this._players[idx]; var cell = table.dequeueCell(); if(cell == null) { cell = new FightListCell(); } cell._player = att; cell._labelName.setString(att.Name); cell._labelFight.setString("战斗力:" + DataManager.getNumberText(att.Fight)); cell._labelReward.setString(DataManager.getNumberText(att.PresentRes.Amount)); cell._TGAmount = this._res.TGAmount; cell._res = this._res; var url = NetProxy.HostBaseUrl + att.IconId; cell._imgIcon.setScale(0.8); DataManager.loadUrlImage(url, cell._imgIcon); var sprite = cc.Sprite.create("res/gui/PlayerBox.png"); sprite.setPosition(cell._imgIcon.getPosition()); cell.addChild(sprite); return cell; }, tableCellTouched:function (table, cell) { }
如果需要多行多列显示,那么就得用CollectionView了:
var listView = ccui.helper.seekWidgetByName(objView, "Tablelist");
listView.setScrollBarEnabled(false);
this.m_tableView = new cc.CollectionView(this, cc.size(listView.getContentSize().width, listView.getContentSize().height));
this.m_tableView.setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL);
this.m_tableView.x = listView.getPositionX();
this.m_tableView.y = listView.getPositionY();
this.m_tableView.setDelegate(this);
this.addChild(this.m_tableView);
tableCellSizeForIndex: function (table, idx) { if(this.m_type == 3 && (idx > this.m_flag-5 && idx <= this.m_flag)) { return cc.size(110, 25); } return this.m_cellSize; }, numberOfCellsInTableView: function () { if(!this.m_items){ return 0; } return this.m_items.length; }, cellSizeForTable: function (table) { // return table.getContentSize(); return cc.size(580, 130); }, tableCellAtIndex: function (table, idx) { var itemAtt = this.m_items[idx]; var cell = null; // var cell = table.dequeueCell(); if(!cell){ cell = new InventoryCell(); } cell.m_inventory = itemAtt; if(itemAtt.Id != 0){ //空行的Id==0 var pic = ""; if(this.m_type == 1) { cell.m_level.setString("Lv." + itemAtt.Level); pic = "res/pic/Equip/" + itemAtt.IconId + ".png"; } else if(this.m_type == 2) { cell.m_level.setString(itemAtt.Amount); pic = "res/pic/Gems/" + itemAtt.IconId + ".png"; } else if(this.m_type == 3) { if(idx < this.m_gemsNoEquip.length) { cell.m_level.setString(itemAtt.Amount); } else { cell.m_level.setString(itemAtt.EqpAmount); } pic = "res/pic/Gems/" + itemAtt.IconId + ".png"; } else if(this.m_type == 4) { cell.m_level.setString(itemAtt.Amount); pic = "res/pic/Gems/" + itemAtt.IconId + ".png"; } } else { if(idx == this.m_flag-4) { cell = new CombatCell(); cell._Time.setVisible(false); cell._Info.setString(" ------已装备宝石------") } else { cell.m_level.setVisible(false); cell.m_image.setVisible(false); // cell.m_box.setVisible(false); } return cell; } // this.changeNodeTexture2(pic, "image_Equipment", cell); this.createImage2(this.createIcon(itemAtt.IconId), "image_Equipment", cell); return cell; }, tableCellTouched: function (table, cell) { if(cell.m_inventory.Id != 0){ if(this.m_type == 1) { // SceneManager.addLayer(cc.LAYER_EQUIPUI, cell.m_inventory); var ui = SceneManager.addLayer(cc.LAYER_EQUIPUI, null, true, cc.LAYER_ANI_NONE, true); if (ui) { //替换装备与装备相关操作 ui.initEquipUI(null, cell.m_inventory); } } else if(this.m_type == 3) { SceneManager.addLayer(cc.LAYER_GEMINFO, cell.m_inventory); } else { SceneManager.addLayer(cc.LAYER_ITEMINFO, cell.m_inventory); } } }CollectionView比TableView需要多实现一个方法,CellSizeForTable return table.getContentSize(); 但这样写,我这里出现bug,刷新列表时,即
this.m_tableView.reloadData(),会出现所有行都重叠到第一行中的bug,debug发现table.getContentSize的值为(0,0)所致。所以索性直接传入 return cc.size(580, 130);
2、TableView实现可拖动的地图
/** *世界地图 */ WorldMapCell = cc.TableViewCell.extend({ _btnStage: [], _imgPath: [], _wordMap: null, _imgPosition: null, ctor: function () { this._super(); this.init(); }, init: function () { this._super(); var cell = ccs.csLoader.createNode(res.WorldMapCell_Json); this.addChild(cell); for(var i = 0; i < 30; i++) { this._btnStage[i] = ccui.helper.seekWidgetByName(cell, "btnStage" + (i+1)); this._btnStage[i].setVisible(false); this._btnStage[i].addTouchEventListener(this.onButtonClick, this); if(i < 29) { this._imgPath[i] = ccui.helper.seekWidgetByName(cell, "WorldMap_Path" + (i+1)); this._imgPath[i].setVisible(false); } } this._imgPosition = ccui.helper.seekWidgetByName(cell, "PlayerMarker"); this._imgPosition.setScale(0.4); return true; }, onButtonClick: function (sender, type) { switch (type) { case ccui.Widget.TOUCH_ENDED: if(sender.getName().substr(0, 8) == "btnStage") { SceneManager.addLayer(cc.LAYER_STAGEINFO, sender.getName().substr(8)); } break; default: break; } } }) WorldMapUI = BaseUI.extend({ _Prompt0:null, _Prompt1:null, _TCoinNum:null, _labelSweep:null, _size: null, _cellSize: null, _worldMap1: null, _worldMap2: null, _worldMap3: null, _scrollView: null, _btnExit: null, _btnAdd: null, _layer: null, _dots: null, _listener: null, ctor:function() { this._super(); this._dots = new Array(); var cell = ccs.csLoader.createNode(res.WorldMapCell_Json); this._cellSize = cell.getContentSize(); var Main= ccs.csLoader.createNode(res.WorldMapUI_Json); this.addChild(Main); this._size = cc.director.getWinSize(); this._btnExit = ccui.helper.seekWidgetByName(Main, "btnReturn"); this._btnExit.addTouchEventListener(this.onMainMenuClick, this); this._btnAdd = ccui.helper.seekWidgetByName(Main, "btnAdd00"); this._btnAdd.addTouchEventListener(this.onMainMenuClick, this); this._labelSweep = ccui.helper.seekWidgetByName(Main, "label_NuSweep"); this._scrollView = ccui.helper.seekWidgetByName(Main, "Tablelist_WorldMap"); this._scrollView.setScrollBarEnabled(false); this._scrollView.setDirection(ccui.ScrollView.DIR_BOTH); this._scrollView.setInnerContainerSize(cell.getContentSize()); this._scrollView.setInertiaScrollEnabled(true); var item = new ccui.Layout(); // var cell = ccs.csLoader.createNode(res.WorldMapCell_Json); var cell = new WorldMapCell(); cell._wordMap = this; item.setContentSize(cell.getContentSize()); // var currentPveBig = DataManager.playerAtt.PveId; var currentPveBig = 1; var currentPve = 3; this.getCellPoints(cell._btnStage, currentPveBig); for(var i = 0; i < this._dots.length - currentPve; i ++) { cell.addChild(this._dots[i]); } for(var i = 0; i < currentPveBig; i++) { cell._btnStage[i].setVisible(true); if(i < currentPveBig-1){ cell._imgPath[i].setVisible(true); } } cell._imgPosition.setPosition(this._dots[this._dots.length - currentPve].getPosition()); item.addChild(cell); this._scrollView.addChild(item); }, bindData:function(json) { return true; }, onMainMenuClick:function(sender,type) { switch (type) { case ccui.Widget.TOUCH_ENDED: if (sender.getName() == "btnReturn") { SceneManager.removeLayer(cc.LAYER_WORLDMAP); } else if (sender.getName() == "btnAdd00") { alert("购买扫荡次数"); } break; default: break; } }, getCellPoints: function (btns, index) { for(var i = 0; i < btns.length - 1; i++) { if(i >= index) { break; } this.createDot(btns[i].getPositionX(), btns[i].getPositionY(), btns[i+1].getPositionX(), btns[i+1].getPositionY()); } }, createDot: function (x1, y1, x2, y2) { var xA = (x2-x1)/6; var yA = (y2-y1)/6; for(var i = 0; i < 5; i++) { var dot = new cc.Sprite("res/gui/WorldMap_pic04.png"); dot.x = x1 += xA; dot.y = y1 += yA; this._dots.push(dot); } }, }); WorldMapUI.create = function() { return new WorldMapUI(); };
3、特效播放
/** * 单抽获得 * Created by xj on 2017/1/16. */ DrawUI = BaseUI.extend({ m_size: null, m_confirm: null, m_drawAgain: null, m_img: null, m_name: null, m_type: null, //抽卡类型:1,免费单抽;2,免费十连;3,钻石单抽;4、钻石十连 m_json: null, m_labelConfirm: null, m_labelDraw: null, m_armature: null, m_btnItem: null, ctor: function () { BaseUI.prototype.ctor.call(this); this.init(); }, init: function () { if(!cc.Layer.prototype.init.call(this)) { return false } this.m_size = cc.director.getWinSize(); var drawDode = new cc.DrawNode(); this.addChild(drawDode); drawDode.drawRect(cc.p(0, 0), cc.p(this.m_size.width, this.m_size.height), cc.color(0, 0, 0, 210)); var objView = ccs.csLoader.createNode(res.DrawUI_Json); this.addChild(objView); this.m_confirm = ccui.helper.seekWidgetByName(objView, "btnConfirm"); this.m_drawAgain = ccui.helper.seekWidgetByName(objView, "btnDrawAgain"); this.m_img = ccui.helper.seekWidgetByName(objView, "image_Reward"); this.m_name = ccui.helper.seekWidgetByName(objView, "label_NameNumber"); this.m_labelConfirm = ccui.helper.seekWidgetByName(objView, "label_Confirm"); this.m_labelDraw = ccui.helper.seekWidgetByName(objView, "label_DrawAgain"); this.m_btnItem = ccui.helper.seekWidgetByName(objView, "btnItem"); this.m_confirm.addTouchEventListener(this.onButtonClick, this); this.m_drawAgain.addTouchEventListener(this.onButtonClick, this); this.m_btnItem.addTouchEventListener(this.onButtonClick, this); this.hideWidget(); return true; }, bindData: function (type) { this.m_type = type; if(type == 1) { ShopApi.Lottery(1, this, this.callbackLottery); } else { ShopApi.Lottery(3, this, this.callbackLottery); } }, hideWidget: function () { this.m_img.setVisible(false); this.m_name.setVisible(false); this.m_drawAgain.setVisible(false); this.m_labelDraw.setVisible(false); this.m_confirm.setVisible(false); this.m_labelConfirm.setVisible(false); }, callbackLottery: function (target, json) { this.m_json = json; //特效 ccs.armatureDataManager.addArmatureFileInfo(res.Draw_ExportJson); this.m_armature = new ccs.Armature("SingleCardE"); this.m_armature.getAnimation().play("PLAY1", -1, 0); //不循环 this.m_armature.setPosition(this.m_img.getPosition()); this.m_armature.getAnimation().setMovementEventCallFunc(this.showReward, this); this.addChild(this.m_armature); DataManager.postNotification(cc.NOTIFICATION_REFRESHSHOP, null); }, showReward: function () { this.m_img.setVisible(true); this.m_name.setVisible(true); var rewards = this.m_json.Content; // this.changeNodeTexture(this.getTextureFullPath(rewards[0].IconId), "image_Reward"); this.createImage(this.createIcon(rewards[0].IconId), "image_Reward"); this.m_name.setString(rewards[0].Name + " x" + rewards[0].Amount); this.schedule(this.showBtn, 0.6); }, showBtn: function () { this.m_labelDraw.setVisible(true); this.m_labelConfirm.setVisible(true); this.m_drawAgain.setVisible(true); this.m_confirm.setVisible(true); this.unschedule(this.showBtn); }, onButtonClick: function (sender, type) { switch (type) { case ccui.Widget.TOUCH_ENDED: if(sender.getName() == "btnConfirm") { SceneManager.removeLayer(cc.LAYER_DRAW); } else if(sender.getName() == "btnDrawAgain") { if(this.m_type == 1) { this.hideWidget(); ShopApi.Lottery(1, this, this.callbackLottery); } else { ShopApi.Lottery(3, this, this.callbackLottery); } } else if(sender.getName() == "btnItem") { SceneManager.addLayer(cc.LAYER_ITEMINFO, this.m_json.Content[0]); } break; default: break; } } }) DrawUI.create = function () { return new DrawUI(); }