objects as items.
* The images has 3 different states:
* - unselected image
* - selected image
* - disabled image
* @class
* @extends cc.MenuItem
* @param {Image|Null} normalSprite normal state image
* @param {Image|Null} selectedSprite selected state image
* @param {Image|cc.Node|Null} three disabled state image OR target node
* @param {String|function|cc.Node|Null} four callback function name in string or actual function, OR target Node
* @param {String|function|Null} five callback function name in string or actual function
*
* @example
* var item = new cc.MenuItemSprite(normalImage)//create a menu item from a sprite with no functionality
* var item = new cc.MenuItemSprite(normalImage, selectedImage)//create a menu Item, nothing will happen when clicked
* var item = new cc.MenuItemSprite(normalImage, SelectedImage, disabledImage)//same above, but with disabled state image
* var item = new cc.MenuItemSprite(normalImage, SelectedImage, 'callback', targetNode)//create a menu item, when clicked runs targetNode.callback()
* var item = new cc.MenuItemSprite(normalImage, SelectedImage, disabledImage, targetNode.callback, targetNode)
* //same as above, but with disabled image, and passing in callback function
*
* @property {cc.Sprite} normalImage - Sprite in normal state
* @property {cc.Sprite} selectedImage - Sprite in selected state
* @property {cc.Sprite} disabledImage - Sprite in disabled state
*/
cc.MenuItemSprite = cc.MenuItem.extend(/** @lends cc.MenuItemSprite# */{
_normalImage: null,
_selectedImage: null,
_disabledImage: null,
/**
* Constructor of cc.MenuItemSprite
* @param {Image|Null} normalSprite normal state image
* @param {Image|Null} selectedSprite selected state image
* @param {Image|cc.Node|Null} three disabled state image OR target node
* @param {String|function|cc.Node|Null} four callback function name in string or actual function, OR target Node
* @param {String|function|Null} five callback function name in string or actual function
*/
ctor: function (normalSprite, selectedSprite, three, four, five) {
cc.MenuItem.prototype.ctor.call(this);
this._normalImage = null;
this._selectedImage = null;
this._disabledImage = null;
if (selectedSprite !== undefined) {
normalSprite = normalSprite;
selectedSprite = selectedSprite;
var disabledImage, target, callback;
//when you send 4 arguments, five is undefined
if (five !== undefined) {
disabledImage = three;
callback = four;
target = five;
} else if (four !== undefined && typeof four === "function") {
disabledImage = three;
callback = four;
} else if (four !== undefined && typeof three === "function") {
target = four;
callback = three;
disabledImage = cc.Sprite.create(selectedSprite);
} else if (three === undefined) {
disabledImage = cc.Sprite.create(selectedSprite);
}
this.initWithNormalSprite(normalSprite, selectedSprite, disabledImage, callback, target);
}
},
/**
* return the normal status image(cc.Sprite)
* @return {cc.Sprite}
*/
getNormalImage: function () {
return this._normalImage;
},
/**
* set the normal status image(cc.Sprite)
* @param {cc.Sprite} normalImage
*/
setNormalImage: function (normalImage) {
if (this._normalImage == normalImage) {
return;
}
if (normalImage) {
this.addChild(normalImage, 0, cc.NORMAL_TAG);
normalImage.anchorX = 0;
normalImage.anchorY = 0;
}
if (this._normalImage) {
this.removeChild(this._normalImage, true);
}
this._normalImage = normalImage;
this.width = this._normalImage.width;
this.height = this._normalImage.height;
this._updateImagesVisibility();
if (normalImage.textureLoaded && !normalImage.textureLoaded()) {
normalImage.addLoadedEventListener(function (sender) {
this.width = sender.width;
this.height = sender.height;
}, this);
}
},
/**
* return the selected status image(cc.Sprite) of cc.MenuItemSprite
* @return {cc.Sprite}
*/
getSelectedImage: function () {
return this._selectedImage;
},
/**
* set the selected status image(cc.Sprite)
* @param {cc.Sprite} selectedImage
*/
setSelectedImage: function (selectedImage) {
if (this._selectedImage == selectedImage)
return;
if (selectedImage) {
this.addChild(selectedImage, 0, cc.SELECTED_TAG);
selectedImage.anchorX = 0;
selectedImage.anchorY = 0;
}
if (this._selectedImage) {
this.removeChild(this._selectedImage, true);
}
this._selectedImage = selectedImage;
this._updateImagesVisibility();
},
/**
* return the disabled status of cc.MenuItemSprite
* @return {cc.Sprite}
*/
getDisabledImage: function () {
return this._disabledImage;
},
/**
* set the disabled status image(cc.Sprite)
* @param {cc.Sprite} disabledImage
*/
setDisabledImage: function (disabledImage) {
if (this._disabledImage == disabledImage)
return;
if (disabledImage) {
this.addChild(disabledImage, 0, cc.DISABLE_TAG);
disabledImage.anchorX = 0;
disabledImage.anchorY = 0;
}
if (this._disabledImage)
this.removeChild(this._disabledImage, true);
this._disabledImage = disabledImage;
this._updateImagesVisibility();
},
/**
* initializes cc.MenuItemSprite with a cc.Sprite
* @param {cc.Node} normalSprite
* @param {cc.Node} selectedSprite
* @param {cc.Node} disabledSprite
* @param {function|String} callback
* @param {cc.Node} target
* @return {Boolean}
*/
initWithNormalSprite: function (normalSprite, selectedSprite, disabledSprite, callback, target) {
this.initWithCallback(callback, target);
this.setNormalImage(normalSprite);
this.setSelectedImage(selectedSprite);
this.setDisabledImage(disabledSprite);
var locNormalImage = this._normalImage;
if (locNormalImage) {
this.width = locNormalImage.width;
this.height = locNormalImage.height;
if (locNormalImage.textureLoaded && !locNormalImage.textureLoaded()) {
locNormalImage.addLoadedEventListener(function (sender) {
this.width = sender.width;
this.height = sender.height;
this.cascadeColor = true;
this.cascadeOpacity = true;
}, this);
}
}
this.cascadeColor = true;
this.cascadeOpacity = true;
return true;
},
/**
* set the color for cc.MenuItemSprite
* @param {cc.Color} color
*/
setColor: function (color) {
this._normalImage.color = color;
if (this._selectedImage)
this._selectedImage.color = color;
if (this._disabledImage)
this._disabledImage.color = color;
},
/**
* return the color of cc.MenuItemSprite
* @return {cc.Color}
*/
getColor: function () {
return this._normalImage.color;
},
/**
* set the opacity for cc.MenuItemSprite
* @param {Number} opacity 0 - 255
*/
setOpacity: function (opacity) {
this._normalImage.opacity = opacity;
if (this._selectedImage)
this._selectedImage.opacity = opacity;
if (this._disabledImage)
this._disabledImage.opacity = opacity;
},
/**
* return the opacity of cc.MenuItemSprite
* @return {Number} opacity from 0 - 255
*/
getOpacity: function () {
return this._normalImage.opacity;
},
/**
* menu item is selected (runs callback)
*/
selected: function () {
cc.MenuItem.prototype.selected.call(this);
if (this._normalImage) {
if (this._disabledImage)
this._disabledImage.visible = false;
if (this._selectedImage) {
this._normalImage.visible = false;
this._selectedImage.visible = true;
} else
this._normalImage.visible = true;
}
},
/**
* menu item goes back to unselected state
*/
unselected: function () {
cc.MenuItem.prototype.unselected.call(this);
if (this._normalImage) {
this._normalImage.visible = true;
if (this._selectedImage)
this._selectedImage.visible = false;
if (this._disabledImage)
this._disabledImage.visible = false;
}
},
/**
* set cc.MenuItemSprite enable to receive the touch event
* @param {Boolean} bEnabled
*/
setEnabled: function (bEnabled) {
if (this._enabled != bEnabled) {
cc.MenuItem.prototype.setEnabled.call(this, bEnabled);
this._updateImagesVisibility();
}
},
_updateImagesVisibility: function () {
var locNormalImage = this._normalImage, locSelImage = this._selectedImage, locDisImage = this._disabledImage;
if (this._enabled) {
if (locNormalImage)
locNormalImage.visible = true;
if (locSelImage)
locSelImage.visible = false;
if (locDisImage)
locDisImage.visible = false;
} else {
if (locDisImage) {
if (locNormalImage)
locNormalImage.visible = false;
if (locSelImage)
locSelImage.visible = false;
if (locDisImage)
locDisImage.visible = true;
} else {
if (locNormalImage)
locNormalImage.visible = true;
if (locSelImage)
locSelImage.visible = false;
}
}
}
});
var _p = cc.MenuItemSprite.prototype;
// Extended properties
/** @expose */
_p.normalImage;
cc.defineGetterSetter(_p, "normalImage", _p.getNormalImage, _p.setNormalImage);
/** @expose */
_p.selectedImage;
cc.defineGetterSetter(_p, "selectedImage", _p.getSelectedImage, _p.setSelectedImage);
/** @expose */
_p.disabledImage;
cc.defineGetterSetter(_p, "disabledImage", _p.getDisabledImage, _p.setDisabledImage);
/**
* create a menu item from sprite
* @deprecated since v3.0 please use new cc.MenuItemSprite(normalSprite, selectedSprite, three, four, five) instead
* @param {Image} normalSprite normal state image
* @param {Image|Null} selectedSprite selected state image
* @param {Image|cc.Node|Null} three disabled state image OR target node
* @param {String|function|cc.Node|Null} four callback function name in string or actual function, OR target Node
* @param {String|function|Null} five callback function name in string or actual function
* @return {cc.MenuItemSprite}
* @example
* // Example
* var item = cc.MenuItemSprite.create(normalImage)//create a menu item from a sprite with no functionality
*
* var item = cc.MenuItemSprite.create(normalImage, selectedImage)//create a menu Item, nothing will happen when clicked
*
* var item = cc.MenuItemSprite.create(normalImage, SelectedImage, disabledImage)//same above, but with disabled state image
*
* var item = cc.MenuItemSprite.create(normalImage, SelectedImage, 'callback', targetNode)//create a menu item, when clicked runs targetNode.callback()
*
* var item = cc.MenuItemSprite.create(normalImage, SelectedImage, disabledImage, targetNode.callback, targetNode)
* //same as above, but with disabled image, and passing in callback function
*/
cc.MenuItemSprite.create = function (normalSprite, selectedSprite, three, four, five) {
return new cc.MenuItemSprite(normalSprite, selectedSprite, three, four, five || undefined);
};
/**
* cc.MenuItemImage accepts images as items.
* The images has 3 different states:
* - unselected image
* - selected image
* - disabled image
*
* For best results try that all images are of the same size
* @class
* @extends cc.MenuItemSprite
* @param {string|null} normalImage
* @param {string|null} selectedImage
* @param {string|null} disabledImage
* @param {function|string|null} callback
* @param {cc.Node|null} target
* @example
* var menuItem = new cc.MenuItemImage(normalImage, selectedImage, three, four, five);
*/
cc.MenuItemImage = cc.MenuItemSprite.extend(/** @lends cc.MenuItemImage# */{
/**
* Constructor of cc.MenuItemImage
* @param {string|null} normalImage
* @param {string|null} selectedImage
* @param {string|null} disabledImage
* @param {function|string|null} callback
* @param {cc.Node|null} target
*/
ctor: function (normalImage, selectedImage, three, four, five) {
var normalSprite = null,
selectedSprite = null,
disabledSprite = null,
callback = null,
target = null;
if (normalImage === undefined) {
cc.MenuItemSprite.prototype.ctor.call(this);
}
else {
normalSprite = cc.Sprite.create(normalImage);
selectedImage &&
(selectedSprite = cc.Sprite.create(selectedImage));
if (four === undefined) {
callback = three;
}
else if (five === undefined) {
callback = three;
target = four;
}
else if (five) {
disabledSprite = cc.Sprite.create(three);
callback = four;
target = five;
}
cc.MenuItemSprite.prototype.ctor.call(this, normalSprite, selectedSprite, disabledSprite, callback, target);
}
},
/**
* sets the sprite frame for the normal image
* @param {cc.SpriteFrame} frame
*/
setNormalSpriteFrame: function (frame) {
this.setNormalImage(cc.Sprite.create(frame));
},
/**
* sets the sprite frame for the selected image
* @param {cc.SpriteFrame} frame
*/
setSelectedSpriteFrame: function (frame) {
this.setSelectedImage(cc.Sprite.create(frame));
},
/**
* sets the sprite frame for the disabled image
* @param {cc.SpriteFrame} frame
*/
setDisabledSpriteFrame: function (frame) {
this.setDisabledImage(cc.Sprite.create(frame));
},
/**
* initializes a cc.MenuItemImage
* @param {string|null} normalImage
* @param {string|null} selectedImage
* @param {string|null} disabledImage
* @param {function|string|null} callback
* @param {cc.Node|null} target
* @returns {boolean}
*/
initWithNormalImage: function (normalImage, selectedImage, disabledImage, callback, target) {
var normalSprite = null;
var selectedSprite = null;
var disabledSprite = null;
if (normalImage) {
normalSprite = cc.Sprite.create(normalImage);
}
if (selectedImage) {
selectedSprite = cc.Sprite.create(selectedImage);
}
if (disabledImage) {
disabledSprite = cc.Sprite.create(disabledImage);
}
return this.initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, callback, target);
}
});
/**
* creates a new menu item image
* @deprecated since v3.0, please use new cc.MenuItemImage(normalImage, selectedImage, three, four, five) instead.
* @param {String} normalImage file name for normal state
* @param {String} selectedImage image for selected state
* @param {String|cc.Node} three Disabled image OR callback function
* @param {String|function|Null} [four] callback function, either name in string or pass the whole function OR the target
* @param {cc.Node|String|function|Null} [five] cc.Node target to run callback when clicked
* @return {cc.MenuItemImage}
* @example
* // Example
* //create a dom menu item with normal and selected state, when clicked it will run the run function from gameScene object
* var item = cc.MenuItemImage.create('normal.png', 'selected.png', 'run', gameScene)
*
* //same as above, but pass in the actual function and disabled image
* var item = cc.MenuItemImage.create('normal.png', 'selected.png', 'disabled.png', gameScene.run, gameScene)
*/
cc.MenuItemImage.create = function (normalImage, selectedImage, three, four, five) {
return new cc.MenuItemImage(normalImage, selectedImage, three, four, five);
};
/**
* A simple container class that "toggles" it's inner items
* The inner items can be any MenuItem
* @class
* @extends cc.MenuItem
*
* @property {Array} subItems - Sub items
* @property {Number} selectedIndex - Index of selected sub item
*
*@example
* // Example
* //create a toggle item with 2 menu items (which you can then toggle between them later)
* var toggler = new cc.MenuItemToggle( cc.MenuItemFont.create("On"), cc.MenuItemFont.create("Off"), this.callback, this)
* //Note: the first param is the target, the second is the callback function, afterwards, you can pass in any number of menuitems
*
* //if you pass only 1 variable, then it must be a cc.MenuItem
* var notYetToggler = new cc.MenuItemToggle(cc.MenuItemFont.create("On"));//it is useless right now, until you add more stuff to it
* notYetToggler.addSubItem(cc.MenuItemFont.create("Off"));
* //this is useful for constructing a toggler without a callback function (you wish to control the behavior from somewhere else)
*/
cc.MenuItemToggle = cc.MenuItem.extend(/** @lends cc.MenuItemToggle# */{
subItems: null,
_selectedIndex: 0,
_opacity: null,
_color: null,
/**
* Constructor of cc.MenuItemToggle
*/
ctor: function (/*Multiple arguments follow*/) {
cc.MenuItem.prototype.ctor.call(this);
this._selectedIndex = 0;
this.subItems = [];
this._opacity = 0;
this._color = cc.color.WHITE;
if(arguments.length > 0)
this.initWithItems(Array.prototype.slice.apply(arguments));
},
/**
* return the opacity of cc.MenuItemToggle
* @return {Number}
*/
getOpacity: function () {
return this._opacity;
},
/**
* set the opacity for cc.MenuItemToggle
* @param {Number} opacity
*/
setOpacity: function (opacity) {
this._opacity = opacity;
if (this.subItems && this.subItems.length > 0) {
for (var it = 0; it < this.subItems.length; it++) {
this.subItems[it].opacity = opacity;
}
}
this._color.a = opacity;
},
/**
* return the color of cc.MenuItemToggle
* @return {cc.Color}
*/
getColor: function () {
var locColor = this._color;
return cc.color(locColor.r, locColor.g, locColor.b, locColor.a);
},
/**
* set the color for cc.MenuItemToggle
* @param {cc.Color} Color
*/
setColor: function (color) {
var locColor = this._color;
locColor.r = color.r;
locColor.g = color.g;
locColor.b = color.b;
if (this.subItems && this.subItems.length > 0) {
for (var it = 0; it < this.subItems.length; it++) {
this.subItems[it].setColor(color);
}
}
if (color.a !== undefined && !color.a_undefined) {
this.setOpacity(color.a);
}
},
/**
* return the index of selected
* @return {Number}
*/
getSelectedIndex: function () {
return this._selectedIndex;
},
/**
* set the seleceted index for cc.MenuItemToggle
* @param {Number} SelectedIndex
*/
setSelectedIndex: function (SelectedIndex) {
if (SelectedIndex != this._selectedIndex) {
this._selectedIndex = SelectedIndex;
var currItem = this.getChildByTag(cc.CURRENT_ITEM);
if (currItem)
currItem.removeFromParent(false);
var item = this.subItems[this._selectedIndex];
this.addChild(item, 0, cc.CURRENT_ITEM);
var w = item.width, h = item.height;
this.width = w;
this.height = h;
item.setPosition(w / 2, h / 2);
}
},
/**
* similar to get children,return the sumItem array.
* @return {Array}
*/
getSubItems: function () {
return this.subItems;
},
/**
* set the subitem for cc.MenuItemToggle
* @param {cc.MenuItem} subItems
*/
setSubItems: function (subItems) {
this.subItems = subItems;
},
/**
* initializes a cc.MenuItemToggle with items
* @param {cc.MenuItem} args[0...last-2] the rest in the array are cc.MenuItems
* @param {function|String} args[last-1] the second item in the args array is the callback
* @param {cc.Node} args[last] the first item in the args array is a target
* @return {Boolean}
*/
initWithItems: function (args) {
var l = args.length;
// passing callback.
if (typeof args[args.length - 2] === 'function') {
this.initWithCallback(args[args.length - 2], args[args.length - 1]);
l = l - 2;
} else if (typeof args[args.length - 1] === 'function') {
this.initWithCallback(args[args.length - 1], null);
l = l - 1;
} else {
this.initWithCallback(null, null);
}
var locSubItems = this.subItems;
locSubItems.length = 0;
for (var i = 0; i < l; i++) {
if (args[i])
locSubItems.push(args[i]);
}
this._selectedIndex = cc.UINT_MAX;
this.setSelectedIndex(0);
this.cascadeColor = true;
this.cascadeOpacity = true;
return true;
},
/**
* add the subitem for cc.MenuItemToggle
* @param {cc.MenuItem} item
*/
addSubItem: function (item) {
this.subItems.push(item);
},
/**
* activate the menu item
*/
activate: function () {
// update index
if (this._enabled) {
var newIndex = (this._selectedIndex + 1) % this.subItems.length;
this.setSelectedIndex(newIndex);
}
cc.MenuItem.prototype.activate.call(this);
},
/**
* menu item is selected (runs callback)
*/
selected: function () {
cc.MenuItem.prototype.selected.call(this);
this.subItems[this._selectedIndex].selected();
},
/**
* menu item goes back to unselected state
*/
unselected: function () {
cc.MenuItem.prototype.unselected.call(this);
this.subItems[this._selectedIndex].unselected();
},
/**
* set the enable status for cc.MenuItemToggle
* @param {Boolean} enabled
*/
setEnabled: function (enabled) {
if (this._enabled != enabled) {
cc.MenuItem.prototype.setEnabled.call(this, enabled);
var locItems = this.subItems;
if (locItems && locItems.length > 0) {
for (var it = 0; it < locItems.length; it++)
locItems[it].enabled = enabled;
}
}
},
/**
* returns the selected item
* @return {cc.MenuItem}
*/
selectedItem: function () {
return this.subItems[this._selectedIndex];
},
/**
* *
* Event callback that is invoked every time when cc.MenuItemToggle enters the 'stage'.
* If the cc.MenuItemToggle enters the 'stage' with a transition, this event is called when the transition starts.
* During onEnter you can't access a "sister/brother" node.
* If you override onEnter, you must call its parent's onEnter function with this._super().
*
*/
onEnter: function () {
cc.Node.prototype.onEnter.call(this);
this.setSelectedIndex(this._selectedIndex);
}
});
var _p = cc.MenuItemToggle.prototype;
// Extended properties
/** @expose */
_p.selectedIndex;
cc.defineGetterSetter(_p, "selectedIndex", _p.getSelectedIndex, _p.setSelectedIndex);
/**
* create a simple container class that "toggles" it's inner items
* The inner items can be any MenuItem
* @deprecated since v3.0 please use new cc.MenuItemToggle(params) instead
* @return {cc.MenuItemToggle}
* @example
* // Example
*
* //create a toggle item with 2 menu items (which you can then toggle between them later)
* var toggler = cc.MenuItemToggle.create( cc.MenuItemFont.create("On"), cc.MenuItemFont.create("Off"), this.callback, this)
* //Note: the first param is the target, the second is the callback function, afterwards, you can pass in any number of menuitems
*
* //if you pass only 1 variable, then it must be a cc.MenuItem
* var notYetToggler = cc.MenuItemToggle.create(cc.MenuItemFont.create("On"));//it is useless right now, until you add more stuff to it
* notYetToggler.addSubItem(cc.MenuItemFont.create("Off"));
* //this is useful for constructing a toggler without a callback function (you wish to control the behavior from somewhere else)
*/
cc.MenuItemToggle.create = function (/*Multiple arguments follow*/) {
if ((arguments.length > 0) && (arguments[arguments.length - 1] == null))
cc.log("parameters should not be ending with null in Javascript");
var ret = new cc.MenuItemToggle();
ret.initWithItems(Array.prototype.slice.apply(arguments));
return ret;
};