diff --git a/Phaser/Collision.ts b/Phaser/Collision.ts index aac18b85..55d3d0c7 100644 --- a/Phaser/Collision.ts +++ b/Phaser/Collision.ts @@ -604,7 +604,7 @@ module Phaser { } /** - * The main collision resolution in flixel. + * The main collision resolution. * * @param Object1 Any Sprite. * @param Object2 Any other Sprite. @@ -620,6 +620,120 @@ module Phaser { } + /** + * Collision resolution specifically for GameObjects vs. Tiles. + * + * @param Object1 Any GameObject. + * @param Object2 Any Tile. + * + * @return Whether the objects in fact touched and were separated. + */ + public static separateTile(object:GameObject, tile:Tile): bool { + + //var separatedX: bool = Collision.separateTileX(object, tile); + //var separatedY: bool = Collision.separateTileY(object, tile); + + //return separatedX || separatedY; + + return false; + + } + + /* + public static separateTileX(object:GameObject, tile:Tile): bool { + + //First, get the two object deltas + var overlap: number = 0; + var obj1delta: number = object.x - object.last.x; + var obj2delta: number = tile.x; + + if (obj1delta != obj2delta) + { + //Check if the X hulls actually overlap + var obj1deltaAbs: number = (obj1delta > 0) ? obj1delta : -obj1delta; + var obj2deltaAbs: number = (obj2delta > 0) ? obj2delta : -obj2delta; + //var obj1rect: Rectangle = new Rectangle(Object1.x - ((obj1delta > 0) ? obj1delta : 0), Object1.last.y, Object1.width + ((obj1delta > 0) ? obj1delta : -obj1delta), Object1.height); + //var obj2rect: Rectangle = new Rectangle(Object2.x - ((obj2delta > 0) ? obj2delta : 0), Object2.last.y, Object2.width + ((obj2delta > 0) ? obj2delta : -obj2delta), Object2.height); + + //if ((obj1rect.x + obj1rect.width > obj2rect.x) && (obj1rect.x < obj2rect.x + obj2rect.width) && (obj1rect.y + obj1rect.height > obj2rect.y) && (obj1rect.y < obj2rect.y + obj2rect.height)) + //{ + var maxOverlap: number = obj1deltaAbs + obj2deltaAbs + Collision.OVERLAP_BIAS; + + //If they did overlap (and can), figure out by how much and flip the corresponding flags + if (obj1delta > obj2delta) + { + overlap = Object1.x + Object1.width - Object2.x; + + if ((overlap > maxOverlap) || !(Object1.allowCollisions & Collision.RIGHT) || !(Object2.allowCollisions & Collision.LEFT)) + { + overlap = 0; + } + else + { + Object1.touching |= Collision.RIGHT; + Object2.touching |= Collision.LEFT; + } + } + else if (obj1delta < obj2delta) + { + overlap = Object1.x - Object2.width - Object2.x; + + if ((-overlap > maxOverlap) || !(Object1.allowCollisions & Collision.LEFT) || !(Object2.allowCollisions & Collision.RIGHT)) + { + overlap = 0; + } + else + { + Object1.touching |= Collision.LEFT; + Object2.touching |= Collision.RIGHT; + } + + } + + } + } + + //Then adjust their positions and velocities accordingly (if there was any overlap) + if (overlap != 0) + { + var obj1v: number = Object1.velocity.x; + var obj2v: number = Object2.velocity.x; + + if (!obj1immovable && !obj2immovable) + { + overlap *= 0.5; + Object1.x = Object1.x - overlap; + Object2.x += overlap; + + var obj1velocity: number = Math.sqrt((obj2v * obj2v * Object2.mass) / Object1.mass) * ((obj2v > 0) ? 1 : -1); + var obj2velocity: number = Math.sqrt((obj1v * obj1v * Object1.mass) / Object2.mass) * ((obj1v > 0) ? 1 : -1); + var average: number = (obj1velocity + obj2velocity) * 0.5; + obj1velocity -= average; + obj2velocity -= average; + Object1.velocity.x = average + obj1velocity * Object1.elasticity; + Object2.velocity.x = average + obj2velocity * Object2.elasticity; + } + else if (!obj1immovable) + { + Object1.x = Object1.x - overlap; + Object1.velocity.x = obj2v - obj1v * Object1.elasticity; + } + else if (!obj2immovable) + { + Object2.x += overlap; + Object2.velocity.x = obj1v - obj2v * Object2.elasticity; + } + + return true; + } + else + { + return false; + } + + } + */ + /** * The X-axis component of the object separation process. * @@ -639,19 +753,6 @@ module Phaser { return false; } - //If one of the objects is a tilemap, just pass it off. - /* - if (typeof Object1 === 'Tilemap') - { - return Object1.overlapsWithCallback(Object2, separateX); - } - - if (typeof Object2 === 'Tilemap') - { - return Object2.overlapsWithCallback(Object1, separateX, true); - } - */ - //First, get the two object deltas var overlap: number = 0; var obj1delta: number = Object1.x - Object1.last.x; diff --git a/Phaser/Game.ts b/Phaser/Game.ts index ef780a4f..23218712 100644 --- a/Phaser/Game.ts +++ b/Phaser/Game.ts @@ -35,6 +35,9 @@ * * This is where the magic happens. The Game object is the heart of your game, * providing quick access to common functions and handling the boot process. +* +* "Hell, there are no rules here - we're trying to accomplish something." +* Thomas A. Edison */ module Phaser { diff --git a/Phaser/Phaser.ts b/Phaser/Phaser.ts index 8fca2aee..7434f78c 100644 --- a/Phaser/Phaser.ts +++ b/Phaser/Phaser.ts @@ -1,7 +1,7 @@ /** * Phaser * -* v0.9.3 - April 24th 2013 +* v0.9.4 - April 24th 2013 * * A small and feature-packed 2D canvas game framework born from the firey pits of Flixel and Kiwi. * @@ -16,6 +16,6 @@ module Phaser { - export var VERSION: string = 'Phaser version 0.9.3'; + export var VERSION: string = 'Phaser version 0.9.4'; } diff --git a/Phaser/gameobjects/GameObject.ts b/Phaser/gameobjects/GameObject.ts index 5b578181..e942cf72 100644 --- a/Phaser/gameobjects/GameObject.ts +++ b/Phaser/gameobjects/GameObject.ts @@ -89,6 +89,8 @@ module Phaser { // rotationOffset to 90 and it would correspond correctly with Phasers rotation system public rotationOffset: number = 0; + public renderRotation: bool = true; + // Physics properties public immovable: bool; diff --git a/Phaser/gameobjects/Sprite.ts b/Phaser/gameobjects/Sprite.ts index ba849c3a..106226b4 100644 --- a/Phaser/gameobjects/Sprite.ts +++ b/Phaser/gameobjects/Sprite.ts @@ -229,7 +229,7 @@ module Phaser { this._game.stage.context.save(); this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); - if (this.angle !== 0 || this.rotationOffset !== 0) + if (this.renderRotation == true && (this.angle !== 0 || this.rotationOffset !== 0)) { this._game.stage.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180)); } diff --git a/Phaser/gameobjects/Tilemap.ts b/Phaser/gameobjects/Tilemap.ts index 526d1aea..09f5c192 100644 --- a/Phaser/gameobjects/Tilemap.ts +++ b/Phaser/gameobjects/Tilemap.ts @@ -1,6 +1,7 @@ /// /// /// +/// /** * Phaser - Tilemap @@ -19,7 +20,8 @@ module Phaser { this.isGroup = false; - this._layers = []; + this.tiles = []; + this.layers = []; this.mapFormat = format; @@ -41,11 +43,11 @@ module Phaser { } - private _layers : TilemapLayer[]; - public static FORMAT_CSV: number = 0; public static FORMAT_TILED_JSON: number = 1; + public tiles : Tile[]; + public layers : TilemapLayer[]; public currentLayer: TilemapLayer; public mapFormat: number; @@ -57,9 +59,9 @@ module Phaser { if (this.cameraBlacklist.indexOf(camera.ID) == -1) { // Loop through the layers - for (var i = 0; i < this._layers.length; i++) + for (var i = 0; i < this.layers.length; i++) { - this._layers[i].render(camera, cameraOffsetX, cameraOffsetY); + this.layers[i].render(camera, cameraOffsetX, cameraOffsetY); } } @@ -67,7 +69,7 @@ module Phaser { private parseCSV(data: string, key: string, tileWidth: number, tileHeight: number) { - var layer: TilemapLayer = new TilemapLayer(this._game, key, Tilemap.FORMAT_CSV, 'TileLayerCSV' + this._layers.length.toString(), tileWidth, tileHeight); + var layer: TilemapLayer = new TilemapLayer(this._game, this, key, Tilemap.FORMAT_CSV, 'TileLayerCSV' + this.layers.length.toString(), tileWidth, tileHeight); // Trim any rogue whitespace from the data data = data.trim(); @@ -85,10 +87,13 @@ module Phaser { } layer.updateBounds(); + var tileQuantity = layer.parseTileOffsets(); this.currentLayer = layer; - this._layers.push(layer); + this.layers.push(layer); + + this.generateTiles(tileQuantity); } @@ -101,10 +106,12 @@ module Phaser { for (var i = 0; i < json.layers.length; i++) { - var layer: TilemapLayer = new TilemapLayer(this._game, key, Tilemap.FORMAT_TILED_JSON, json.layers[i].name, json.tilewidth, json.tileheight); + var layer: TilemapLayer = new TilemapLayer(this._game, this, key, Tilemap.FORMAT_TILED_JSON, json.layers[i].name, json.tilewidth, json.tileheight); layer.alpha = json.layers[i].opacity; layer.visible = json.layers[i].visible; + layer.tileMargin = json.tilesets[0].margin; + layer.tileSpacing = json.tilesets[0].spacing; var c = 0; var row; @@ -129,12 +136,25 @@ module Phaser { layer.updateBounds(); + var tileQuantity = layer.parseTileOffsets(); + this.currentLayer = layer; - this._layers.push(layer); + this.layers.push(layer); } + this.generateTiles(tileQuantity); + + } + + private generateTiles(qty:number) { + + for (var i = 0; i < qty; i++) + { + this.tiles.push(new Tile(this._game, this, i, this.currentLayer.tileWidth, this.currentLayer.tileHeight)); + } + } public get widthInPixels(): number { @@ -145,9 +165,84 @@ module Phaser { return this.currentLayer.heightInPixels; } + // Tile Collision + + public setCollisionRange(start: number, end: number, collision?:number = Collision.ANY) { + + for (var i = start; i < end; i++) + { + this.tiles[i].allowCollisions = collision; + } + + } + + public setCollisionByIndex(values:number[], collision?:number = Collision.ANY) { + + for (var i = 0; i < values.length; i++) + { + this.tiles[values[i]].allowCollisions = collision; + } + + } + + // Tile Management + + public getTile(x: number, y: number, layer?: number = 0):Tile { + + return this.tiles[this.layers[layer].getTileIndex(x, y)]; + + } + + public getTileFromWorldXY(x: number, y: number, layer?: number = 0):Tile { + + return this.tiles[this.layers[layer].getTileFromWorldXY(x, y)]; + + } + + public getTileFromInputXY(layer?: number = 0):Tile { + + return this.tiles[this.layers[layer].getTileFromWorldXY(this._game.input.worldX, this._game.input.worldY)]; + + } + + public getTileOverlaps(object: GameObject) { + + return this.currentLayer.getTileOverlaps(object); + + } + + // COLLIDE + public collide(objectOrGroup = null, callback = null): bool { + + if (objectOrGroup == null) + { + objectOrGroup = this._game.world.group; + } + + // Group? + if (objectOrGroup.isGroup == false) + { + if (objectOrGroup.exists && objectOrGroup.allowCollisions != Collision.NONE) + { + // Get the tiles this object overlaps with (could be any number based on its width/height) + + // Iterate through each tile, checking if it overlaps with the object bounds + + // Yes? then separate, else abort + } + } + else + { + // todo + } + + return true; + + } + + // Set current layer // Set layer order? - // Get tile from x/y // Get block of tiles // Swap tiles around // Delete tiles of certain type diff --git a/Phaser/geom/Quad.ts b/Phaser/geom/Quad.ts index 88adc41d..bfad11db 100644 --- a/Phaser/geom/Quad.ts +++ b/Phaser/geom/Quad.ts @@ -72,11 +72,11 @@ module Phaser { * Determines whether the object specified intersects (overlaps) with this Quad object. * This method checks the x, y, width, and height properties of the specified Quad object to see if it intersects with this Quad object. * @method intersects - * @param {Quad} q The Quad to compare against to see if it intersects with this Quad. + * @param {Object} q The object to check for intersection with this Quad. Must have left/right/top/bottom properties (Rectangle, Quad). * @param {Number} t A tolerance value to allow for an intersection test with padding, default to 0 * @return {Boolean} A value of true if the specified object intersects with this Quad; otherwise false. **/ - public intersects(q: Quad, t?: number = 0): bool { + public intersects(q, t?: number = 0): bool { return !(q.left > this.right + t || q.right < this.left - t || q.top > this.bottom + t || q.bottom < this.top - t); diff --git a/Phaser/phaser.js b/Phaser/phaser.js index 2d2a57e4..b2d7ffdb 100644 --- a/Phaser/phaser.js +++ b/Phaser/phaser.js @@ -1,7 +1,7 @@ /** * Phaser * -* v0.9.3 - April 24th 2013 +* v0.9.4 - April 24th 2013 * * A small and feature-packed 2D canvas game framework born from the firey pits of Flixel and Kiwi. * @@ -15,5 +15,5 @@ */ var Phaser; (function (Phaser) { - Phaser.VERSION = 'Phaser version 0.9.3'; + Phaser.VERSION = 'Phaser version 0.9.4'; })(Phaser || (Phaser = {})); diff --git a/Phaser/system/Camera.ts b/Phaser/system/Camera.ts index e05e3e71..d43a3ac4 100644 --- a/Phaser/system/Camera.ts +++ b/Phaser/system/Camera.ts @@ -269,23 +269,21 @@ module Phaser { /** * Specify the boundaries of the world or where the camera is allowed to move. * - * @param X The smallest X value of your world (usually 0). - * @param Y The smallest Y value of your world (usually 0). - * @param Width The largest X value of your world (usually the world width). - * @param Height The largest Y value of your world (usually the world height). - * @param UpdateWorld Whether the global quad-tree's dimensions should be updated to match (default: false). + * @param x The smallest X value of your world (usually 0). + * @param y The smallest Y value of your world (usually 0). + * @param width The largest X value of your world (usually the world width). + * @param height The largest Y value of your world (usually the world height). */ - public setBounds(X: number = 0, Y: number = 0, Width: number = 0, Height: number = 0, UpdateWorld: bool = false) { + public setBounds(x: number = 0, y: number = 0, width: number = 0, height: number = 0) { if (this.bounds == null) { this.bounds = new Rectangle(); } - this.bounds.setTo(X, Y, Width, Height); - - //if(UpdateWorld) - // G.worldBounds.copyFrom(bounds); + this.bounds.setTo(x, y, width, height); + this.worldView.setTo(x, y, width, height); + this.scroll.setTo(0, 0); this.update(); } @@ -345,7 +343,7 @@ module Phaser { if (this.scroll.x > this.bounds.right - this.width) { - this.scroll.x = this.bounds.right - this.width; + this.scroll.x = (this.bounds.right - this.width) + 1; } if (this.scroll.y < this.bounds.top) @@ -355,7 +353,7 @@ module Phaser { if (this.scroll.y > this.bounds.bottom - this.height) { - this.scroll.y = this.bounds.bottom - this.height; + this.scroll.y = (this.bounds.bottom - this.height) + 1; } } diff --git a/Phaser/system/QuadTree.ts b/Phaser/system/QuadTree.ts index e157fb8c..307a1101 100644 --- a/Phaser/system/QuadTree.ts +++ b/Phaser/system/QuadTree.ts @@ -632,7 +632,7 @@ module Phaser { */ public execute(): bool { - //console.log('quadtree execute'); + console.log('quadtree execute'); var overlapProcessed: bool = false; var iterator: LinkedList; @@ -704,8 +704,6 @@ module Phaser { */ private overlapNode(): bool { - //console.log('overlapNode'); - //Walk the list and check for overlaps var overlapProcessed: bool = false; var checkObject; diff --git a/Phaser/system/Tile.ts b/Phaser/system/Tile.ts index 5505a6db..ec0c7f87 100644 --- a/Phaser/system/Tile.ts +++ b/Phaser/system/Tile.ts @@ -3,55 +3,35 @@ /** * Phaser - Tile * -* A simple helper object for Tilemap that helps expand collision opportunities and control. +* A Tile is a single representation of a tile within a Tilemap */ module Phaser { - export class Tile extends GameObject { + export class Tile { - /** - * Instantiate this new tile object. This is usually called from Tilemap.loadMap(). - * - * @param Tilemap A reference to the tilemap object creating the tile. - * @param Index The actual core map data index for this tile type. - * @param Width The width of the tile. - * @param Height The height of the tile. - * @param Visible Whether the tile is visible or not. - * @param AllowCollisions The collision flags for the object. By default this value is ANY or NONE depending on the parameters sent to loadMap(). - */ - constructor(game: Game, Tilemap: Tilemap, Index: number, Width: number, Height: number, Visible: bool, AllowCollisions: number) { + constructor(game: Game, tilemap: Tilemap, index: number, width: number, height: number) { - super(game, 0, 0, Width, Height); + this._game = game; + this.tilemap = tilemap; + this.index = index; - this.immovable = true; - this.moves = false; - this.callback = null; - this.filter = null; - - this.tilemap = Tilemap; - this.index = Index; - this.visible = Visible; - this.allowCollisions = AllowCollisions; - - this.mapIndex = 0; + this.width = width; + this.height = height; + this.allowCollisions = Collision.NONE; } - /** - * This function is called whenever an object hits a tile of this type. - * This function should take the form myFunction(Tile:Tile,Object:Object). - * Defaults to null, set through Tilemap.setTileProperties(). - */ - public callback; + private _game: Game; - /** - * Each tile can store its own filter class for their callback functions. - * That is, the callback will only be triggered if an object with a class - * type matching the filter touched it. - * Defaults to null, set through Tilemap.setTileProperties(). - */ - public filter; + // You can give this Tile a friendly name to help with debugging. Never used internally. + public name: string; + + public width: number; + + public height: number; + + public allowCollisions: number; /** * A reference to the tilemap this tile object belongs to. @@ -65,24 +45,26 @@ module Phaser { */ public index: number; - /** - * The current map index of this tile object at this moment. - * You can think of tile objects as moving around the tilemap helping with collisions. - * This value is only reliable and useful if used from the callback function. - */ - public mapIndex: number; - /** * Clean up memory. */ public destroy() { - super.destroy(); - this.callback = null; this.tilemap = null; } + /** + * Returns a string representation of this object. + * @method toString + * @return {string} a string representation of the object. + **/ + public toString(): string { + + return "[{Tiled (index=" + this.index + " collisions=" + this.allowCollisions + " width=" + this.width + " height=" + this.height + ")}]"; + + } + } } \ No newline at end of file diff --git a/Phaser/system/TilemapLayer.ts b/Phaser/system/TilemapLayer.ts index 4309d028..4f0b3be4 100644 --- a/Phaser/system/TilemapLayer.ts +++ b/Phaser/system/TilemapLayer.ts @@ -10,9 +10,10 @@ module Phaser { export class TilemapLayer { - constructor(game: Game, key: string, mapFormat: number, name: string, tileWidth: number, tileHeight: number) { + constructor(game: Game, parent:Tilemap, key: string, mapFormat: number, name: string, tileWidth: number, tileHeight: number) { this._game = game; + this._parent = parent; this.name = name; this.mapFormat = mapFormat; @@ -24,11 +25,10 @@ module Phaser { this.mapData = []; this._texture = this._game.cache.getImage(key); - this.parseTileOffsets(); - } private _game: Game; + private _parent: Tilemap; private _texture; private _tileOffsets; private _startX: number = 0; @@ -45,6 +45,7 @@ module Phaser { public name: string; public alpha: number = 1; + public exists: bool = true; public visible: bool = true; //public scrollFactor: MicroPoint; public orientation: string; @@ -63,6 +64,119 @@ module Phaser { public widthInPixels: number = 0; public heightInPixels: number = 0; + public tileMargin: number = 0; + public tileSpacing: number = 0; + + public getTileFromWorldXY(x: number, y: number): number { + + x = this._game.math.snapToFloor(x, this.tileWidth) / this.tileWidth; + y = this._game.math.snapToFloor(y, this.tileHeight) / this.tileHeight; + + return this.getTileIndex(x, y); + + } + + public getTileOverlaps(object: GameObject) { + + //var result: bool = false; + //var x: number = object.x; + //var y: number = object.y; + + // What tiles do we need to check against? + var mapX:number = this._game.math.snapToFloor(object.bounds.x, this.tileWidth); + var mapY:number = this._game.math.snapToFloor(object.bounds.y, this.tileHeight); + var mapW:number = this._game.math.snapToCeil(object.bounds.width, this.tileWidth) + this.tileWidth; + var mapH:number = this._game.math.snapToCeil(object.bounds.height, this.tileHeight) + this.tileHeight; + + var tileX = mapX / this.tileWidth; + var tileY = mapY / this.tileHeight; + var tileW = mapW / this.tileWidth; + var tileH = mapH / this.tileHeight; + + if (tileX < 0) + { + tileX = 0; + } + + if (tileY < 0) + { + tileY = 0; + } + + if (tileW > this.widthInTiles) + { + tileW = this.widthInTiles; + } + + if (tileH > this.heightInTiles) + { + tileH = this.heightInTiles; + } + + // Loop through the tiles we've got and check overlaps accordingly + var tiles = this.getTileBlock(tileX, tileY, tileW, tileH); + + var result = []; + var tempBounds = new Quad(); + + for (var r = 0; r < tiles.length; r++) + { + if (tiles[r].tile.allowCollisions != Collision.NONE) + { + tempBounds.setTo(tiles[r].x * this.tileWidth, tiles[r].y * this.tileHeight, this.tileWidth, this.tileHeight); + + if (tempBounds.intersects(object.bounds)) + { + result.push(true); + } + else + { + result.push(false); + } + } + else + { + result.push(false); + } + } + + //return { x: mapX, y: mapY, w: mapW, h: mapH, collision: result }; + return { x: tileX, y: tileY, w: tileW, h: tileH, collision: result }; + + } + + //public checkTileOverlap(object:GameObject, + + public getTileBlock(x: number, y: number, width: number, height: number) { + + var output = []; + + for (var ty = y; ty < y + height; ty++) + { + for (var tx = x; tx < x + width; tx++) + { + output.push({ x: tx, y: ty, tile: this._parent.tiles[this.mapData[ty][tx]] }); + } + } + + return output; + + } + + public getTileIndex(x: number, y: number): number { + + if (y >= 0 && y < this.mapData.length) + { + if (x >= 0 && x < this.mapData[y].length) + { + return this.mapData[y][x]; + } + } + + return null; + + } + public addColumn(column) { var data = []; @@ -89,9 +203,11 @@ module Phaser { this.boundsInTiles.setTo(0, 0, this.widthInTiles, this.heightInTiles); + console.log('layer bounds', this.boundsInTiles); + } - private parseTileOffsets() { + public parseTileOffsets():number { this._tileOffsets = []; @@ -104,15 +220,17 @@ module Phaser { i = 1; } - for (var ty = 0; ty < this._texture.height; ty += this.tileHeight) + for (var ty = this.tileMargin; ty < this._texture.height; ty += (this.tileHeight + this.tileSpacing)) { - for (var tx = 0; tx < this._texture.width; tx += this.tileWidth) + for (var tx = this.tileMargin; tx < this._texture.width; tx += (this.tileWidth + this.tileSpacing)) { this._tileOffsets[i] = { x: tx, y: ty }; i++; } } + return this._tileOffsets.length; + } public renderDebugInfo(x: number, y: number, color?: string = 'rgb(255,255,255)') { @@ -151,6 +269,16 @@ module Phaser { this._startY = 0; } + if (this._maxX > this.widthInTiles) + { + this._maxX = this.widthInTiles; + } + + if (this._maxY > this.heightInTiles) + { + this._maxY = this.heightInTiles; + } + if (this._startX + this._maxX > this.widthInTiles) { this._startX = this.widthInTiles - this._maxX; diff --git a/Phaser/system/input/Input.ts b/Phaser/system/input/Input.ts index f27c4719..bde9380c 100644 --- a/Phaser/system/input/Input.ts +++ b/Phaser/system/input/Input.ts @@ -77,6 +77,7 @@ module Phaser { public renderDebugInfo(x: number, y: number, color?: string = 'rgb(255,255,255)') { + this._game.stage.context.font = '14px Courier'; this._game.stage.context.fillStyle = color; this._game.stage.context.fillText('Input', x, y); this._game.stage.context.fillText('Screen X: ' + this.x + ' Screen Y: ' + this.y, x, y + 14); diff --git a/Phaser/system/input/Keyboard.ts b/Phaser/system/input/Keyboard.ts index 332806f4..0c98191f 100644 --- a/Phaser/system/input/Keyboard.ts +++ b/Phaser/system/input/Keyboard.ts @@ -32,7 +32,7 @@ module Phaser { public addKeyCapture(keycode) { - if (typeof keycode == 'array') + if (typeof keycode === 'object') { for (var code in keycode) { diff --git a/README.md b/README.md index cac21f39..80fe561c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ Phaser ====== -Version 0.9.3 - -24th April 2013 +Version: 0.9.4 Released: XX April 2013 By Richard Davey, [Photon Storm](http://www.photonstorm.com) @@ -20,23 +18,13 @@ Try out the [Phaser Test Suite](http://gametest.mobi/phaser/) Latest Update ------------- -V0.9.3 +V0.9.4 + +* Fixed Tilemap bounds check if map was smaller than game dimensions +* Added Tilemap.getTile, getTileFromWorldXY, getTileFromInputXY +* Added Tilemap.setCollisionByIndex and setCollisionByRange +* Added GameObject.renderRotation boolean to control if the sprite will visually rotate or not (useful when angle needs to change but graphics don't) -* Added the new ScrollZone game object. Endlessly useful but especially for scrolling backdrops. Created 6 example tests. -* Added GameObject.hideFromCamera(cameraID) to stop an object rendering to specific cameras (also showToCamera and clearCameraList) -* Added GameObject.setBounds() to confine a game object to a specific area within the world (useful for stopping them going off the edges) -* Added GameObject.outOfBoundsAction, can be either OUT OF BOUNDS STOP which stops the object moving, or OUT OF BOUNDS KILL which kills it. -* Added GameObject.rotationOffset. Useful if your graphics need to rotate but weren't drawn facing zero degrees (to the right). -* Added shiftSinTable and shiftCosTable to the GameMath class to allow for quick iteration through the data tables. -* Added more robust frame checking into AnimationManager -* Re-built Tilemap handling from scratch to allow for proper layered maps (as exported from Tiled / Mappy) -* Tilemap no longer requires a buffer per Camera (in prep for WebGL support) -* Fixed issues with Group not adding reference to Game to newly created objects (thanks JesseFreeman) -* Fixed a potential race condition issue in Game.boot (thanks Hackmaniac) -* Fixed issue with showing frame zero of a texture atlas before the animation started playing (thanks JesseFreeman) -* Fixed a bug where Camera.visible = false would still render -* Removed the need for DynamicTextures to require a key property and updated test cases. -* You can now pass an array or a single value to Input.Keyboard.addKeyCapture(). Requirements ------------ @@ -171,6 +159,24 @@ Please add them to the [Issue Tracker][1] with as much info as possible. Change Log ---------- +V0.9.3 + +* Added the new ScrollZone game object. Endlessly useful but especially for scrolling backdrops. Created 6 example tests. +* Added GameObject.hideFromCamera(cameraID) to stop an object rendering to specific cameras (also showToCamera and clearCameraList) +* Added GameObject.setBounds() to confine a game object to a specific area within the world (useful for stopping them going off the edges) +* Added GameObject.outOfBoundsAction, can be either OUT OF BOUNDS STOP which stops the object moving, or OUT OF BOUNDS KILL which kills it. +* Added GameObject.rotationOffset. Useful if your graphics need to rotate but weren't drawn facing zero degrees (to the right). +* Added shiftSinTable and shiftCosTable to the GameMath class to allow for quick iteration through the data tables. +* Added more robust frame checking into AnimationManager +* Re-built Tilemap handling from scratch to allow for proper layered maps (as exported from Tiled / Mappy) +* Tilemap no longer requires a buffer per Camera (in prep for WebGL support) +* Fixed issues with Group not adding reference to Game to newly created objects (thanks JesseFreeman) +* Fixed a potential race condition issue in Game.boot (thanks Hackmaniac) +* Fixed issue with showing frame zero of a texture atlas before the animation started playing (thanks JesseFreeman) +* Fixed a bug where Camera.visible = false would still render +* Removed the need for DynamicTextures to require a key property and updated test cases. +* You can now pass an array or a single value to Input.Keyboard.addKeyCapture(). + V0.9.2 * Fixed issue with create not being called if there was an empty init method. diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index fdceaa9e..700bd89b 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -133,6 +133,14 @@ flipped.ts + + + + collision.ts + + + get tile.ts + small map.ts diff --git a/Tests/assets/maps/desert.json b/Tests/assets/maps/desert.json new file mode 100644 index 00000000..f13fc5e6 --- /dev/null +++ b/Tests/assets/maps/desert.json @@ -0,0 +1,39 @@ +{ "height":40, + "layers":[ + { + "data":[30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 14, 15, 16, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 46, 30, 30, 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 46, 14, 15, 16, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 14, 15, 16, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 22, 23, 24, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 32, 30, 30, 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 1, 3, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 30, 9, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 30, 9, 11, 30, 30, 30, 30, 6, 7, 7, 7, 8, 30, 46, 30, 30, 30, 30, 30, 30, 30, 30, 40, 30, 30, 30, 30, 33, 34, 36, 42, 37, 34, 34, 34, 34, 34, 34, 34, 35, 30, 9, 11, 30, 30, 30, 30, 14, 15, 15, 15, 16, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 35, 30, 33, 34, 34, 34, 34, 34, 34, 34, 35, 30, 9, 11, 30, 30, 30, 30, 14, 15, 15, 15, 12, 8, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 38, 30, 30, 33, 34, 35, 31, 33, 34, 34, 34, 34, 34, 34, 34, 35, 30, 9, 11, 30, 30, 30, 30, 22, 23, 5, 15, 15, 16, 30, 30, 30, 30, 30, 30, 30, 30, 48, 38, 30, 30, 30, 30, 33, 34, 44, 26, 45, 34, 34, 34, 34, 34, 34, 34, 35, 30, 9, 11, 30, 30, 30, 30, 30, 30, 14, 15, 15, 16, 30, 30, 30, 30, 30, 30, 40, 30, 30, 30, 40, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 36, 42, 37, 34, 35, 30, 9, 11, 30, 30, 30, 30, 30, 31, 22, 23, 23, 24, 30, 30, 30, 40, 30, 30, 30, 30, 40, 38, 30, 30, 38, 30, 41, 42, 42, 42, 42, 37, 34, 34, 44, 26, 45, 34, 35, 30, 9, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 39, 30, 30, 30, 38, 30, 40, 30, 30, 30, 30, 30, 30, 30, 30, 41, 42, 42, 42, 42, 42, 42, 43, 30, 9, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 39, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 9, 11, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 7, 7, 8, 1, 2, 2, 2, 2, 2, 3, 30, 30, 30, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 29, 11, 30, 30, 30, 30, 31, 30, 31, 30, 30, 30, 30, 30, 30, 15, 15, 16, 9, 10, 10, 10, 10, 10, 11, 30, 30, 30, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 23, 23, 24, 17, 18, 18, 18, 18, 18, 19, 30, 30, 30, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 39, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 32, 31, 30, 30, 30, 30, 39, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 39, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 46, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 36, 42, 37, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 35, 48, 33, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 47, 33, 34, 34, 34, 34, 34, 34, 34, 34, 35, 48, 33, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 39, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 35, 48, 33, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 44, 26, 45, 35, 30, 30, 30, 30, 30, 30, 39, 30, 39, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 47, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 48, 30, 30, 30, 30, 30, 39, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 30, 30, 30, 38, 30, 38, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 38, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 38, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 6, 7, 7, 7, 7, 8, 30, 30, 30, 30, 30, 30, 30, 40, 30, 40, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 26, 26, 26, 26, 26, 26, 26, 45, 34, 34, 34, 34, 44, 27, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 30, 30, 30, 30, 40, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], + "height":40, + "name":"Ground", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":40, + "x":0, + "y":0 + }], + "orientation":"orthogonal", + "properties": + { + + }, + "tileheight":32, + "tilesets":[ + { + "firstgid":1, + "image":"C:\/Program Files (x86)\/Tiled\/examples\/tmw_desert_spacing.png", + "imageheight":199, + "imagewidth":265, + "margin":1, + "name":"Desert", + "properties": + { + + }, + "spacing":1, + "tileheight":32, + "tilewidth":32 + }], + "tilewidth":32, + "version":1, + "width":40 +} \ No newline at end of file diff --git a/Tests/assets/maps/desert2.json b/Tests/assets/maps/desert2.json new file mode 100644 index 00000000..55664747 --- /dev/null +++ b/Tests/assets/maps/desert2.json @@ -0,0 +1,54 @@ +{ "height":40, + "layers":[ + { + "data":[30, 49, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 14, 15, 16, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 46, 14, 15, 16, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 14, 15, 16, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 22, 23, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 1, 2, 3, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, 30, 30, 30, 30, 33, 34, 36, 42, 37, 34, 34, 34, 34, 34, 34, 34, 35, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 35, 30, 33, 34, 34, 34, 34, 34, 34, 34, 35, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 38, 30, 30, 33, 34, 35, 30, 33, 34, 34, 34, 34, 34, 34, 34, 35, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 48, 38, 30, 30, 30, 30, 33, 34, 44, 26, 45, 34, 34, 34, 34, 34, 34, 34, 35, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, 30, 30, 30, 40, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 36, 42, 37, 34, 35, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, 30, 30, 30, 30, 40, 38, 30, 30, 38, 30, 33, 34, 34, 34, 34, 34, 34, 34, 44, 26, 45, 34, 35, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 39, 30, 30, 30, 38, 30, 40, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 39, 30, 30, 30, 30, 30, 30, 30, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 9, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 7, 7, 8, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 29, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 15, 15, 16, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 23, 23, 24, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 39, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 31, 30, 30, 30, 30, 39, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 39, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 46, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 36, 42, 37, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 35, 48, 33, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 47, 33, 34, 34, 34, 34, 34, 34, 34, 34, 35, 48, 33, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 39, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 35, 48, 33, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 44, 26, 45, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 47, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 48, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], + "height":40, + "name":"Ground", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":40, + "x":0, + "y":0 + }], + "orientation":"orthogonal", + "properties": + { + + }, + "tileheight":32, + "tilesets":[ + { + "firstgid":1, + "image":"C:\/Program Files (x86)\/Tiled\/examples\/tmw_desert_spacing.png", + "imageheight":199, + "imagewidth":265, + "margin":1, + "name":"Desert", + "properties": + { + + }, + "spacing":1, + "tileheight":32, + "tilewidth":32 + }, + { + "firstgid":49, + "image":"..\/..\/..\/..\/kiwi-lite\/Test Suite\/assets\/tiles\/catastrophi_tiles_16.png", + "imageheight":80, + "imagewidth":448, + "margin":0, + "name":"catastrophi_tiles_16", + "properties": + { + + }, + "spacing":0, + "tileheight":16, + "tilewidth":16 + }], + "tilewidth":32, + "version":1, + "width":40 +} \ No newline at end of file diff --git a/Tests/assets/maps/platform-test-1.json b/Tests/assets/maps/platform-test-1.json new file mode 100644 index 00000000..eeb0528a --- /dev/null +++ b/Tests/assets/maps/platform-test-1.json @@ -0,0 +1,39 @@ +{ "height":40, + "layers":[ + { + "data":[21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 105, 106, 106, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 15, 1, 1, 0, 0, 0, 0, 0, 0, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 108, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 0, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 0, 0, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 105, 106, 106, 107, 108, 18, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 105, 106, 106, 107, 108, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 21, 16, 1, 1, 1, 1, 16, 1, 1, 1, 45, 48, 45, 45, 1, 1, 1, 1, 1, 1, 1, 14, 16, 1, 1, 1, 16, 1, 1, 1, 1, 16, 1, 1, 1, 45, 48, 45, 45, 1, 1, 1, 1, 1, 1, 1, 14, 16, 1, 21, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 3, 1, 1, 1, 2, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 3, 1, 1, 1, 2, 41, 41, 41, 41, 41, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78], + "height":40, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":50, + "x":0, + "y":0 + }], + "orientation":"orthogonal", + "properties": + { + + }, + "tileheight":16, + "tilesets":[ + { + "firstgid":1, + "image":"..\/..\/..\/..\/kiwi-lite\/Test Suite\/assets\/tiles\/platformer_tiles.png", + "imageheight":96, + "imagewidth":304, + "margin":0, + "name":"platformer_tiles", + "properties": + { + + }, + "spacing":0, + "tileheight":16, + "tilewidth":16 + }], + "tilewidth":16, + "version":1, + "width":50 +} \ No newline at end of file diff --git a/Tests/assets/tiles/tmw_desert_spacing.png b/Tests/assets/tiles/tmw_desert_spacing.png new file mode 100644 index 00000000..4e9995c0 Binary files /dev/null and b/Tests/assets/tiles/tmw_desert_spacing.png differ diff --git a/Tests/phaser.js b/Tests/phaser.js index 305a170f..9d434036 100644 --- a/Tests/phaser.js +++ b/Tests/phaser.js @@ -472,6 +472,7 @@ var Phaser; // For example if you had a sprite drawn facing straight up then you could set // rotationOffset to 90 and it would correspond correctly with Phasers rotation system this.rotationOffset = 0; + this.renderRotation = true; this.moves = true; // Input this.inputEnabled = false; @@ -1125,24 +1126,22 @@ var Phaser; Camera.prototype.setBounds = /** * Specify the boundaries of the world or where the camera is allowed to move. * - * @param X The smallest X value of your world (usually 0). - * @param Y The smallest Y value of your world (usually 0). - * @param Width The largest X value of your world (usually the world width). - * @param Height The largest Y value of your world (usually the world height). - * @param UpdateWorld Whether the global quad-tree's dimensions should be updated to match (default: false). + * @param x The smallest X value of your world (usually 0). + * @param y The smallest Y value of your world (usually 0). + * @param width The largest X value of your world (usually the world width). + * @param height The largest Y value of your world (usually the world height). */ - function (X, Y, Width, Height, UpdateWorld) { - if (typeof X === "undefined") { X = 0; } - if (typeof Y === "undefined") { Y = 0; } - if (typeof Width === "undefined") { Width = 0; } - if (typeof Height === "undefined") { Height = 0; } - if (typeof UpdateWorld === "undefined") { UpdateWorld = false; } + function (x, y, width, height) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof width === "undefined") { width = 0; } + if (typeof height === "undefined") { height = 0; } if(this.bounds == null) { this.bounds = new Phaser.Rectangle(); } - this.bounds.setTo(X, Y, Width, Height); - //if(UpdateWorld) - // G.worldBounds.copyFrom(bounds); + this.bounds.setTo(x, y, width, height); + this.worldView.setTo(x, y, width, height); + this.scroll.setTo(0, 0); this.update(); }; Camera.prototype.update = function () { @@ -1177,13 +1176,13 @@ var Phaser; this.scroll.x = this.bounds.left; } if(this.scroll.x > this.bounds.right - this.width) { - this.scroll.x = this.bounds.right - this.width; + this.scroll.x = (this.bounds.right - this.width) + 1; } if(this.scroll.y < this.bounds.top) { this.scroll.y = this.bounds.top; } if(this.scroll.y > this.bounds.bottom - this.height) { - this.scroll.y = this.bounds.bottom - this.height; + this.scroll.y = (this.bounds.bottom - this.height) + 1; } } this.worldView.x = this.scroll.x; @@ -1595,7 +1594,7 @@ var Phaser; if(this.angle !== 0 || this.rotationOffset !== 0 || this.flipped == true) { this._game.stage.context.save(); this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); - if(this.angle !== 0 || this.rotationOffset !== 0) { + if(this.renderRotation == true && (this.angle !== 0 || this.rotationOffset !== 0)) { this._game.stage.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180)); } this._dx = -(this._dw / 2); @@ -4369,7 +4368,7 @@ var Phaser; * @return Whether or not any overlaps were found. */ function () { - //console.log('quadtree execute'); + console.log('quadtree execute'); var overlapProcessed = false; var iterator; if(this._headA.object != null) { @@ -4415,7 +4414,6 @@ var Phaser; * @return Whether or not any overlaps were found. */ function () { - //console.log('overlapNode'); //Walk the list and check for overlaps var overlapProcessed = false; var checkObject; @@ -7465,7 +7463,7 @@ var Phaser; /** * Phaser * -* v0.9.3 - April 24th 2013 +* v0.9.4 - April 24th 2013 * * A small and feature-packed 2D canvas game framework born from the firey pits of Flixel and Kiwi. * @@ -7479,7 +7477,7 @@ var Phaser; */ var Phaser; (function (Phaser) { - Phaser.VERSION = 'Phaser version 0.9.3'; + Phaser.VERSION = 'Phaser version 0.9.4'; })(Phaser || (Phaser = {})); /// /** @@ -9491,6 +9489,7 @@ var Phaser; }; Input.prototype.renderDebugInfo = function (x, y, color) { if (typeof color === "undefined") { color = 'rgb(255,255,255)'; } + this._game.stage.context.font = '14px Courier'; this._game.stage.context.fillStyle = color; this._game.stage.context.fillText('Input', x, y); this._game.stage.context.fillText('Screen X: ' + this.x + ' Screen Y: ' + this.y, x, y + 14); @@ -9530,7 +9529,7 @@ var Phaser; }, false); }; Keyboard.prototype.addKeyCapture = function (keycode) { - if(typeof keycode == 'array') { + if(typeof keycode === 'object') { for(var code in keycode) { this._capture[code] = true; } @@ -10991,7 +10990,7 @@ var Phaser; var Phaser; (function (Phaser) { var TilemapLayer = (function () { - function TilemapLayer(game, key, mapFormat, name, tileWidth, tileHeight) { + function TilemapLayer(game, parent, key, mapFormat, name, tileWidth, tileHeight) { this._startX = 0; this._startY = 0; this._maxX = 0; @@ -11003,12 +11002,16 @@ var Phaser; this._oldCameraX = 0; this._oldCameraY = 0; this.alpha = 1; + this.exists = true; this.visible = true; this.widthInTiles = 0; this.heightInTiles = 0; this.widthInPixels = 0; this.heightInPixels = 0; + this.tileMargin = 0; + this.tileSpacing = 0; this._game = game; + this._parent = parent; this.name = name; this.mapFormat = mapFormat; this.tileWidth = tileWidth; @@ -11017,8 +11020,84 @@ var Phaser; //this.scrollFactor = new MicroPoint(1, 1); this.mapData = []; this._texture = this._game.cache.getImage(key); - this.parseTileOffsets(); } + TilemapLayer.prototype.getTileFromWorldXY = function (x, y) { + x = this._game.math.snapToFloor(x, this.tileWidth) / this.tileWidth; + y = this._game.math.snapToFloor(y, this.tileHeight) / this.tileHeight; + return this.getTileIndex(x, y); + }; + TilemapLayer.prototype.getTileOverlaps = function (object) { + //var result: bool = false; + //var x: number = object.x; + //var y: number = object.y; + // What tiles do we need to check against? + var mapX = this._game.math.snapToFloor(object.bounds.x, this.tileWidth); + var mapY = this._game.math.snapToFloor(object.bounds.y, this.tileHeight); + var mapW = this._game.math.snapToCeil(object.bounds.width, this.tileWidth) + this.tileWidth; + var mapH = this._game.math.snapToCeil(object.bounds.height, this.tileHeight) + this.tileHeight; + var tileX = mapX / this.tileWidth; + var tileY = mapY / this.tileHeight; + var tileW = mapW / this.tileWidth; + var tileH = mapH / this.tileHeight; + if(tileX < 0) { + tileX = 0; + } + if(tileY < 0) { + tileY = 0; + } + if(tileW > this.widthInTiles) { + tileW = this.widthInTiles; + } + if(tileH > this.heightInTiles) { + tileH = this.heightInTiles; + } + // Loop through the tiles we've got and check overlaps accordingly + var tiles = this.getTileBlock(tileX, tileY, tileW, tileH); + var result = []; + var tempBounds = new Phaser.Quad(); + for(var r = 0; r < tiles.length; r++) { + if(tiles[r].tile.allowCollisions != Phaser.Collision.NONE) { + tempBounds.setTo(tiles[r].x * this.tileWidth, tiles[r].y * this.tileHeight, this.tileWidth, this.tileHeight); + if(tempBounds.intersects(object.bounds)) { + result.push(true); + } else { + result.push(false); + } + } else { + result.push(false); + } + } + //return { x: mapX, y: mapY, w: mapW, h: mapH, collision: result }; + return { + x: tileX, + y: tileY, + w: tileW, + h: tileH, + collision: result + }; + }; + TilemapLayer.prototype.getTileBlock = //public checkTileOverlap(object:GameObject, + function (x, y, width, height) { + var output = []; + for(var ty = y; ty < y + height; ty++) { + for(var tx = x; tx < x + width; tx++) { + output.push({ + x: tx, + y: ty, + tile: this._parent.tiles[this.mapData[ty][tx]] + }); + } + } + return output; + }; + TilemapLayer.prototype.getTileIndex = function (x, y) { + if(y >= 0 && y < this.mapData.length) { + if(x >= 0 && x < this.mapData[y].length) { + return this.mapData[y][x]; + } + } + return null; + }; TilemapLayer.prototype.addColumn = function (column) { var data = []; for(var c = 0; c < column.length; c++) { @@ -11034,6 +11113,7 @@ var Phaser; }; TilemapLayer.prototype.updateBounds = function () { this.boundsInTiles.setTo(0, 0, this.widthInTiles, this.heightInTiles); + console.log('layer bounds', this.boundsInTiles); }; TilemapLayer.prototype.parseTileOffsets = function () { this._tileOffsets = []; @@ -11043,8 +11123,8 @@ var Phaser; this._tileOffsets[0] = null; i = 1; } - for(var ty = 0; ty < this._texture.height; ty += this.tileHeight) { - for(var tx = 0; tx < this._texture.width; tx += this.tileWidth) { + for(var ty = this.tileMargin; ty < this._texture.height; ty += (this.tileHeight + this.tileSpacing)) { + for(var tx = this.tileMargin; tx < this._texture.width; tx += (this.tileWidth + this.tileSpacing)) { this._tileOffsets[i] = { x: tx, y: ty @@ -11052,6 +11132,7 @@ var Phaser; i++; } } + return this._tileOffsets.length; }; TilemapLayer.prototype.renderDebugInfo = function (x, y, color) { if (typeof color === "undefined") { color = 'rgb(255,255,255)'; } @@ -11078,6 +11159,12 @@ var Phaser; if(this._startY < 0) { this._startY = 0; } + if(this._maxX > this.widthInTiles) { + this._maxX = this.widthInTiles; + } + if(this._maxY > this.heightInTiles) { + this._maxY = this.heightInTiles; + } if(this._startX + this._maxX > this.widthInTiles) { this._startX = this.widthInTiles - this._maxX; } @@ -11134,8 +11221,44 @@ var Phaser; Phaser.TilemapLayer = TilemapLayer; })(Phaser || (Phaser = {})); /// +/** +* Phaser - Tile +* +* A Tile is a single representation of a tile within a Tilemap +*/ +var Phaser; +(function (Phaser) { + var Tile = (function () { + function Tile(game, tilemap, index, width, height) { + this._game = game; + this.tilemap = tilemap; + this.index = index; + this.width = width; + this.height = height; + this.allowCollisions = Phaser.Collision.NONE; + } + Tile.prototype.destroy = /** + * Clean up memory. + */ + function () { + this.tilemap = null; + }; + Tile.prototype.toString = /** + * Returns a string representation of this object. + * @method toString + * @return {string} a string representation of the object. + **/ + function () { + return "[{Tiled (index=" + this.index + " collisions=" + this.allowCollisions + " width=" + this.width + " height=" + this.height + ")}]"; + }; + return Tile; + })(); + Phaser.Tile = Tile; +})(Phaser || (Phaser = {})); +/// /// /// +/// /** * Phaser - Tilemap * @@ -11152,7 +11275,8 @@ var Phaser; if (typeof tileHeight === "undefined") { tileHeight = 0; } _super.call(this, game); this.isGroup = false; - this._layers = []; + this.tiles = []; + this.layers = []; this.mapFormat = format; switch(format) { case Tilemap.FORMAT_CSV: @@ -11173,13 +11297,13 @@ var Phaser; Tilemap.prototype.render = function (camera, cameraOffsetX, cameraOffsetY) { if(this.cameraBlacklist.indexOf(camera.ID) == -1) { // Loop through the layers - for(var i = 0; i < this._layers.length; i++) { - this._layers[i].render(camera, cameraOffsetX, cameraOffsetY); + for(var i = 0; i < this.layers.length; i++) { + this.layers[i].render(camera, cameraOffsetX, cameraOffsetY); } } }; Tilemap.prototype.parseCSV = function (data, key, tileWidth, tileHeight) { - var layer = new Phaser.TilemapLayer(this._game, key, Tilemap.FORMAT_CSV, 'TileLayerCSV' + this._layers.length.toString(), tileWidth, tileHeight); + var layer = new Phaser.TilemapLayer(this._game, this, key, Tilemap.FORMAT_CSV, 'TileLayerCSV' + this.layers.length.toString(), tileWidth, tileHeight); // Trim any rogue whitespace from the data data = data.trim(); var rows = data.split("\n"); @@ -11190,17 +11314,21 @@ var Phaser; } } layer.updateBounds(); + var tileQuantity = layer.parseTileOffsets(); this.currentLayer = layer; - this._layers.push(layer); + this.layers.push(layer); + this.generateTiles(tileQuantity); }; Tilemap.prototype.parseTiledJSON = function (data, key) { // Trim any rogue whitespace from the data data = data.trim(); var json = JSON.parse(data); for(var i = 0; i < json.layers.length; i++) { - var layer = new Phaser.TilemapLayer(this._game, key, Tilemap.FORMAT_TILED_JSON, json.layers[i].name, json.tilewidth, json.tileheight); + var layer = new Phaser.TilemapLayer(this._game, this, key, Tilemap.FORMAT_TILED_JSON, json.layers[i].name, json.tilewidth, json.tileheight); layer.alpha = json.layers[i].opacity; layer.visible = json.layers[i].visible; + layer.tileMargin = json.tilesets[0].margin; + layer.tileSpacing = json.tilesets[0].spacing; var c = 0; var row; for(var t = 0; t < json.layers[i].data.length; t++) { @@ -11215,8 +11343,15 @@ var Phaser; } } layer.updateBounds(); + var tileQuantity = layer.parseTileOffsets(); this.currentLayer = layer; - this._layers.push(layer); + this.layers.push(layer); + } + this.generateTiles(tileQuantity); + }; + Tilemap.prototype.generateTiles = function (qty) { + for(var i = 0; i < qty; i++) { + this.tiles.push(new Phaser.Tile(this._game, this, i, this.currentLayer.tileWidth, this.currentLayer.tileHeight)); } }; Object.defineProperty(Tilemap.prototype, "widthInPixels", { @@ -11233,12 +11368,59 @@ var Phaser; enumerable: true, configurable: true }); + Tilemap.prototype.setCollisionRange = // Tile Collision + function (start, end, collision) { + if (typeof collision === "undefined") { collision = Phaser.Collision.ANY; } + for(var i = start; i < end; i++) { + this.tiles[i].allowCollisions = collision; + } + }; + Tilemap.prototype.setCollisionByIndex = function (values, collision) { + if (typeof collision === "undefined") { collision = Phaser.Collision.ANY; } + for(var i = 0; i < values.length; i++) { + this.tiles[values[i]].allowCollisions = collision; + } + }; + Tilemap.prototype.getTile = // Tile Management + function (x, y, layer) { + if (typeof layer === "undefined") { layer = 0; } + return this.tiles[this.layers[layer].getTileIndex(x, y)]; + }; + Tilemap.prototype.getTileFromWorldXY = function (x, y, layer) { + if (typeof layer === "undefined") { layer = 0; } + return this.tiles[this.layers[layer].getTileFromWorldXY(x, y)]; + }; + Tilemap.prototype.getTileFromInputXY = function (layer) { + if (typeof layer === "undefined") { layer = 0; } + return this.tiles[this.layers[layer].getTileFromWorldXY(this._game.input.worldX, this._game.input.worldY)]; + }; + Tilemap.prototype.getTileOverlaps = function (object) { + return this.currentLayer.getTileOverlaps(object); + }; + Tilemap.prototype.collide = // COLLIDE + function (objectOrGroup, callback) { + if (typeof objectOrGroup === "undefined") { objectOrGroup = null; } + if (typeof callback === "undefined") { callback = null; } + if(objectOrGroup == null) { + objectOrGroup = this._game.world.group; + } + // Group? + if(objectOrGroup.isGroup == false) { + if(objectOrGroup.exists && objectOrGroup.allowCollisions != Phaser.Collision.NONE) { + // Get the tiles this object overlaps with (could be any number based on its width/height) + // Iterate through each tile, checking if it overlaps with the object bounds + // Yes? then separate, else abort + } + } else { + // todo + } + return true; + }; return Tilemap; })(Phaser.GameObject); Phaser.Tilemap = Tilemap; // Set current layer // Set layer order? - // Get tile from x/y // Get block of tiles // Swap tiles around // Delete tiles of certain type @@ -11280,6 +11462,9 @@ var Phaser; * * This is where the magic happens. The Game object is the heart of your game, * providing quick access to common functions and handling the boot process. +* +* "Hell, there are no rules here - we're trying to accomplish something." +* Thomas A. Edison */ var Phaser; (function (Phaser) { @@ -11649,7 +11834,7 @@ var Phaser; * Determines whether the object specified intersects (overlaps) with this Quad object. * This method checks the x, y, width, and height properties of the specified Quad object to see if it intersects with this Quad object. * @method intersects - * @param {Quad} q The Quad to compare against to see if it intersects with this Quad. + * @param {Object} q The object to check for intersection with this Quad. Must have left/right/top/bottom properties (Rectangle, Quad). * @param {Number} t A tolerance value to allow for an intersection test with padding, default to 0 * @return {Boolean} A value of true if the specified object intersects with this Quad; otherwise false. **/ @@ -11917,50 +12102,6 @@ var Phaser; })(Phaser.GameObject); Phaser.ScrollZone = ScrollZone; })(Phaser || (Phaser = {})); -/// -/** -* Phaser - Tile -* -* A simple helper object for Tilemap that helps expand collision opportunities and control. -*/ -var Phaser; -(function (Phaser) { - var Tile = (function (_super) { - __extends(Tile, _super); - /** - * Instantiate this new tile object. This is usually called from Tilemap.loadMap(). - * - * @param Tilemap A reference to the tilemap object creating the tile. - * @param Index The actual core map data index for this tile type. - * @param Width The width of the tile. - * @param Height The height of the tile. - * @param Visible Whether the tile is visible or not. - * @param AllowCollisions The collision flags for the object. By default this value is ANY or NONE depending on the parameters sent to loadMap(). - */ - function Tile(game, Tilemap, Index, Width, Height, Visible, AllowCollisions) { - _super.call(this, game, 0, 0, Width, Height); - this.immovable = true; - this.moves = false; - this.callback = null; - this.filter = null; - this.tilemap = Tilemap; - this.index = Index; - this.visible = Visible; - this.allowCollisions = AllowCollisions; - this.mapIndex = 0; - } - Tile.prototype.destroy = /** - * Clean up memory. - */ - function () { - _super.prototype.destroy.call(this); - this.callback = null; - this.tilemap = null; - }; - return Tile; - })(Phaser.GameObject); - Phaser.Tile = Tile; -})(Phaser || (Phaser = {})); /// /** * Phaser - State diff --git a/Tests/tilemap/collision.js b/Tests/tilemap/collision.js new file mode 100644 index 00000000..081f0217 --- /dev/null +++ b/Tests/tilemap/collision.js @@ -0,0 +1,73 @@ +/// +/// +(function () { + var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); + function init() { + myGame.loader.addTextFile('platform', 'assets/maps/platform-test-1.json'); + myGame.loader.addImageFile('tiles', 'assets/tiles/platformer_tiles.png'); + myGame.loader.addImageFile('ufo', 'assets/sprites/ufo.png'); + myGame.loader.addImageFile('ilkke', 'assets/sprites/ilkke.png'); + myGame.loader.addImageFile('chunk', 'assets/sprites/chunk.png'); + myGame.loader.addImageFile('healthbar', 'assets/sprites/healthbar.png'); + myGame.loader.load(); + } + var map; + var car; + var marker; + var tile; + function create() { + map = myGame.createTilemap('tiles', 'platform', Phaser.Tilemap.FORMAT_TILED_JSON); + map.setCollisionRange(21, 53); + map.setCollisionRange(105, 109); + myGame.camera.backgroundColor = 'rgb(47,154,204)'; + car = myGame.createSprite(250, 0, 'ufo'); + car.renderRotation = false; + car.renderDebug = true; + car.setBounds(0, 0, map.widthInPixels - 32, map.heightInPixels - 32); + //car.velocity.y = 10; + marker = myGame.createGeomSprite(0, 0); + marker.createRectangle(16, 16); + marker.renderFill = false; + myGame.onRenderCallback = render; + } + function update() { + marker.x = myGame.math.snapToFloor(myGame.input.worldX, 16); + marker.y = myGame.math.snapToFloor(myGame.input.worldY, 16); + //myGame.collide(car, map.currentLayer); + car.velocity.x = 0; + car.velocity.y = 0; + if(myGame.input.keyboard.isDown(Phaser.Keyboard.LEFT)) { + car.velocity.x = -100; + } else if(myGame.input.keyboard.isDown(Phaser.Keyboard.RIGHT)) { + car.velocity.x = 100; + } + if(myGame.input.keyboard.isDown(Phaser.Keyboard.UP)) { + car.velocity.y = -100; + } else if(myGame.input.keyboard.isDown(Phaser.Keyboard.DOWN)) { + car.velocity.y = 100; + } + } + function render() { + tile = map.getTileFromInputXY(); + var b = map.getTileOverlaps(car); + myGame.stage.context.font = '18px Arial'; + myGame.stage.context.fillStyle = 'rgb(255,255,255)'; + myGame.stage.context.fillText(tile.toString(), 32, 32); + myGame.input.renderDebugInfo(32, 64, 'rgb(255,255,255)'); + myGame.stage.context.fillStyle = 'rgb(255,255,255)'; + myGame.stage.context.fillText(b.x + ' ' + b.y + ' ' + b.w + ' ' + b.h, 32, 200); + myGame.stage.context.fillText(car.bounds.x + ' ' + car.bounds.y + ' ' + car.bounds.width + ' ' + car.bounds.height, 32, 232); + var i = 0; + for(var y = b.y; y < b.y + b.h; y++) { + for(var x = b.x; x < b.x + b.w; x++) { + if(b.collision[i] == true) { + myGame.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; + } else { + myGame.stage.context.fillStyle = 'rgba(0,255,0,0.5)'; + } + myGame.stage.context.fillRect(x * 16, y * 16, 16, 16); + i++; + } + } + } +})(); diff --git a/Tests/tilemap/collision.ts b/Tests/tilemap/collision.ts new file mode 100644 index 00000000..c2eb0496 --- /dev/null +++ b/Tests/tilemap/collision.ts @@ -0,0 +1,116 @@ +/// +/// + +(function () { + + var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); + + function init() { + + myGame.loader.addTextFile('platform', 'assets/maps/platform-test-1.json'); + myGame.loader.addImageFile('tiles', 'assets/tiles/platformer_tiles.png'); + myGame.loader.addImageFile('ufo', 'assets/sprites/ufo.png'); + myGame.loader.addImageFile('ilkke', 'assets/sprites/ilkke.png'); + myGame.loader.addImageFile('chunk', 'assets/sprites/chunk.png'); + myGame.loader.addImageFile('healthbar', 'assets/sprites/healthbar.png'); + + myGame.loader.load(); + + } + + var map: Phaser.Tilemap; + var car: Phaser.Sprite; + var marker: Phaser.GeomSprite; + var tile: Phaser.Tile; + + function create() { + + map = myGame.createTilemap('tiles', 'platform', Phaser.Tilemap.FORMAT_TILED_JSON); + map.setCollisionRange(21,53); + map.setCollisionRange(105,109); + + myGame.camera.backgroundColor = 'rgb(47,154,204)'; + + car = myGame.createSprite(250, 0, 'ufo'); + car.renderRotation = false; + car.renderDebug = true; + + car.setBounds(0, 0, map.widthInPixels - 32, map.heightInPixels - 32); + //car.velocity.y = 10; + + marker = myGame.createGeomSprite(0, 0); + marker.createRectangle(16, 16); + marker.renderFill = false; + + myGame.onRenderCallback = render; + + } + + function update() { + + marker.x = myGame.math.snapToFloor(myGame.input.worldX, 16); + marker.y = myGame.math.snapToFloor(myGame.input.worldY, 16); + + //myGame.collide(car, map.currentLayer); + + car.velocity.x = 0; + car.velocity.y = 0; + + if (myGame.input.keyboard.isDown(Phaser.Keyboard.LEFT)) + { + car.velocity.x = -100; + } + else if (myGame.input.keyboard.isDown(Phaser.Keyboard.RIGHT)) + { + car.velocity.x = 100; + } + + if (myGame.input.keyboard.isDown(Phaser.Keyboard.UP)) + { + car.velocity.y = -100; + } + else if (myGame.input.keyboard.isDown(Phaser.Keyboard.DOWN)) + { + car.velocity.y = 100; + } + + } + + function render { + + tile = map.getTileFromInputXY(); + + var b = map.getTileOverlaps(car); + + myGame.stage.context.font = '18px Arial'; + myGame.stage.context.fillStyle = 'rgb(255,255,255)'; + myGame.stage.context.fillText(tile.toString(), 32, 32); + myGame.input.renderDebugInfo(32, 64, 'rgb(255,255,255)'); + myGame.stage.context.fillStyle = 'rgb(255,255,255)'; + myGame.stage.context.fillText(b.x + ' ' + b.y + ' ' + b.w + ' ' + b.h, 32, 200); + myGame.stage.context.fillText(car.bounds.x + ' ' + car.bounds.y + ' ' + car.bounds.width + ' ' + car.bounds.height, 32, 232); + + + var i = 0; + + for (var y = b.y; y < b.y + b.h; y++) + { + for (var x = b.x; x < b.x + b.w; x++) + { + if (b.collision[i] == true) + { + myGame.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; + } + else + { + myGame.stage.context.fillStyle = 'rgba(0,255,0,0.5)'; + } + + myGame.stage.context.fillRect(x * 16, y * 16, 16, 16); + i++; + } + } + + } + +})(); diff --git a/Tests/tilemap/get tile.js b/Tests/tilemap/get tile.js new file mode 100644 index 00000000..ff0a3c65 --- /dev/null +++ b/Tests/tilemap/get tile.js @@ -0,0 +1,49 @@ +/// +/// +/// +(function () { + var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); + function init() { + myGame.loader.addTextFile('desert', 'assets/maps/desert.json'); + myGame.loader.addImageFile('tiles', 'assets/tiles/tmw_desert_spacing.png'); + myGame.loader.addImageFile('car', 'assets/sprites/car90.png'); + myGame.loader.load(); + } + var map; + var car; + var marker; + var tile; + function create() { + map = myGame.createTilemap('tiles', 'desert', Phaser.Tilemap.FORMAT_TILED_JSON); + car = myGame.createSprite(250, 200, 'car'); + car.setBounds(0, 0, map.widthInPixels - 32, map.heightInPixels - 32); + marker = myGame.createGeomSprite(0, 0); + marker.createRectangle(32, 32); + marker.renderFill = false; + marker.lineColor = 'rgb(0,0,0)'; + myGame.camera.follow(car); + myGame.onRenderCallback = render; + } + function update() { + marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); + marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + car.velocity.x = 0; + car.velocity.y = 0; + car.angularVelocity = 0; + if(myGame.input.keyboard.isDown(Phaser.Keyboard.LEFT)) { + car.angularVelocity = -200; + } else if(myGame.input.keyboard.isDown(Phaser.Keyboard.RIGHT)) { + car.angularVelocity = 200; + } + if(myGame.input.keyboard.isDown(Phaser.Keyboard.UP)) { + car.velocity.copyFrom(myGame.motion.velocityFromAngle(car.angle, 300)); + } + } + function render() { + tile = map.getTileFromInputXY(); + myGame.stage.context.font = '18px Arial'; + myGame.stage.context.fillStyle = 'rgb(0,0,0)'; + myGame.stage.context.fillText(tile.toString(), 32, 32); + myGame.input.renderDebugInfo(32, 64, 'rgb(0,0,0)'); + } +})(); diff --git a/Tests/tilemap/get tile.ts b/Tests/tilemap/get tile.ts new file mode 100644 index 00000000..462118cc --- /dev/null +++ b/Tests/tilemap/get tile.ts @@ -0,0 +1,78 @@ +/// +/// +/// + +(function () { + + var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); + + function init() { + + myGame.loader.addTextFile('desert', 'assets/maps/desert.json'); + myGame.loader.addImageFile('tiles', 'assets/tiles/tmw_desert_spacing.png'); + myGame.loader.addImageFile('car', 'assets/sprites/car90.png'); + + myGame.loader.load(); + + } + + var map: Phaser.Tilemap; + var car: Phaser.Sprite; + var marker: Phaser.GeomSprite; + var tile: Phaser.Tile; + + function create() { + + map = myGame.createTilemap('tiles', 'desert', Phaser.Tilemap.FORMAT_TILED_JSON); + + car = myGame.createSprite(250, 200, 'car'); + car.setBounds(0, 0, map.widthInPixels - 32, map.heightInPixels - 32); + + marker = myGame.createGeomSprite(0, 0); + marker.createRectangle(32, 32); + marker.renderFill = false; + marker.lineColor = 'rgb(0,0,0)'; + + myGame.camera.follow(car); + myGame.onRenderCallback = render; + + } + + function update() { + + marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); + marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + + car.velocity.x = 0; + car.velocity.y = 0; + car.angularVelocity = 0; + + if (myGame.input.keyboard.isDown(Phaser.Keyboard.LEFT)) + { + car.angularVelocity = -200; + } + else if (myGame.input.keyboard.isDown(Phaser.Keyboard.RIGHT)) + { + car.angularVelocity = 200; + } + + if (myGame.input.keyboard.isDown(Phaser.Keyboard.UP)) + { + car.velocity.copyFrom(myGame.motion.velocityFromAngle(car.angle, 300)); + } + + } + + function render { + + tile = map.getTileFromInputXY(); + + myGame.stage.context.font = '18px Arial'; + myGame.stage.context.fillStyle = 'rgb(0,0,0)'; + myGame.stage.context.fillText(tile.toString(), 32, 32); + + myGame.input.renderDebugInfo(32, 64, 'rgb(0,0,0)'); + + } + +})();