phaser/Phaser/gameobjects/Sprite.ts

386 lines
12 KiB
TypeScript
Raw Normal View History

2013-04-18 13:16:18 +00:00
/// <reference path="../Game.ts" />
/// <reference path="../math/Vec2.ts" />
/// <reference path="../geom/Rectangle.ts" />
2013-05-28 20:38:37 +00:00
/// <reference path="../components/animation/AnimationManager.ts" />
/// <reference path="../components/Texture.ts" />
/// <reference path="../components/Transform.ts" />
/// <reference path="../components/sprite/Input.ts" />
/// <reference path="../components/sprite/Events.ts" />
/// <reference path="../physics/Body.ts" />
2013-04-18 13:16:18 +00:00
/**
2013-04-18 15:49:08 +00:00
* Phaser - Sprite
2013-04-18 13:16:18 +00:00
*/
module Phaser {
2013-05-29 01:58:56 +00:00
export class Sprite implements IGameObject {
2013-04-18 13:16:18 +00:00
/**
* Create a new <code>Sprite</code>.
*
* @param game {Phaser.Game} Current game instance.
2013-05-04 16:18:45 +00:00
* @param [x] {number} the initial x position of the sprite.
* @param [y] {number} the initial y position of the sprite.
* @param [key] {string} Key of the graphic you want to load for this sprite.
2013-06-26 04:44:56 +00:00
* @param [bodyType] {number} The physics body type of the object (defaults to BODY_DISABLED)
* @param [shapeType] {number} The physics shape the body will consist of (either Box (0) or Circle (1), for custom types see body.addShape)
*/
2013-06-26 04:44:56 +00:00
constructor(game: Game, x?: number = 0, y?: number = 0, key?: string = null, frame? = null, bodyType?: number = Phaser.Types.BODY_DISABLED, shapeType?:number = 0) {
2013-04-18 13:16:18 +00:00
2013-05-28 20:38:37 +00:00
this.game = game;
this.type = Phaser.Types.SPRITE;
2013-04-18 13:16:18 +00:00
2013-05-28 20:38:37 +00:00
this.exists = true;
this.active = true;
this.visible = true;
this.alive = true;
2013-04-18 13:16:18 +00:00
2013-05-29 11:24:25 +00:00
this.x = x;
this.y = y;
this.z = -1;
this.group = null;
2013-05-29 11:24:25 +00:00
this.animations = new Phaser.Components.AnimationManager(this);
this.input = new Phaser.Components.Sprite.Input(this);
this.events = new Phaser.Components.Sprite.Events(this);
this.texture = new Phaser.Components.Texture(this);
this.transform = new Phaser.Components.Transform(this);
if (key !== null)
{
this.texture.loadImage(key, false);
}
else
{
this.texture.opaque = true;
}
if (frame !== null)
{
if (typeof frame == 'string')
{
this.frameName = frame;
}
else
{
this.frame = frame;
}
}
2013-06-26 04:44:56 +00:00
if (bodyType !== Phaser.Types.BODY_DISABLED)
{
this.body = new Phaser.Physics.Body(this, bodyType, 0, 0, shapeType);
this.game.physics.addBody(this.body);
this.transform.origin.setTo(0.5, 0.5);
}
this.worldView = new Rectangle(x, y, this.width, this.height);
this.cameraView = new Rectangle(x, y, this.width, this.height);
2013-04-18 13:16:18 +00:00
this.transform.setCache();
// Handy proxies
this.scale = this.transform.scale;
this.alpha = this.texture.alpha;
this.origin = this.transform.origin;
2013-04-18 13:16:18 +00:00
}
/**
2013-05-28 20:38:37 +00:00
* Reference to the main game object
*/
2013-05-28 20:38:37 +00:00
public game: Game;
2013-05-16 01:36:58 +00:00
/**
2013-05-28 20:38:37 +00:00
* The type of game object.
*/
2013-05-28 20:38:37 +00:00
public type: number;
/**
* The Group this Sprite belongs to.
*/
public group: Group;
/**
2013-05-28 20:38:37 +00:00
* Controls if both <code>update</code> and render are called by the core game loop.
*/
2013-05-28 20:38:37 +00:00
public exists: bool;
2013-05-16 01:36:58 +00:00
/**
2013-05-28 20:38:37 +00:00
* Controls if <code>update()</code> is automatically called by the core game loop.
2013-05-16 01:36:58 +00:00
*/
2013-05-28 20:38:37 +00:00
public active: bool;
2013-05-16 01:36:58 +00:00
/**
2013-05-28 20:38:37 +00:00
* Controls if this Sprite is rendered or skipped during the core game loop.
*/
2013-05-28 20:38:37 +00:00
public visible: bool;
2013-05-16 01:36:58 +00:00
/**
* A useful state for many game objects. Kill and revive both flip this switch.
*/
2013-05-28 20:38:37 +00:00
public alive: bool;
2013-05-16 01:36:58 +00:00
/**
* Sprite physics body.
*/
2013-06-26 04:44:56 +00:00
public body: Phaser.Physics.Body = null;
/**
2013-05-28 20:38:37 +00:00
* The texture used to render the Sprite.
*/
2013-05-28 20:38:37 +00:00
public texture: Phaser.Components.Texture;
2013-04-18 13:16:18 +00:00
/**
* The Sprite transform component.
*/
public transform: Phaser.Components.Transform;
/**
* The Input component
*/
public input: Phaser.Components.Sprite.Input;
/**
* The Events component
*/
public events: Phaser.Components.Sprite.Events;
/**
* This manages animations of the sprite. You can modify animations though it. (see AnimationManager)
* @type AnimationManager
*/
public animations: Phaser.Components.AnimationManager;
/**
* A Rectangle that defines the size and placement of the Sprite in the game world,
* after taking into consideration both scrollFactor and scaling.
*/
public worldView: Phaser.Rectangle;
/**
* A Rectangle that maps to the placement of this sprite with respect to a specific Camera.
* This value is constantly updated and modified during the internal render pass, it is not meant to be accessed directly.
*/
public cameraView: Phaser.Rectangle;
/**
* A boolean representing if the Sprite has been modified in any way via a scale, rotate, flip or skew.
*/
public modified: bool = false;
2013-05-29 11:24:25 +00:00
/**
* x value of the object.
*/
public x: number = 0;
/**
* y value of the object.
*/
public y: number = 0;
/**
* z order value of the object.
*/
public z: number = 0;
/**
* Render iteration counter
*/
public renderOrderID: number = 0;
2013-05-29 11:24:25 +00:00
/**
* The rotation of the sprite in degrees. Phaser uses a right-handed coordinate system, where 0 points to the right.
2013-05-29 11:24:25 +00:00
*/
public get rotation(): number {
return this.transform.rotation;
2013-05-29 11:24:25 +00:00
}
/**
* Set the rotation of the sprite in degrees. Phaser uses a right-handed coordinate system, where 0 points to the right.
2013-05-29 11:24:25 +00:00
* The value is automatically wrapped to be between 0 and 360.
*/
public set rotation(value: number) {
this.transform.rotation = this.game.math.wrap(value, 360, 0);
2013-05-29 11:24:25 +00:00
}
/**
* The scale of the Sprite. A value of 1 is original scale. 0.5 is half size. 2 is double the size.
* This is a reference to Sprite.transform.scale
*/
public scale: Phaser.Vec2;
/**
* The alpha of the Sprite between 0 and 1, a value of 1 being fully opaque.
*/
public alpha: number;
/**
* The origin of the Sprite around which rotation and positioning takes place.
* This is a reference to Sprite.transform.origin
*/
public origin: Phaser.Vec2;
/**
* Set the animation frame by frame number.
*/
public set frame(value: number) {
this.animations.frame = value;
}
/**
* Get the animation frame number.
*/
public get frame(): number {
return this.animations.frame;
}
/**
* Set the animation frame by frame name.
*/
public set frameName(value: string) {
this.animations.frameName = value;
}
/**
* Get the animation frame name.
*/
public get frameName(): string {
return this.animations.frameName;
}
public set width(value: number) {
this.transform.scale.x = value / this.texture.width;
}
public get width(): number {
return this.texture.width * this.transform.scale.x;
}
public set height(value: number) {
this.transform.scale.y = value / this.texture.height;
}
public get height(): number {
return this.texture.height * this.transform.scale.y;
}
2013-05-29 01:58:56 +00:00
/**
* Pre-update is called right before update() on each object in the game loop.
*/
public preUpdate() {
this.transform.update();
this.worldView.x = (this.x * this.transform.scrollFactor.x) - (this.width * this.transform.origin.x);
this.worldView.y = (this.y * this.transform.scrollFactor.y) - (this.height * this.transform.origin.y);
this.worldView.width = this.width;
this.worldView.height = this.height;
if (this.modified == false && (!this.transform.scale.equals(1) || !this.transform.skew.equals(0) || this.transform.rotation != 0 || this.transform.rotationOffset != 0 || this.texture.flippedX || this.texture.flippedY))
{
this.modified = true;
}
2013-05-29 01:58:56 +00:00
}
/**
2013-06-26 04:44:56 +00:00
* Override this function to update your sprites position and appearance.
2013-05-29 01:58:56 +00:00
*/
public update() {
}
/**
* Automatically called after update() by the game loop.
*/
public postUpdate() {
this.animations.update();
/*
2013-05-29 01:58:56 +00:00
if (this.worldBounds != null)
{
if (this.outOfBoundsAction == GameObject.OUT_OF_BOUNDS_KILL)
{
if (this.x < this.worldBounds.x || this.x > this.worldBounds.right || this.y < this.worldBounds.y || this.y > this.worldBounds.bottom)
{
this.kill();
}
}
else
{
if (this.x < this.worldBounds.x)
{
this.x = this.worldBounds.x;
}
else if (this.x > this.worldBounds.right)
{
this.x = this.worldBounds.right;
}
if (this.y < this.worldBounds.y)
{
this.y = this.worldBounds.y;
}
else if (this.y > this.worldBounds.bottom)
{
this.y = this.worldBounds.bottom;
}
}
}
*/
if (this.modified == true && this.transform.scale.equals(1) && this.transform.skew.equals(0) && this.transform.rotation == 0 && this.transform.rotationOffset == 0 && this.texture.flippedX == false && this.texture.flippedY == false)
{
this.modified = false;
}
2013-05-29 01:58:56 +00:00
}
/**
* Clean up memory.
*/
public destroy() {
this.input.destroy();
2013-05-29 01:58:56 +00:00
}
/**
* Handy for "killing" game objects.
* Default behavior is to flag them as nonexistent AND dead.
* However, if you want the "corpse" to remain in the game,
* like to animate an effect or whatever, you should override this,
* setting only alive to false, and leaving exists true.
*/
public kill(removeFromGroup:bool = false) {
this.alive = false;
this.exists = false;
if (removeFromGroup && this.group)
{
this.group.remove(this);
}
this.events.onKilled.dispatch(this);
}
/**
* Handy for bringing game objects "back to life". Just sets alive and exists back to true.
* In practice, this is most often called by <code>Object.reset()</code>.
*/
public revive() {
this.alive = true;
this.exists = true;
this.events.onRevived.dispatch(this);
}
2013-04-18 13:16:18 +00:00
}
}