phaser/Phaser/AnimationManager.ts

250 lines
7.2 KiB
TypeScript
Raw Normal View History

2013-04-12 16:19:56 +00:00
/// <reference path="Game.ts" />
2013-04-18 13:16:18 +00:00
/// <reference path="gameobjects/Sprite.ts" />
2013-04-12 16:19:56 +00:00
/// <reference path="system/animation/Animation.ts" />
/// <reference path="system/animation/AnimationLoader.ts" />
/// <reference path="system/animation/Frame.ts" />
/// <reference path="system/animation/FrameData.ts" />
2013-04-18 15:49:08 +00:00
/**
* Phaser - AnimationManager
*
* Any Sprite that has animation contains an instance of the AnimationManager, which is used to add, play and update
* sprite specific animations.
*/
2013-04-18 13:16:18 +00:00
module Phaser {
2013-04-12 16:19:56 +00:00
export class AnimationManager {
2013-04-12 16:19:56 +00:00
/**
* AnimationManager constructor
* Create a new <code>AnimationManager</code>.
*
* @param parent {Sprite} Owner sprite of this manager.
*/
2013-04-18 13:16:18 +00:00
constructor(game: Game, parent: Sprite) {
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
this._game = game;
this._parent = parent;
this._anims = {};
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
}
2013-04-12 16:19:56 +00:00
/**
* Local private reference to game.
*/
2013-04-18 13:16:18 +00:00
private _game: Game;
/**
* Local private reference to its owner sprite.
*/
2013-04-18 13:16:18 +00:00
private _parent: Sprite;
2013-04-12 16:19:56 +00:00
/**
* Animation key-value container.
*/
2013-04-18 13:16:18 +00:00
private _anims: {};
/**
* Index of current frame.
* @type {number}
*/
2013-04-18 13:16:18 +00:00
private _frameIndex: number;
/**
* Data contains animation frames.
* @type {FrameData}
*/
2013-04-18 13:16:18 +00:00
private _frameData: FrameData = null;
2013-04-12 16:19:56 +00:00
/**
* Keeps track of the current animation being played.
*/
2013-04-18 13:16:18 +00:00
public currentAnim: Animation;
/**
* Keeps track of the current frame of animation.
*/
2013-04-18 13:16:18 +00:00
public currentFrame: Frame = null;
2013-04-12 16:19:56 +00:00
/**
* Load animation frame data.
* @param frameData Data to be loaded.
*/
2013-04-18 13:16:18 +00:00
public loadFrameData(frameData: FrameData) {
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
this._frameData = frameData;
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
this.frame = 0;
2013-04-12 16:19:56 +00:00
}
/**
* Add a new animation.
* @param name {string} What this animation should be called (e.g. "run").
* @param frames {any[]} An array of numbers/strings indicating what frames to play in what order (e.g. [1, 2, 3] or ['run0', 'run1', run2]).
* @param frameRate {number} The speed in frames per second that the animation should play at (e.g. 60 fps).
* @param loop {boolean} Whether or not the animation is looped or just plays once.
* @param useNumericIndex {boolean} Use number indexes instead of string indexes?
*/
2013-04-18 13:16:18 +00:00
public add(name: string, frames: any[] = null, frameRate: number = 60, loop: bool = false, useNumericIndex: bool = true) {
if (this._frameData == null)
2013-04-12 16:19:56 +00:00
{
return;
}
2013-04-18 13:16:18 +00:00
if (frames == null)
{
frames = this._frameData.getFrameIndexes();
}
else
{
if (this.validateFrames(frames, useNumericIndex) == false)
{
throw Error('Invalid frames given to Animation ' + name);
2013-04-18 13:16:18 +00:00
return;
}
}
if (useNumericIndex == false)
{
frames = this._frameData.getFrameIndexesByName(frames);
}
this._anims[name] = new Animation(this._game, this._parent, this._frameData, name, frames, frameRate, loop);
this.currentAnim = this._anims[name];
this.currentFrame = this.currentAnim.currentFrame;
2013-04-18 13:16:18 +00:00
2013-04-12 16:19:56 +00:00
}
/**
* Check whether the frames is valid.
* @param frames {any[]} Frames to be validated.
* @param useNumericIndex {boolean} Does these frames use number indexes or string indexes?
* @return {boolean} True if they're valid, otherwise return false.
*/
2013-04-18 13:16:18 +00:00
private validateFrames(frames: any[], useNumericIndex: bool): bool {
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
for (var i = 0; i < frames.length; i++)
{
if (useNumericIndex == true)
{
if (frames[i] > this._frameData.total)
{
return false;
}
}
else
{
if (this._frameData.checkFrameName(frames[i]) == false)
{
return false;
}
}
}
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
return true;
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
}
2013-04-12 16:19:56 +00:00
/**
* Play animation with specific name.
* @param name {string} The string name of the animation you want to play.
* @param frameRate {number} FrameRate you want to specify instead of using default.
* @param loop {boolean} Whether or not the animation is looped or just plays once.
*/
2013-04-18 13:16:18 +00:00
public play(name: string, frameRate?: number = null, loop?: bool) {
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
if (this._anims[name])
2013-04-12 16:19:56 +00:00
{
if (this.currentAnim == this._anims[name])
{
if (this.currentAnim.isPlaying == false)
{
this.currentAnim.play(frameRate, loop);
}
}
else
{
this.currentAnim = this._anims[name];
this.currentAnim.play(frameRate, loop);
}
2013-04-12 16:19:56 +00:00
}
2013-04-18 13:16:18 +00:00
2013-04-12 16:19:56 +00:00
}
/**
* Stop animation by name.
* Current animation will be automatically set to the stopped one.
*/
2013-04-18 13:16:18 +00:00
public stop(name: string) {
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
if (this._anims[name])
{
this.currentAnim = this._anims[name];
this.currentAnim.stop();
}
2013-04-12 16:19:56 +00:00
}
/**
* Update animation and parent sprite's bounds.
*/
2013-04-18 13:16:18 +00:00
public update() {
if (this.currentAnim && this.currentAnim.update() == true)
{
this.currentFrame = this.currentAnim.currentFrame;
this._parent.bounds.width = this.currentFrame.width;
this._parent.bounds.height = this.currentFrame.height;
}
2013-04-12 16:19:56 +00:00
}
2013-04-18 13:16:18 +00:00
public get frameData(): FrameData {
return this._frameData;
}
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
public get frameTotal(): number {
return this._frameData.total;
2013-04-12 16:19:56 +00:00
}
2013-04-18 13:16:18 +00:00
public get frame(): number {
return this._frameIndex;
}
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
public set frame(value: number) {
2013-04-12 16:19:56 +00:00
if (this._frameData.getFrame(value) !== null)
2013-04-18 13:16:18 +00:00
{
this.currentFrame = this._frameData.getFrame(value);
2013-04-18 13:16:18 +00:00
this._parent.bounds.width = this.currentFrame.width;
this._parent.bounds.height = this.currentFrame.height;
this._frameIndex = value;
}
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
}
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
public get frameName(): string {
return this.currentFrame.name;
2013-04-12 16:19:56 +00:00
}
2013-04-18 13:16:18 +00:00
public set frameName(value: string) {
if (this._frameData.getFrameByName(value) !== null)
2013-04-18 13:16:18 +00:00
{
this.currentFrame = this._frameData.getFrameByName(value);
2013-04-18 13:16:18 +00:00
this._parent.bounds.width = this.currentFrame.width;
this._parent.bounds.height = this.currentFrame.height;
this._frameIndex = this.currentFrame.index;
}
}
}
2013-04-12 16:19:56 +00:00
2013-04-18 13:16:18 +00:00
}