mirror of
https://github.com/photonstorm/phaser
synced 2024-12-22 11:03:23 +00:00
367 lines
18 KiB
JavaScript
367 lines
18 KiB
JavaScript
|
var Phaser;
|
||
|
(function (Phaser) {
|
||
|
/// <reference path="../_definitions.ts" />
|
||
|
/**
|
||
|
* Phaser - Physics - TileMapCell
|
||
|
*/
|
||
|
(function (Physics) {
|
||
|
var TileMapCell = (function () {
|
||
|
function TileMapCell(game, x, y, xw, yw) {
|
||
|
this.game = game;
|
||
|
this.ID = TileMapCell.TID_EMPTY//all tiles start empty
|
||
|
;
|
||
|
this.CTYPE = TileMapCell.CTYPE_EMPTY;
|
||
|
this.pos = new Phaser.Vec2(x, y)//setup collision properties
|
||
|
;
|
||
|
this.xw = xw;
|
||
|
this.yw = yw;
|
||
|
this.minx = this.pos.x - this.xw;
|
||
|
this.maxx = this.pos.x + this.xw;
|
||
|
this.miny = this.pos.y - this.yw;
|
||
|
this.maxy = this.pos.y + this.yw;
|
||
|
//this stores tile-specific collision information
|
||
|
this.signx = 0;
|
||
|
this.signy = 0;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
}
|
||
|
TileMapCell.TID_EMPTY = 0;
|
||
|
TileMapCell.TID_FULL = 1;
|
||
|
TileMapCell.TID_45DEGpn = 2;
|
||
|
TileMapCell.TID_45DEGnn = 3;
|
||
|
TileMapCell.TID_45DEGnp = 4;
|
||
|
TileMapCell.TID_45DEGpp = 5;
|
||
|
TileMapCell.TID_CONCAVEpn = 6;
|
||
|
TileMapCell.TID_CONCAVEnn = 7;
|
||
|
TileMapCell.TID_CONCAVEnp = 8;
|
||
|
TileMapCell.TID_CONCAVEpp = 9;
|
||
|
TileMapCell.TID_CONVEXpn = 10;
|
||
|
TileMapCell.TID_CONVEXnn = 11;
|
||
|
TileMapCell.TID_CONVEXnp = 12;
|
||
|
TileMapCell.TID_CONVEXpp = 13;
|
||
|
TileMapCell.TID_22DEGpnS = 14;
|
||
|
TileMapCell.TID_22DEGnnS = 15;
|
||
|
TileMapCell.TID_22DEGnpS = 16;
|
||
|
TileMapCell.TID_22DEGppS = 17;
|
||
|
TileMapCell.TID_22DEGpnB = 18;
|
||
|
TileMapCell.TID_22DEGnnB = 19;
|
||
|
TileMapCell.TID_22DEGnpB = 20;
|
||
|
TileMapCell.TID_22DEGppB = 21;
|
||
|
TileMapCell.TID_67DEGpnS = 22;
|
||
|
TileMapCell.TID_67DEGnnS = 23;
|
||
|
TileMapCell.TID_67DEGnpS = 24;
|
||
|
TileMapCell.TID_67DEGppS = 25;
|
||
|
TileMapCell.TID_67DEGpnB = 26;
|
||
|
TileMapCell.TID_67DEGnnB = 27;
|
||
|
TileMapCell.TID_67DEGnpB = 28;
|
||
|
TileMapCell.TID_67DEGppB = 29;
|
||
|
TileMapCell.TID_HALFd = 30;
|
||
|
TileMapCell.TID_HALFr = 31;
|
||
|
TileMapCell.TID_HALFu = 32;
|
||
|
TileMapCell.TID_HALFl = 33;
|
||
|
TileMapCell.CTYPE_EMPTY = 0;
|
||
|
TileMapCell.CTYPE_FULL = 1;
|
||
|
TileMapCell.CTYPE_45DEG = 2;
|
||
|
TileMapCell.CTYPE_CONCAVE = 6;
|
||
|
TileMapCell.CTYPE_CONVEX = 10;
|
||
|
TileMapCell.CTYPE_22DEGs = 14;
|
||
|
TileMapCell.CTYPE_22DEGb = 18;
|
||
|
TileMapCell.CTYPE_67DEGs = 22;
|
||
|
TileMapCell.CTYPE_67DEGb = 26;
|
||
|
TileMapCell.CTYPE_HALF = 30;
|
||
|
TileMapCell.prototype.SetState = //these functions are used to update the cell
|
||
|
//note: ID is assumed to NOT be "empty" state..
|
||
|
//if it IS the empty state, the tile clears itself
|
||
|
function (ID) {
|
||
|
if(ID == TileMapCell.TID_EMPTY) {
|
||
|
this.Clear();
|
||
|
} else {
|
||
|
//set tile state to a non-emtpy value, and update it's edges and those of the neighbors
|
||
|
this.ID = ID;
|
||
|
this.UpdateType();
|
||
|
//this.Draw();
|
||
|
}
|
||
|
return this;
|
||
|
};
|
||
|
TileMapCell.prototype.Clear = function () {
|
||
|
//tile was on, turn it off
|
||
|
this.ID = TileMapCell.TID_EMPTY;
|
||
|
this.UpdateType();
|
||
|
//this.Draw();
|
||
|
};
|
||
|
TileMapCell.prototype.render = function (context) {
|
||
|
context.beginPath();
|
||
|
context.strokeStyle = 'rgb(255,255,0)';
|
||
|
context.strokeRect(this.minx, this.miny, this.xw * 2, this.yw * 2);
|
||
|
context.strokeRect(this.pos.x, this.pos.y, 2, 2);
|
||
|
context.closePath();
|
||
|
};
|
||
|
TileMapCell.prototype.UpdateType = //this converts a tile from implicitly-defined (via ID), to explicit (via properties)
|
||
|
function () {
|
||
|
if(0 < this.ID) {
|
||
|
//tile is non-empty; collide
|
||
|
if(this.ID < TileMapCell.CTYPE_45DEG) {
|
||
|
//TID_FULL
|
||
|
this.CTYPE = TileMapCell.CTYPE_FULL;
|
||
|
this.signx = 0;
|
||
|
this.signy = 0;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
} else if(this.ID < TileMapCell.CTYPE_CONCAVE) {
|
||
|
//45deg
|
||
|
this.CTYPE = TileMapCell.CTYPE_45DEG;
|
||
|
if(this.ID == TileMapCell.TID_45DEGpn) {
|
||
|
console.log('set tile as 45deg pn');
|
||
|
this.signx = 1;
|
||
|
this.signy = -1;
|
||
|
this.sx = this.signx / Math.SQRT2//get slope _unit_ normal
|
||
|
;
|
||
|
this.sy = this.signy / Math.SQRT2//since normal is (1,-1), length is sqrt(1*1 + -1*-1) = sqrt(2)
|
||
|
;
|
||
|
} else if(this.ID == TileMapCell.TID_45DEGnn) {
|
||
|
this.signx = -1;
|
||
|
this.signy = -1;
|
||
|
this.sx = this.signx / Math.SQRT2//get slope _unit_ normal
|
||
|
;
|
||
|
this.sy = this.signy / Math.SQRT2//since normal is (1,-1), length is sqrt(1*1 + -1*-1) = sqrt(2)
|
||
|
;
|
||
|
} else if(this.ID == TileMapCell.TID_45DEGnp) {
|
||
|
this.signx = -1;
|
||
|
this.signy = 1;
|
||
|
this.sx = this.signx / Math.SQRT2//get slope _unit_ normal
|
||
|
;
|
||
|
this.sy = this.signy / Math.SQRT2//since normal is (1,-1), length is sqrt(1*1 + -1*-1) = sqrt(2)
|
||
|
;
|
||
|
} else if(this.ID == TileMapCell.TID_45DEGpp) {
|
||
|
this.signx = 1;
|
||
|
this.signy = 1;
|
||
|
this.sx = this.signx / Math.SQRT2//get slope _unit_ normal
|
||
|
;
|
||
|
this.sy = this.signy / Math.SQRT2//since normal is (1,-1), length is sqrt(1*1 + -1*-1) = sqrt(2)
|
||
|
;
|
||
|
} else {
|
||
|
//trace("BAAAD TILE!!!!!: ID=" + this.ID + " ("+ t.i + "," + t.j + ")");
|
||
|
return false;
|
||
|
}
|
||
|
} else if(this.ID < TileMapCell.CTYPE_CONVEX) {
|
||
|
//concave
|
||
|
this.CTYPE = TileMapCell.CTYPE_CONCAVE;
|
||
|
if(this.ID == TileMapCell.TID_CONCAVEpn) {
|
||
|
this.signx = 1;
|
||
|
this.signy = -1;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
} else if(this.ID == TileMapCell.TID_CONCAVEnn) {
|
||
|
this.signx = -1;
|
||
|
this.signy = -1;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
} else if(this.ID == TileMapCell.TID_CONCAVEnp) {
|
||
|
this.signx = -1;
|
||
|
this.signy = 1;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
} else if(this.ID == TileMapCell.TID_CONCAVEpp) {
|
||
|
this.signx = 1;
|
||
|
this.signy = 1;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
} else {
|
||
|
//trace("BAAAD TILE!!!!!: ID=" + this.ID + " ("+ t.i + "," + t.j + ")");
|
||
|
return false;
|
||
|
}
|
||
|
} else if(this.ID < TileMapCell.CTYPE_22DEGs) {
|
||
|
//convex
|
||
|
this.CTYPE = TileMapCell.CTYPE_CONVEX;
|
||
|
if(this.ID == TileMapCell.TID_CONVEXpn) {
|
||
|
this.signx = 1;
|
||
|
this.signy = -1;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
} else if(this.ID == TileMapCell.TID_CONVEXnn) {
|
||
|
this.signx = -1;
|
||
|
this.signy = -1;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
} else if(this.ID == TileMapCell.TID_CONVEXnp) {
|
||
|
this.signx = -1;
|
||
|
this.signy = 1;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
} else if(this.ID == TileMapCell.TID_CONVEXpp) {
|
||
|
this.signx = 1;
|
||
|
this.signy = 1;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
} else {
|
||
|
//trace("BAAAD TILE!!!!!: ID=" + this.ID + " ("+ t.i + "," + t.j + ")");
|
||
|
return false;
|
||
|
}
|
||
|
} else if(this.ID < TileMapCell.CTYPE_22DEGb) {
|
||
|
//22deg small
|
||
|
this.CTYPE = TileMapCell.CTYPE_22DEGs;
|
||
|
if(this.ID == TileMapCell.TID_22DEGpnS) {
|
||
|
this.signx = 1;
|
||
|
this.signy = -1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 1) / slen;
|
||
|
this.sy = (this.signy * 2) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_22DEGnnS) {
|
||
|
this.signx = -1;
|
||
|
this.signy = -1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 1) / slen;
|
||
|
this.sy = (this.signy * 2) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_22DEGnpS) {
|
||
|
this.signx = -1;
|
||
|
this.signy = 1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 1) / slen;
|
||
|
this.sy = (this.signy * 2) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_22DEGppS) {
|
||
|
this.signx = 1;
|
||
|
this.signy = 1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 1) / slen;
|
||
|
this.sy = (this.signy * 2) / slen;
|
||
|
} else {
|
||
|
//trace("BAAAD TILE!!!!!: ID=" + this.ID + " ("+ t.i + "," + t.j + ")");
|
||
|
return false;
|
||
|
}
|
||
|
} else if(this.ID < TileMapCell.CTYPE_67DEGs) {
|
||
|
//22deg big
|
||
|
this.CTYPE = TileMapCell.CTYPE_22DEGb;
|
||
|
if(this.ID == TileMapCell.TID_22DEGpnB) {
|
||
|
this.signx = 1;
|
||
|
this.signy = -1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 1) / slen;
|
||
|
this.sy = (this.signy * 2) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_22DEGnnB) {
|
||
|
this.signx = -1;
|
||
|
this.signy = -1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 1) / slen;
|
||
|
this.sy = (this.signy * 2) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_22DEGnpB) {
|
||
|
this.signx = -1;
|
||
|
this.signy = 1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 1) / slen;
|
||
|
this.sy = (this.signy * 2) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_22DEGppB) {
|
||
|
this.signx = 1;
|
||
|
this.signy = 1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 1) / slen;
|
||
|
this.sy = (this.signy * 2) / slen;
|
||
|
} else {
|
||
|
//trace("BAAAD TILE!!!!!: ID=" + this.ID + " ("+ t.i + "," + t.j + ")");
|
||
|
return false;
|
||
|
}
|
||
|
} else if(this.ID < TileMapCell.CTYPE_67DEGb) {
|
||
|
//67deg small
|
||
|
this.CTYPE = TileMapCell.CTYPE_67DEGs;
|
||
|
if(this.ID == TileMapCell.TID_67DEGpnS) {
|
||
|
this.signx = 1;
|
||
|
this.signy = -1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 2) / slen;
|
||
|
this.sy = (this.signy * 1) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_67DEGnnS) {
|
||
|
this.signx = -1;
|
||
|
this.signy = -1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 2) / slen;
|
||
|
this.sy = (this.signy * 1) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_67DEGnpS) {
|
||
|
this.signx = -1;
|
||
|
this.signy = 1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 2) / slen;
|
||
|
this.sy = (this.signy * 1) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_67DEGppS) {
|
||
|
this.signx = 1;
|
||
|
this.signy = 1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 2) / slen;
|
||
|
this.sy = (this.signy * 1) / slen;
|
||
|
} else {
|
||
|
//trace("BAAAD TILE!!!!!: ID=" + this.ID + " ("+ t.i + "," + t.j + ")");
|
||
|
return false;
|
||
|
}
|
||
|
} else if(this.ID < TileMapCell.CTYPE_HALF) {
|
||
|
//67deg big
|
||
|
this.CTYPE = TileMapCell.CTYPE_67DEGb;
|
||
|
if(this.ID == TileMapCell.TID_67DEGpnB) {
|
||
|
this.signx = 1;
|
||
|
this.signy = -1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 2) / slen;
|
||
|
this.sy = (this.signy * 1) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_67DEGnnB) {
|
||
|
this.signx = -1;
|
||
|
this.signy = -1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 2) / slen;
|
||
|
this.sy = (this.signy * 1) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_67DEGnpB) {
|
||
|
this.signx = -1;
|
||
|
this.signy = 1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 2) / slen;
|
||
|
this.sy = (this.signy * 1) / slen;
|
||
|
} else if(this.ID == TileMapCell.TID_67DEGppB) {
|
||
|
this.signx = 1;
|
||
|
this.signy = 1;
|
||
|
var slen = Math.sqrt(2 * 2 + 1 * 1);
|
||
|
this.sx = (this.signx * 2) / slen;
|
||
|
this.sy = (this.signy * 1) / slen;
|
||
|
} else {
|
||
|
//trace("BAAAD TILE!!!!!: ID=" + this.ID + " ("+ t.i + "," + t.j + ")");
|
||
|
return false;
|
||
|
}
|
||
|
} else {
|
||
|
//half-full tile
|
||
|
this.CTYPE = TileMapCell.CTYPE_HALF;
|
||
|
if(this.ID == TileMapCell.TID_HALFd) {
|
||
|
this.signx = 0;
|
||
|
this.signy = -1;
|
||
|
this.sx = this.signx;
|
||
|
this.sy = this.signy;
|
||
|
} else if(this.ID == TileMapCell.TID_HALFu) {
|
||
|
this.signx = 0;
|
||
|
this.signy = 1;
|
||
|
this.sx = this.signx;
|
||
|
this.sy = this.signy;
|
||
|
} else if(this.ID == TileMapCell.TID_HALFl) {
|
||
|
this.signx = 1;
|
||
|
this.signy = 0;
|
||
|
this.sx = this.signx;
|
||
|
this.sy = this.signy;
|
||
|
} else if(this.ID == TileMapCell.TID_HALFr) {
|
||
|
this.signx = -1;
|
||
|
this.signy = 0;
|
||
|
this.sx = this.signx;
|
||
|
this.sy = this.signy;
|
||
|
} else {
|
||
|
//trace("BAAD TILE!!!: ID=" + this.ID + " ("+ t.i + "," + t.j + ")");
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
//TID_EMPTY
|
||
|
this.CTYPE = TileMapCell.CTYPE_EMPTY;
|
||
|
this.signx = 0;
|
||
|
this.signy = 0;
|
||
|
this.sx = 0;
|
||
|
this.sy = 0;
|
||
|
}
|
||
|
};
|
||
|
return TileMapCell;
|
||
|
})();
|
||
|
Physics.TileMapCell = TileMapCell;
|
||
|
})(Phaser.Physics || (Phaser.Physics = {}));
|
||
|
var Physics = Phaser.Physics;
|
||
|
})(Phaser || (Phaser = {}));
|