Files
2020-08-24 23:16:53 +07:00

426 lines
14 KiB
JavaScript
Vendored

/**
*
* Copyright (c) 2008-2010 Ricardo Quesada
* Copyright (c) 2011-2012 cocos2d-x.org
* Copyright (c) 2013-2014 Chukong Technologies Inc.
*
* Copyright 2011 Yannick Loriot. All rights reserved.
* http://yannickloriot.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* CCControlSwitch: Switch control ui component
* @class
* @extends cc.Control
*/
cc.ControlSwitch = cc.Control.extend(/** @lends cc.ControlSwitch# */{
/** Sprite which represents the view. */
_switchSprite:null,
_initialTouchXPosition:0,
_moved:false,
/** A Boolean value that determines the off/on state of the switch. */
_on:false,
_className:"ControlSwitch",
ctor:function (maskSprite, onSprite, offSprite, thumbSprite, onLabel, offLabel) {
cc.Control.prototype.ctor.call(this);
offLabel && this.initWithMaskSprite(maskSprite, onSprite, offSprite, thumbSprite, onLabel, offLabel);
},
/** Creates a switch with a mask sprite, on/off sprites for on/off states, a thumb sprite and an on/off labels. */
initWithMaskSprite:function (maskSprite, onSprite, offSprite, thumbSprite, onLabel, offLabel) {
if(!maskSprite)
throw new Error("cc.ControlSwitch.initWithMaskSprite(): maskSprite should be non-null.");
if(!onSprite)
throw new Error("cc.ControlSwitch.initWithMaskSprite(): onSprite should be non-null.");
if(!offSprite)
throw new Error("cc.ControlSwitch.initWithMaskSprite(): offSprite should be non-null.");
if(!thumbSprite)
throw new Error("cc.ControlSwitch.initWithMaskSprite(): thumbSprite should be non-null.");
if (this.init()) {
this._on = true;
this._switchSprite = new cc.ControlSwitchSprite();
this._switchSprite.initWithMaskSprite(maskSprite, onSprite, offSprite, thumbSprite, onLabel, offLabel);
this._switchSprite.setPosition(this._switchSprite.getContentSize().width / 2, this._switchSprite.getContentSize().height / 2);
this.addChild(this._switchSprite);
this.ignoreAnchorPointForPosition(false);
this.setAnchorPoint(0.5, 0.5);
this.setContentSize(this._switchSprite.getContentSize());
return true;
}
return false;
},
setOn:function (isOn, animated) {
animated = animated || false;
this._on = isOn;
var xPosition = (this._on) ? this._switchSprite.getOnPosition() : this._switchSprite.getOffPosition();
if(animated){
this._switchSprite.runAction(new cc.ActionTween(0.2, "sliderXPosition", this._switchSprite.getSliderXPosition(),xPosition));
}else{
this._switchSprite.setSliderXPosition(xPosition);
}
this.sendActionsForControlEvents(cc.CONTROL_EVENT_VALUECHANGED);
},
isOn:function () {
return this._on;
},
hasMoved:function () {
return this._moved;
},
setEnabled:function (enabled) {
this._enabled = enabled;
this._switchSprite.setOpacity((enabled) ? 255 : 128);
},
locationFromTouch:function (touch) {
var touchLocation = touch.getLocation(); // Get the touch position
touchLocation = this.convertToNodeSpace(touchLocation); // Convert to the node space of this class
return touchLocation;
},
onTouchBegan:function (touch, event) {
if (!this.isTouchInside(touch) || !this.isEnabled()|| !this.isVisible()) {
return false;
}
this._moved = false;
var location = this.locationFromTouch(touch);
this._initialTouchXPosition = location.x - this._switchSprite.getSliderXPosition();
this._switchSprite.getThumbSprite().setColor(cc.color.GRAY);
this._switchSprite.needsLayout();
return true;
},
onTouchMoved:function (touch, event) {
var location = this.locationFromTouch(touch);
location = cc.p(location.x - this._initialTouchXPosition, 0);
this._moved = true;
this._switchSprite.setSliderXPosition(location.x);
},
onTouchEnded:function (touch, event) {
var location = this.locationFromTouch(touch);
this._switchSprite.getThumbSprite().setColor(cc.color.WHITE);
if (this.hasMoved()) {
this.setOn(!(location.x < this._switchSprite.getContentSize().width / 2), true);
} else {
this.setOn(!this._on, true);
}
},
onTouchCancelled:function (touch, event) {
var location = this.locationFromTouch(touch);
this._switchSprite.getThumbSprite().setColor(cc.color.WHITE);
if (this.hasMoved()) {
this.setOn(!(location.x < this._switchSprite.getContentSize().width / 2), true);
} else {
this.setOn(!this._on, true);
}
}
});
/** Creates a switch with a mask sprite, on/off sprites for on/off states and a thumb sprite.
* @deprecated
*/
cc.ControlSwitch.create = function (maskSprite, onSprite, offSprite, thumbSprite, onLabel, offLabel) {
return new cc.ControlSwitch(maskSprite, onSprite, offSprite, thumbSprite, onLabel, offLabel);
};
/**
* ControlSwitchSprite: Sprite switch control ui component
* @class
* @extends cc.Sprite
*
* @property {Number} sliderX - Slider's x position
* @property {cc.Point} onPos - The position of slider when switch is on
* @property {cc.Point} offPos - The position of slider when switch is off
* @property {cc.Texture2D} maskTexture - The texture of the mask
* @property {cc.Point} texturePos - The position of the texture
* @property {cc.Point} maskPos - The position of the mask
* @property {cc.Sprite} onSprite - The sprite of switch on
* @property {cc.Sprite} offSprite - The sprite of switch off
* @property {cc.Sprite} thumbSprite - The thumb sprite of the switch control
* @property {cc.LabelTTF} onLabel - The sprite of switch on
* @property {cc.LabelTTF} offLabel - The sprite of switch off
* @property {Number} onSideWidth - <@readonly> The width of the on side of the switch control
* @property {Number} offSideWidth - <@readonly> The width of the off side of the switch control
*/
cc.ControlSwitchSprite = cc.Sprite.extend({
_sliderXPosition:0,
_onPosition:0,
_offPosition:0,
_textureLocation:0,
_maskLocation:0,
_maskSize:null,
_onSprite:null,
_offSprite:null,
_thumbSprite:null,
_onLabel:null,
_offLabel:null,
_clipper:null,
_stencil:null,
_backRT:null,
ctor:function () {
cc.Sprite.prototype.ctor.call(this);
this._sliderXPosition = 0;
this._onPosition = 0;
this._offPosition = 0;
this._maskLocation = 0;
this._maskSize = cc.size(0, 0);
this._onSprite = null;
this._offSprite = null;
this._thumbSprite = null;
this._onLabel = null;
this._offLabel = null;
},
initWithMaskSprite:function (maskSprite, onSprite, offSprite, thumbSprite, onLabel, offLabel) {
if (cc.Sprite.prototype.init.call(this)) {
this.setSpriteFrame(maskSprite.displayFrame());
// Sets the default values
this._onPosition = 0;
this._offPosition = -onSprite.getContentSize().width + thumbSprite.getContentSize().width / 2;
this._sliderXPosition = this._onPosition;
this.setOnSprite(onSprite);
this.setOffSprite(offSprite);
this.setThumbSprite(thumbSprite);
this.setOnLabel(onLabel);
this.setOffLabel(offLabel);
// Set up the mask with the Mask shader
this._stencil = maskSprite;
var maskSize = this._maskSize = this._stencil.getContentSize();
this._stencil.setPosition(0, 0);
// Init clipper for mask
this._clipper = new cc.ClippingNode();
this._clipper.setAnchorPoint(0.5, 0.5);
this._clipper.setPosition(maskSize.width / 2, maskSize.height / 2);
this._clipper.setStencil(this._stencil);
this.addChild(this._clipper);
this._clipper.addChild(onSprite);
this._clipper.addChild(offSprite);
this._clipper.addChild(onLabel);
this._clipper.addChild(offLabel);
this.addChild(this._thumbSprite);
this.needsLayout();
return true;
}
return false;
},
needsLayout:function () {
var maskSize = this._maskSize;
this._onSprite.setPosition(
this._onSprite.getContentSize().width / 2 + this._sliderXPosition - maskSize.width / 2,
this._onSprite.getContentSize().height / 2 - maskSize.height / 2
);
this._offSprite.setPosition(
this._onSprite.getContentSize().width + this._offSprite.getContentSize().width / 2 + this._sliderXPosition - maskSize.width / 2,
this._offSprite.getContentSize().height / 2 - maskSize.height / 2
);
if (this._onLabel) {
this._onLabel.setPosition(
this._onSprite.getPositionX() - this._thumbSprite.getContentSize().width / 6,
this._onSprite.getContentSize().height / 2 - maskSize.height / 2
);
}
if (this._offLabel) {
this._offLabel.setPosition(
this._offSprite.getPositionX() + this._thumbSprite.getContentSize().width / 6,
this._offSprite.getContentSize().height / 2 - maskSize.height / 2
);
}
this._thumbSprite.setPosition(
this._onSprite.getContentSize().width + this._sliderXPosition,
this._maskSize.height / 2
);
},
setSliderXPosition:function (sliderXPosition) {
if (sliderXPosition <= this._offPosition) {
// Off
sliderXPosition = this._offPosition;
} else if (sliderXPosition >= this._onPosition) {
// On
sliderXPosition = this._onPosition;
}
this._sliderXPosition = sliderXPosition;
this.needsLayout();
},
getSliderXPosition:function () {
return this._sliderXPosition;
},
_getOnSideWidth:function () {
return this._onSprite.getContentSize().width;
},
_getOffSideWidth:function () {
return this._offSprite.getContentSize().height;
},
updateTweenAction:function (value, key) {
if (key === "sliderXPosition")
this.setSliderXPosition(value);
},
setOnPosition:function (onPosition) {
this._onPosition = onPosition;
},
getOnPosition:function () {
return this._onPosition;
},
setOffPosition:function (offPosition) {
this._offPosition = offPosition;
},
getOffPosition:function () {
return this._offPosition;
},
setMaskTexture:function (maskTexture) {
this._stencil.setTexture(maskTexture);
},
getMaskTexture:function () {
return this._stencil.getTexture();
},
setTextureLocation:function (textureLocation) {
this._textureLocation = textureLocation;
},
getTextureLocation:function () {
return this._textureLocation;
},
setMaskLocation:function (maskLocation) {
this._maskLocation = maskLocation;
},
getMaskLocation:function () {
return this._maskLocation;
},
setOnSprite:function (onSprite) {
this._onSprite = onSprite;
},
getOnSprite:function () {
return this._onSprite;
},
setOffSprite:function (offSprite) {
this._offSprite = offSprite;
},
getOffSprite:function () {
return this._offSprite;
},
setThumbSprite:function (thumbSprite) {
this._thumbSprite = thumbSprite;
},
getThumbSprite:function () {
return this._thumbSprite;
},
setOnLabel:function (onLabel) {
this._onLabel = onLabel;
},
getOnLabel:function () {
return this._onLabel;
},
setOffLabel:function (offLabel) {
this._offLabel = offLabel;
},
getOffLabel:function () {
return this._offLabel;
}
});
var _p = cc.ControlSwitchSprite.prototype;
/** @expose */
_p.sliderX;
cc.defineGetterSetter(_p, "sliderX", _p.getSliderXPosition, _p.setSliderXPosition);
/** @expose */
_p.onPos;
cc.defineGetterSetter(_p, "onPos", _p.getOnPosition, _p.setOnPosition);
/** @expose */
_p.offPos;
cc.defineGetterSetter(_p, "offPos", _p.getOffPosition, _p.setOffPosition);
/** @expose */
_p.maskTexture;
cc.defineGetterSetter(_p, "maskTexture", _p.getMaskTexture, _p.setMaskTexture);
/** @expose */
_p.maskPos;
cc.defineGetterSetter(_p, "maskPos", _p.getMaskLocation, _p.setMaskLocation);
/** @expose */
_p.onSprite;
cc.defineGetterSetter(_p, "onSprite", _p.getOnSprite, _p.setOnSprite);
/** @expose */
_p.offSprite;
cc.defineGetterSetter(_p, "offSprite", _p.getOffSprite, _p.setOffSprite);
/** @expose */
_p.thumbSprite;
cc.defineGetterSetter(_p, "thumbSprite", _p.getThumbSprite, _p.setThumbSprite);
/** @expose */
_p.onLabel;
cc.defineGetterSetter(_p, "onLabel", _p.getOnLabel, _p.setOnLabel);
/** @expose */
_p.offLabel;
cc.defineGetterSetter(_p, "offLabel", _p.getOffLabel, _p.setOffLabel);
/** @expose */
_p.onSideWidth;
cc.defineGetterSetter(_p, "onSideWidth", _p._getOnSideWidth);
/** @expose */
_p.offSideWidth;
cc.defineGetterSetter(_p, "offSideWidth", _p._getOffSideWidth);
_p = null;