mirror of
https://github.com/wassname/phaser.git
synced 2026-06-27 16:10:15 +08:00
5d5c64d22f
After defining tiles that collide on a Tilemap, you need to call Tilemap.generateCollisionData(layer) to populate the physics world with the data required. Debug.renderPhysicsBody updated to take camera location and body rotation into account. Body movement functions put back to velocity :) Updated to latest dev version of pixi and latest p2.js Updated docs
1471 lines
38 KiB
HTML
1471 lines
38 KiB
HTML
<!DOCTYPE html>
|
|
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Phaser Source: gameobjects/Sprite.js</title>
|
|
|
|
<!--[if lt IE 9]>
|
|
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
<![endif]-->
|
|
<link type="text/css" rel="stylesheet" href="styles/sunlight.default.css">
|
|
|
|
|
|
<link type="text/css" rel="stylesheet" href="styles/site.cerulean.css">
|
|
|
|
</head>
|
|
|
|
<body>
|
|
<div class="container-fluid">
|
|
<div class="navbar navbar-fixed-top navbar-inverse">
|
|
<div class="navbar-inner">
|
|
<a class="brand" href="index.html">Phaser</a>
|
|
<ul class="nav">
|
|
|
|
<li class="dropdown">
|
|
<a href="namespaces.list.html" class="dropdown-toggle" data-toggle="dropdown">Namespaces<b
|
|
class="caret"></b></a>
|
|
|
|
<ul class="dropdown-menu ">
|
|
|
|
<li>
|
|
<a href="Phaser.html">Phaser</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
<li class="dropdown">
|
|
<a href="classes.list.html" class="dropdown-toggle" data-toggle="dropdown">Classes<b
|
|
class="caret"></b></a>
|
|
|
|
<ul class="dropdown-menu ">
|
|
|
|
<li>
|
|
<a href="Phaser.Animation.html">Animation</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.AnimationManager.html">AnimationManager</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.AnimationParser.html">AnimationParser</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.BitmapData.html">BitmapData</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.BitmapFont.html">BitmapFont</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.BitmapText.html">BitmapText</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Button.html">Button</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Cache.html">Cache</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Camera.html">Camera</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Canvas.html">Canvas</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Circle.html">Circle</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Color.html">Color</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Device.html">Device</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.html">Easing</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Back.html">Back</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Bounce.html">Bounce</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Circular.html">Circular</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Cubic.html">Cubic</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Elastic.html">Elastic</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Exponential.html">Exponential</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Linear.html">Linear</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Quadratic.html">Quadratic</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Quartic.html">Quartic</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Quintic.html">Quintic</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Easing.Sinusoidal.html">Sinusoidal</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Ellipse.html">Ellipse</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Events.html">Events</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Filter.html">Filter</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Frame.html">Frame</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.FrameData.html">FrameData</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Game.html">Game</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.GameObjectFactory.html">GameObjectFactory</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Gamepad.html">Gamepad</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.GamepadButton.html">GamepadButton</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Graphics.html">Graphics</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Group.html">Group</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Image.html">Image</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Input.html">Input</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.InputHandler.html">InputHandler</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Key.html">Key</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Keyboard.html">Keyboard</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Line.html">Line</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.LinkedList.html">LinkedList</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Loader.html">Loader</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.LoaderParser.html">LoaderParser</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Math.html">Math</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Mouse.html">Mouse</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.MSPointer.html">MSPointer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Net.html">Net</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Particles.html">Particles</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Particles.Arcade.Emitter.html">Emitter</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Physics.html">Physics</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Physics.Arcade.html">Arcade</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Plugin.html">Plugin</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.PluginManager.html">PluginManager</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Point.html">Point</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Pointer.html">Pointer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Polygon.html">Polygon</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.QuadTree.html">QuadTree</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.RandomDataGenerator.html">RandomDataGenerator</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Rectangle.html">Rectangle</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.RenderTexture.html">RenderTexture</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.RequestAnimationFrame.html">RequestAnimationFrame</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Signal.html">Signal</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.SinglePad.html">SinglePad</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Sound.html">Sound</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.SoundManager.html">SoundManager</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Sprite.html">Sprite</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.SpriteBatch.html">SpriteBatch</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Stage.html">Stage</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.StageScaleMode.html">StageScaleMode</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.State.html">State</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.StateManager.html">StateManager</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Text.html">Text</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Tile.html">Tile</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Tilemap.html">Tilemap</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.TilemapLayer.html">TilemapLayer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.TilemapParser.html">TilemapParser</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Tileset.html">Tileset</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.TileSprite.html">TileSprite</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Time.html">Time</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Timer.html">Timer</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.TimerEvent.html">TimerEvent</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Touch.html">Touch</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Tween.html">Tween</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.TweenManager.html">TweenManager</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Utils.html">Utils</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.Utils.Debug.html">Debug</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="Phaser.World.html">World</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="SignalBinding.html">SignalBinding</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
<li class="dropdown">
|
|
<a href="global.html" class="dropdown-toggle" data-toggle="dropdown">Global<b
|
|
class="caret"></b></a>
|
|
|
|
<ul class="dropdown-menu ">
|
|
|
|
<li>
|
|
<a href="global.html#canUseNewCanvasBlendModes">canUseNewCanvasBlendModes</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="global.html#getBounds">getBounds</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="global.html#getNextPowerOfTwo">getNextPowerOfTwo</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="global.html#hex2rgb">hex2rgb</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="global.html#hitTest">hitTest</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="global.html#rgb2hex">rgb2hex</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row-fluid">
|
|
|
|
|
|
<div class="span12">
|
|
|
|
<div id="main">
|
|
|
|
|
|
|
|
<h1 class="page-title">Source: gameobjects/Sprite.js</h1>
|
|
|
|
<section>
|
|
<article>
|
|
<pre class="sunlight-highlight-javascript linenums">/**
|
|
* @author Richard Davey <rich@photonstorm.com>
|
|
* @copyright 2014 Photon Storm Ltd.
|
|
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
|
|
*/
|
|
|
|
/**
|
|
* @class Phaser.Sprite
|
|
*
|
|
* @classdesc Create a new `Sprite` object. Sprites are the lifeblood of your game, used for nearly everything visual.
|
|
*
|
|
* At its most basic a Sprite consists of a set of coordinates and a texture that is rendered to the canvas.
|
|
* They also contain additional properties allowing for physics motion (via Sprite.body), input handling (via Sprite.input),
|
|
* events (via Sprite.events), animation (via Sprite.animations), camera culling and more. Please see the Examples for use cases.
|
|
*
|
|
* @constructor
|
|
* @param {Phaser.Game} game - A reference to the currently running game.
|
|
* @param {number} x - The x coordinate (in world space) to position the Sprite at.
|
|
* @param {number} y - The y coordinate (in world space) to position the Sprite at.
|
|
* @param {string|Phaser.RenderTexture|Phaser.BitmapData|PIXI.Texture} key - This is the image or texture used by the Sprite during rendering. It can be a string which is a reference to the Cache entry, or an instance of a RenderTexture or PIXI.Texture.
|
|
* @param {string|number} frame - If this Sprite is using part of a sprite sheet or texture atlas you can specify the exact frame to use by giving a string or numeric index.
|
|
*/
|
|
Phaser.Sprite = function (game, x, y, key, frame) {
|
|
|
|
x = x || 0;
|
|
y = y || 0;
|
|
key = key || null;
|
|
frame = frame || null;
|
|
|
|
/**
|
|
* @property {Phaser.Game} game - A reference to the currently running Game.
|
|
*/
|
|
this.game = game;
|
|
|
|
/**
|
|
* @property {string} name - The user defined name given to this Sprite.
|
|
* @default
|
|
*/
|
|
this.name = '';
|
|
|
|
/**
|
|
* @property {number} type - The const type of this object.
|
|
* @readonly
|
|
*/
|
|
this.type = Phaser.SPRITE;
|
|
|
|
/**
|
|
* @property {Phaser.Events} events - The Events you can subscribe to that are dispatched when certain things happen on this Sprite or its components.
|
|
*/
|
|
this.events = new Phaser.Events(this);
|
|
|
|
/**
|
|
* @property {Phaser.AnimationManager} animations - This manages animations of the sprite. You can modify animations through it (see Phaser.AnimationManager)
|
|
*/
|
|
this.animations = new Phaser.AnimationManager(this);
|
|
|
|
/**
|
|
* @property {string|Phaser.RenderTexture|Phaser.BitmapData|PIXI.Texture} key - This is the image or texture used by the Sprite during rendering. It can be a string which is a reference to the Cache entry, or an instance of a RenderTexture, BitmapData or PIXI.Texture.
|
|
*/
|
|
this.key = key;
|
|
|
|
/**
|
|
* @property {number} _frame - Internal cache var.
|
|
* @private
|
|
*/
|
|
this._frame = 0;
|
|
|
|
/**
|
|
* @property {string} _frameName - Internal cache var.
|
|
* @private
|
|
*/
|
|
this._frameName = '';
|
|
|
|
PIXI.Sprite.call(this, PIXI.TextureCache['__default']);
|
|
|
|
this.loadTexture(key, frame);
|
|
|
|
this.position.set(x, y);
|
|
|
|
/**
|
|
* @property {Phaser.Point} world - The world coordinates of this Sprite. This differs from the x/y coordinates which are relative to the Sprites container.
|
|
*/
|
|
this.world = new Phaser.Point(x, y);
|
|
|
|
/**
|
|
* Should this Sprite be automatically culled if out of range of the camera?
|
|
* A culled sprite has its renderable property set to 'false'.
|
|
* Be advised this is quite an expensive operation, as it has to calculate the bounds of the object every frame, so only enable it if you really need it.
|
|
*
|
|
* @property {boolean} autoCull - A flag indicating if the Sprite should be automatically camera culled or not.
|
|
* @default
|
|
*/
|
|
this.autoCull = false;
|
|
|
|
/**
|
|
* @property {Phaser.InputHandler|null} input - The Input Handler for this object. Needs to be enabled with image.inputEnabled = true before you can use it.
|
|
*/
|
|
this.input = null;
|
|
|
|
/**
|
|
* @property {Phaser.Physics.Body|null} body - The Sprites physics Body. Will be null unless physics has been enabled via `Sprite.physicsEnabled = true`.
|
|
*/
|
|
this.body = null;
|
|
|
|
/**
|
|
* @property {number} health - Health value. Used in combination with damage() to allow for quick killing of Sprites.
|
|
*/
|
|
this.health = 1;
|
|
|
|
/**
|
|
* If you would like the Sprite to have a lifespan once 'born' you can set this to a positive value. Handy for particles, bullets, etc.
|
|
* The lifespan is decremented by game.time.elapsed each update, once it reaches zero the kill() function is called.
|
|
* @property {number} lifespan - The lifespan of the Sprite (in ms) before it will be killed.
|
|
* @default
|
|
*/
|
|
this.lifespan = 0;
|
|
|
|
/**
|
|
* If true the Sprite checks if it is still within the world each frame, when it leaves the world it dispatches Sprite.events.onOutOfBounds
|
|
* and optionally kills the sprite (if Sprite.outOfBoundsKill is true). By default this is disabled because the Sprite has to calculate its
|
|
* bounds every frame to support it, and not all games need it. Enable it by setting the value to true.
|
|
* @property {boolean} checkWorldBounds
|
|
* @default
|
|
*/
|
|
this.checkWorldBounds = false;
|
|
|
|
/**
|
|
* @property {boolean} outOfBoundsKill - If true Sprite.kill is called as soon as Sprite.inWorld returns false, as long as Sprite.checkWorldBounds is true.
|
|
* @default
|
|
*/
|
|
this.outOfBoundsKill = false;
|
|
|
|
/**
|
|
* @property {boolean} debug - Handy flag to use with Game.enableStep
|
|
* @default
|
|
*/
|
|
this.debug = false;
|
|
|
|
/**
|
|
* @property {Phaser.Point} cameraOffset - If this object is fixedToCamera then this stores the x/y offset that its drawn at, from the top-left of the camera view.
|
|
*/
|
|
this.cameraOffset = new Phaser.Point();
|
|
|
|
/**
|
|
* A small internal cache:
|
|
* 0 = previous position.x
|
|
* 1 = previous position.y
|
|
* 2 = previous rotation
|
|
* 3 = renderID
|
|
* 4 = fresh? (0 = no, 1 = yes)
|
|
* 5 = outOfBoundsFired (0 = no, 1 = yes)
|
|
* 6 = exists (0 = no, 1 = yes)
|
|
* 7 = fixed to camera (0 = no, 1 = yes)
|
|
* @property {Int16Array} _cache
|
|
* @private
|
|
*/
|
|
this._cache = new Int16Array([0, 0, 0, 0, 1, 0, 1, 0]);
|
|
|
|
/**
|
|
* @property {Phaser.Rectangle} _bounds - Internal cache var.
|
|
* @private
|
|
*/
|
|
this._bounds = new Phaser.Rectangle();
|
|
|
|
};
|
|
|
|
Phaser.Sprite.prototype = Object.create(PIXI.Sprite.prototype);
|
|
Phaser.Sprite.prototype.constructor = Phaser.Sprite;
|
|
|
|
/**
|
|
* Automatically called by World.preUpdate.
|
|
*
|
|
* @method Phaser.Sprite#preUpdate
|
|
* @memberof Phaser.Sprite
|
|
* @return {boolean} True if the Sprite was rendered, otherwise false.
|
|
*/
|
|
Phaser.Sprite.prototype.preUpdate = function() {
|
|
|
|
if (this._cache[4] === 1)
|
|
{
|
|
this.world.setTo(this.parent.position.x + this.position.x, this.parent.position.y + this.position.y);
|
|
this.worldTransform.tx = this.world.x;
|
|
this.worldTransform.ty = this.world.y;
|
|
this._cache[0] = this.world.x;
|
|
this._cache[1] = this.world.y;
|
|
this._cache[2] = this.rotation;
|
|
this._cache[4] = 0;
|
|
|
|
// if (this.body)
|
|
// {
|
|
// this.body.x = (this.world.x - (this.anchor.x * this.width)) + this.body.offset.x;
|
|
// this.body.y = (this.world.y - (this.anchor.y * this.height)) + this.body.offset.y;
|
|
// this.body.preX = this.body.x;
|
|
// this.body.preY = this.body.y;
|
|
// }
|
|
|
|
return false;
|
|
}
|
|
|
|
this._cache[0] = this.world.x;
|
|
this._cache[1] = this.world.y;
|
|
this._cache[2] = this.rotation;
|
|
|
|
if (!this.exists || !this.parent.exists)
|
|
{
|
|
// Reset the renderOrderID
|
|
this._cache[3] = -1;
|
|
return false;
|
|
}
|
|
|
|
if (this.lifespan > 0)
|
|
{
|
|
this.lifespan -= this.game.time.elapsed;
|
|
|
|
if (this.lifespan <= 0)
|
|
{
|
|
this.kill();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Cache the bounds if we need it
|
|
if (this.autoCull || this.checkWorldBounds)
|
|
{
|
|
this._bounds.copyFrom(this.getBounds());
|
|
}
|
|
|
|
if (this.autoCull)
|
|
{
|
|
// Won't get rendered but will still get its transform updated
|
|
this.renderable = this.game.world.camera.screenView.intersects(this._bounds);
|
|
}
|
|
|
|
if (this.checkWorldBounds)
|
|
{
|
|
// The Sprite is already out of the world bounds, so let's check to see if it has come back again
|
|
if (this._cache[5] === 1 && this.game.world.bounds.intersects(this._bounds))
|
|
{
|
|
this._cache[5] = 0;
|
|
}
|
|
else if (this._cache[5] === 0 && !this.game.world.bounds.intersects(this._bounds))
|
|
{
|
|
// The Sprite WAS in the screen, but has now left.
|
|
this._cache[5] = 1;
|
|
this.events.onOutOfBounds.dispatch(this);
|
|
|
|
if (this.outOfBoundsKill)
|
|
{
|
|
this.kill();
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
this.world.setTo(this.game.camera.x + this.worldTransform.tx, this.game.camera.y + this.worldTransform.ty);
|
|
|
|
if (this.visible)
|
|
{
|
|
this._cache[3] = this.game.world.currentRenderOrderID++;
|
|
}
|
|
|
|
this.animations.update();
|
|
|
|
if (this.body)
|
|
{
|
|
// this.body.preUpdate();
|
|
}
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
/**
|
|
* Override and use this function in your own custom objects to handle any update requirements you may have.
|
|
*
|
|
* @method Phaser.Sprite#update
|
|
* @memberof Phaser.Sprite
|
|
*/
|
|
Phaser.Sprite.prototype.update = function() {
|
|
|
|
};
|
|
|
|
/**
|
|
* Internal function called by the World postUpdate cycle.
|
|
*
|
|
* @method Phaser.Sprite#postUpdate
|
|
* @memberof Phaser.Sprite
|
|
*/
|
|
Phaser.Sprite.prototype.postUpdate = function() {
|
|
|
|
if (this.key instanceof Phaser.BitmapData && this.key._dirty)
|
|
{
|
|
this.key.render();
|
|
}
|
|
|
|
if (this.exists)
|
|
{
|
|
if (this.body)
|
|
{
|
|
this.body.postUpdate();
|
|
}
|
|
}
|
|
|
|
// Fixed to Camera?
|
|
if (this._cache[7] === 1)
|
|
{
|
|
this.position.x = this.game.camera.view.x + this.cameraOffset.x;
|
|
this.position.y = this.game.camera.view.y + this.cameraOffset.y;
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* Changes the Texture the Sprite is using entirely. The old texture is removed and the new one is referenced or fetched from the Cache.
|
|
* This causes a WebGL texture update, so use sparingly or in low-intensity portions of your game.
|
|
*
|
|
* @method Phaser.Sprite#loadTexture
|
|
* @memberof Phaser.Sprite
|
|
* @param {string|Phaser.RenderTexture|Phaser.BitmapData|PIXI.Texture} key - This is the image or texture used by the Sprite during rendering. It can be a string which is a reference to the Cache entry, or an instance of a RenderTexture, BitmapData or PIXI.Texture.
|
|
* @param {string|number} frame - If this Sprite is using part of a sprite sheet or texture atlas you can specify the exact frame to use by giving a string or numeric index.
|
|
*/
|
|
Phaser.Sprite.prototype.loadTexture = function (key, frame) {
|
|
|
|
frame = frame || 0;
|
|
|
|
if (key instanceof Phaser.RenderTexture)
|
|
{
|
|
this.key = key.key;
|
|
this.setTexture(key);
|
|
return;
|
|
}
|
|
else if (key instanceof Phaser.BitmapData)
|
|
{
|
|
this.key = key.key;
|
|
this.setTexture(key.texture);
|
|
return;
|
|
}
|
|
else if (key instanceof PIXI.Texture)
|
|
{
|
|
this.key = key;
|
|
this.setTexture(key);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if (key === null || typeof key === 'undefined')
|
|
{
|
|
this.key = '__default';
|
|
this.setTexture(PIXI.TextureCache[this.key]);
|
|
return;
|
|
}
|
|
else if (typeof key === 'string' && !this.game.cache.checkImageKey(key))
|
|
{
|
|
this.key = '__missing';
|
|
this.setTexture(PIXI.TextureCache[this.key]);
|
|
return;
|
|
}
|
|
|
|
if (this.game.cache.isSpriteSheet(key))
|
|
{
|
|
this.key = key;
|
|
|
|
// var frameData = this.game.cache.getFrameData(key);
|
|
this.animations.loadFrameData(this.game.cache.getFrameData(key));
|
|
|
|
if (typeof frame === 'string')
|
|
{
|
|
this.frameName = frame;
|
|
}
|
|
else
|
|
{
|
|
this.frame = frame;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.key = key;
|
|
this.setTexture(PIXI.TextureCache[key]);
|
|
return;
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* Crop allows you to crop the texture used to display this Sprite.
|
|
* Cropping takes place from the top-left of the Sprite and can be modified in real-time by providing an updated rectangle object.
|
|
*
|
|
* @method Phaser.Sprite#crop
|
|
* @memberof Phaser.Sprite
|
|
* @param {Phaser.Rectangle} rect - The Rectangle to crop the Sprite to. Pass null or no parameters to clear a previously set crop rectangle.
|
|
*/
|
|
Phaser.Sprite.prototype.crop = function(rect) {
|
|
|
|
if (typeof rect === 'undefined' || rect === null)
|
|
{
|
|
// Clear any crop that may be set
|
|
if (this.texture.hasOwnProperty('sourceWidth'))
|
|
{
|
|
this.texture.setFrame(new Phaser.Rectangle(0, 0, this.texture.sourceWidth, this.texture.sourceHeight));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Do we need to clone the PIXI.Texture object?
|
|
if (this.texture instanceof PIXI.Texture)
|
|
{
|
|
// Yup, let's rock it ...
|
|
var local = {};
|
|
|
|
Phaser.Utils.extend(true, local, this.texture);
|
|
|
|
local.sourceWidth = local.width;
|
|
local.sourceHeight = local.height;
|
|
local.frame = rect;
|
|
local.width = rect.width;
|
|
local.height = rect.height;
|
|
|
|
this.texture = local;
|
|
|
|
this.texture.updateFrame = true;
|
|
PIXI.Texture.frameUpdates.push(this.texture);
|
|
}
|
|
else
|
|
{
|
|
this.texture.setFrame(rect);
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* Brings a 'dead' Sprite back to life, optionally giving it the health value specified.
|
|
* A resurrected Sprite has its alive, exists and visible properties all set to true.
|
|
* It will dispatch the onRevived event, you can listen to Sprite.events.onRevived for the signal.
|
|
*
|
|
* @method Phaser.Sprite#revive
|
|
* @memberof Phaser.Sprite
|
|
* @param {number} [health=1] - The health to give the Sprite.
|
|
* @return (Phaser.Sprite) This instance.
|
|
*/
|
|
Phaser.Sprite.prototype.revive = function(health) {
|
|
|
|
if (typeof health === 'undefined') { health = 1; }
|
|
|
|
this.alive = true;
|
|
this.exists = true;
|
|
this.visible = true;
|
|
this.health = health;
|
|
|
|
if (this.events)
|
|
{
|
|
this.events.onRevived.dispatch(this);
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* Kills a Sprite. A killed Sprite has its alive, exists and visible properties all set to false.
|
|
* It will dispatch the onKilled event, you can listen to Sprite.events.onKilled for the signal.
|
|
* Note that killing a Sprite is a way for you to quickly recycle it in a Sprite pool, it doesn't free it up from memory.
|
|
* If you don't need this Sprite any more you should call Sprite.destroy instead.
|
|
*
|
|
* @method Phaser.Sprite#kill
|
|
* @memberof Phaser.Sprite
|
|
* @return (Phaser.Sprite) This instance.
|
|
*/
|
|
Phaser.Sprite.prototype.kill = function() {
|
|
|
|
this.alive = false;
|
|
this.exists = false;
|
|
this.visible = false;
|
|
|
|
if (this.events)
|
|
{
|
|
this.events.onKilled.dispatch(this);
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* Destroys the Sprite. This removes it from its parent group, destroys the input, event and animation handlers if present
|
|
* and nulls its reference to game, freeing it up for garbage collection.
|
|
*
|
|
* @method Phaser.Sprite#destroy
|
|
* @memberof Phaser.Sprite
|
|
*/
|
|
Phaser.Sprite.prototype.destroy = function() {
|
|
|
|
if (this.filters)
|
|
{
|
|
this.filters = null;
|
|
}
|
|
|
|
if (this.parent)
|
|
{
|
|
this.parent.remove(this);
|
|
}
|
|
|
|
if (this.input)
|
|
{
|
|
this.input.destroy();
|
|
}
|
|
|
|
if (this.animations)
|
|
{
|
|
this.animations.destroy();
|
|
}
|
|
|
|
if (this.body)
|
|
{
|
|
this.body.destroy();
|
|
}
|
|
|
|
if (this.events)
|
|
{
|
|
this.events.destroy();
|
|
}
|
|
|
|
this.alive = false;
|
|
this.exists = false;
|
|
this.visible = false;
|
|
|
|
this.game = null;
|
|
|
|
};
|
|
|
|
/**
|
|
* Damages the Sprite, this removes the given amount from the Sprites health property.
|
|
* If health is then taken below zero Sprite.kill is called.
|
|
*
|
|
* @method Phaser.Sprite#damage
|
|
* @memberof Phaser.Sprite
|
|
* @param {number} amount - The amount to subtract from the Sprite.health value.
|
|
* @return (Phaser.Sprite) This instance.
|
|
*/
|
|
Phaser.Sprite.prototype.damage = function(amount) {
|
|
|
|
if (this.alive)
|
|
{
|
|
this.health -= amount;
|
|
|
|
if (this.health < 0)
|
|
{
|
|
this.kill();
|
|
}
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* Resets the Sprite. This places the Sprite at the given x/y world coordinates and then
|
|
* sets alive, exists, visible and renderable all to true. Also resets the outOfBounds state and health values.
|
|
* If the Sprite has a physics body that too is reset.
|
|
*
|
|
* @method Phaser.Sprite#reset
|
|
* @memberof Phaser.Sprite
|
|
* @param {number} x - The x coordinate (in world space) to position the Sprite at.
|
|
* @param {number} y - The y coordinate (in world space) to position the Sprite at.
|
|
* @param {number} [health=1] - The health to give the Sprite.
|
|
* @return (Phaser.Sprite) This instance.
|
|
*/
|
|
Phaser.Sprite.prototype.reset = function(x, y, health) {
|
|
|
|
if (typeof health === 'undefined') { health = 1; }
|
|
|
|
this.world.setTo(x, y);
|
|
this.position.x = x;
|
|
this.position.y = y;
|
|
this.alive = true;
|
|
this.exists = true;
|
|
this.visible = true;
|
|
this.renderable = true;
|
|
this._outOfBoundsFired = false;
|
|
|
|
this.health = health;
|
|
|
|
if (this.body)
|
|
{
|
|
this.body.reset(x, y, false, false);
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* Brings the Sprite to the top of the display list it is a child of. Sprites that are members of a Phaser.Group are only
|
|
* bought to the top of that Group, not the entire display list.
|
|
*
|
|
* @method Phaser.Sprite#bringToTop
|
|
* @memberof Phaser.Sprite
|
|
* @return (Phaser.Sprite) This instance.
|
|
*/
|
|
Phaser.Sprite.prototype.bringToTop = function(child) {
|
|
|
|
if (typeof child === 'undefined')
|
|
{
|
|
if (this.parent)
|
|
{
|
|
this.parent.bringToTop(this);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* Play an animation based on the given key. The animation should previously have been added via sprite.animations.add()
|
|
* If the requested animation is already playing this request will be ignored. If you need to reset an already running animation do so directly on the Animation object itself.
|
|
*
|
|
* @method Phaser.Sprite#play
|
|
* @memberof Phaser.Sprite
|
|
* @param {string} name - The name of the animation to be played, e.g. "fire", "walk", "jump".
|
|
* @param {number} [frameRate=null] - The framerate to play the animation at. The speed is given in frames per second. If not provided the previously set frameRate of the Animation is used.
|
|
* @param {boolean} [loop=false] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used.
|
|
* @param {boolean} [killOnComplete=false] - If set to true when the animation completes (only happens if loop=false) the parent Sprite will be killed.
|
|
* @return {Phaser.Animation} A reference to playing Animation instance.
|
|
*/
|
|
Phaser.Sprite.prototype.play = function (name, frameRate, loop, killOnComplete) {
|
|
|
|
if (this.animations)
|
|
{
|
|
return this.animations.play(name, frameRate, loop, killOnComplete);
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* Indicates the rotation of the Sprite, in degrees, from its original orientation. Values from 0 to 180 represent clockwise rotation; values from 0 to -180 represent counterclockwise rotation.
|
|
* Values outside this range are added to or subtracted from 360 to obtain a value within the range. For example, the statement player.angle = 450 is the same as player.angle = 90.
|
|
* If you wish to work in radians instead of degrees use the property Sprite.rotation instead. Working in radians is also a little faster as it doesn't have to convert the angle.
|
|
*
|
|
* @name Phaser.Sprite#angle
|
|
* @property {number} angle - The angle of this Sprite in degrees.
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "angle", {
|
|
|
|
get: function() {
|
|
|
|
return Phaser.Math.wrapAngle(Phaser.Math.radToDeg(this.rotation));
|
|
|
|
},
|
|
|
|
set: function(value) {
|
|
|
|
this.rotation = Phaser.Math.degToRad(Phaser.Math.wrapAngle(value));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* Returns the delta x value. The difference between world.x now and in the previous step.
|
|
*
|
|
* @name Phaser.Sprite#deltaX
|
|
* @property {number} deltaX - The delta value. Positive if the motion was to the right, negative if to the left.
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "deltaX", {
|
|
|
|
get: function() {
|
|
|
|
return this.world.x - this._cache[0];
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* Returns the delta y value. The difference between world.y now and in the previous step.
|
|
*
|
|
* @name Phaser.Sprite#deltaY
|
|
* @property {number} deltaY - The delta value. Positive if the motion was downwards, negative if upwards.
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "deltaY", {
|
|
|
|
get: function() {
|
|
|
|
return this.world.y - this._cache[1];
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* Returns the delta z value. The difference between rotation now and in the previous step.
|
|
*
|
|
* @name Phaser.Sprite#deltaZ
|
|
* @property {number} deltaZ - The delta value.
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "deltaZ", {
|
|
|
|
get: function() {
|
|
|
|
return this.rotation - this._cache[2];
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* Checks if the Sprite bounds are within the game world, otherwise false if fully outside of it.
|
|
*
|
|
* @name Phaser.Sprite#inWorld
|
|
* @property {boolean} inWorld - True if the Sprite bounds is within the game world, even if only partially. Otherwise false if fully outside of it.
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "inWorld", {
|
|
|
|
get: function() {
|
|
|
|
return this.game.world.bounds.intersects(this.getBounds());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* Checks if the Sprite bounds are within the game camera, otherwise false if fully outside of it.
|
|
*
|
|
* @name Phaser.Sprite#inCamera
|
|
* @property {boolean} inCamera - True if the Sprite bounds is within the game camera, even if only partially. Otherwise false if fully outside of it.
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "inCamera", {
|
|
|
|
get: function() {
|
|
|
|
return this.game.world.camera.screenView.intersects(this.getBounds());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* @name Phaser.Sprite#frame
|
|
* @property {number} frame - Gets or sets the current frame index and updates the Texture Cache for display.
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "frame", {
|
|
|
|
get: function () {
|
|
return this.animations.frame;
|
|
},
|
|
|
|
set: function (value) {
|
|
this.animations.frame = value;
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* @name Phaser.Sprite#frameName
|
|
* @property {string} frameName - Gets or sets the current frame name and updates the Texture Cache for display.
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "frameName", {
|
|
|
|
get: function () {
|
|
return this.animations.frameName;
|
|
},
|
|
|
|
set: function (value) {
|
|
this.animations.frameName = value;
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* @name Phaser.Sprite#renderOrderID
|
|
* @property {number} renderOrderID - The render order ID, reset every frame.
|
|
* @readonly
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "renderOrderID", {
|
|
|
|
get: function() {
|
|
|
|
return this._cache[3];
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* By default a Sprite won't process any input events at all. By setting inputEnabled to true the Phaser.InputHandler is
|
|
* activated for this object and it will then start to process click/touch events and more.
|
|
*
|
|
* @name Phaser.Sprite#inputEnabled
|
|
* @property {boolean} inputEnabled - Set to true to allow this object to receive input events.
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "inputEnabled", {
|
|
|
|
get: function () {
|
|
|
|
return (this.input && this.input.enabled);
|
|
|
|
},
|
|
|
|
set: function (value) {
|
|
|
|
if (value)
|
|
{
|
|
if (this.input === null)
|
|
{
|
|
this.input = new Phaser.InputHandler(this);
|
|
this.input.start();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (this.input && this.input.enabled)
|
|
{
|
|
this.input.stop();
|
|
}
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* By default Sprites won't add themselves to the physics world. By setting physicsEnabled to true a Rectangle physics body is
|
|
* attached to this Sprite matching its placement and dimensions, and will then start to process physics world updates.
|
|
* You can access all physics related properties via Sprite.body.
|
|
*
|
|
* Important: Enabling a Sprite for physics will automatically set `Sprite.anchor` to 0.5 s0 the physics body is centered on the Sprite.
|
|
* If you need a different result then adjust or re-create the Body shape offsets manually, and/or reset the anchor after enabling physics.
|
|
*
|
|
* @name Phaser.Sprite#physicsEnabled
|
|
* @property {boolean} physicsEnabled - Set to true to add this Sprite to the physics world. Set to false to destroy the body and remove it from the physics world.
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "physicsEnabled", {
|
|
|
|
get: function () {
|
|
|
|
return (this.body !== null);
|
|
|
|
},
|
|
|
|
set: function (value) {
|
|
|
|
if (value)
|
|
{
|
|
if (this.body === null)
|
|
{
|
|
this.body = new Phaser.Physics.Body(this.game, this, this.x, this.y, 1);
|
|
this.anchor.set(0.5);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (this.body)
|
|
{
|
|
this.body.destroy();
|
|
}
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* Sprite.exists controls if the core game loop and physics update this Sprite or not.
|
|
* When you set Sprite.exists to false it will remove its Body from the physics world (if it has one) and also set Sprite.visible to false.
|
|
* Setting Sprite.exists to true will re-add the Body to the physics world (if it has a body) and set Sprite.visible to true.
|
|
*
|
|
* @name Phaser.Sprite#exists
|
|
* @property {boolean} exists - If the Sprite is processed by the core game update and physics.
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "exists", {
|
|
|
|
get: function () {
|
|
|
|
return !!this._cache[6];
|
|
|
|
},
|
|
|
|
set: function (value) {
|
|
|
|
if (value)
|
|
{
|
|
// exists = true
|
|
this._cache[6] = 1;
|
|
|
|
if (this.body)
|
|
{
|
|
this.body.addToWorld();
|
|
}
|
|
|
|
this.visible = true;
|
|
}
|
|
else
|
|
{
|
|
// exists = false
|
|
this._cache[6] = 0;
|
|
|
|
if (this.body)
|
|
{
|
|
this.body.removeFromWorld();
|
|
}
|
|
|
|
this.visible = false;
|
|
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
|
|
/**
|
|
* An Sprite that is fixed to the camera uses its x/y coordinates as offsets from the top left of the camera. These are stored in Sprite.cameraOffset.
|
|
* Note that the cameraOffset values are in addition to any parent in the display list.
|
|
* So if this Sprite was in a Group that has x: 200, then this will be added to the cameraOffset.x
|
|
*
|
|
* @name Phaser.Sprite#fixedToCamera
|
|
* @property {boolean} fixedToCamera - Set to true to fix this Sprite to the Camera at its current world coordinates.
|
|
*/
|
|
Object.defineProperty(Phaser.Sprite.prototype, "fixedToCamera", {
|
|
|
|
get: function () {
|
|
|
|
return !!this._cache[7];
|
|
|
|
},
|
|
|
|
set: function (value) {
|
|
|
|
if (value)
|
|
{
|
|
this._cache[7] = 1;
|
|
this.cameraOffset.set(this.x, this.y);
|
|
}
|
|
else
|
|
{
|
|
this._cache[7] = 0;
|
|
}
|
|
}
|
|
|
|
});
|
|
</pre>
|
|
</article>
|
|
</section>
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<div class="clearfix"></div>
|
|
<footer>
|
|
|
|
|
|
<span class="copyright">
|
|
Phaser Copyright © 2012-2014 Photon Storm Ltd.
|
|
</span>
|
|
<br />
|
|
|
|
<span class="jsdoc-message">
|
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.3.0-dev</a>
|
|
on Tue Feb 18 2014 03:01:17 GMT-0000 (GMT) using the <a href="https://github.com/terryweiss/docstrap">DocStrap template</a>.
|
|
</span>
|
|
</footer>
|
|
</div>
|
|
|
|
|
|
<br clear="both">
|
|
</div>
|
|
|
|
</div>
|
|
<script src="scripts/sunlight.js"></script>
|
|
<script src="scripts/sunlight.javascript.js"></script>
|
|
<script src="scripts/sunlight-plugin.doclinks.js"></script>
|
|
<script src="scripts/sunlight-plugin.linenumbers.js"></script>
|
|
<script src="scripts/sunlight-plugin.menu.js"></script>
|
|
<script src="scripts/jquery.min.js"></script>
|
|
<script src="scripts/jquery.scrollTo.js"></script>
|
|
<script src="scripts/jquery.localScroll.js"></script>
|
|
<script src="scripts/bootstrap-dropdown.js"></script>
|
|
<script src="scripts/toc.js"></script>
|
|
|
|
|
|
<script> Sunlight.highlightAll({lineNumbers:true, showMenu: true, enableDoclinks :true}); </script>
|
|
|
|
<script>
|
|
$( function () {
|
|
$( "#toc" ).toc( {
|
|
selectors : "h1,h2,h3,h4",
|
|
showAndHide : false,
|
|
scrollTo : 60
|
|
} );
|
|
$( "#toc>ul" ).addClass( "nav nav-pills nav-stacked" );
|
|
$( "#main span[id^='toc']" ).addClass( "toc-shim" );
|
|
|
|
} );
|
|
</script>
|
|
|
|
|
|
|
|
</body>
|
|
</html>
|