mirror of
https://github.com/photonstorm/phaser
synced 2024-11-10 07:04:31 +00:00
Added ability to detect if a given point is within a sprite or not, taking rotation and scaling into account.
This commit is contained in:
parent
c2533d1146
commit
2389c6c231
16 changed files with 458 additions and 391 deletions
|
@ -10,8 +10,8 @@ module Phaser.Components {
|
|||
export class Transform {
|
||||
|
||||
/**
|
||||
* Creates a new Sprite Transform component
|
||||
* @param parent The Sprite using this transform
|
||||
* Creates a new Transform component
|
||||
* @param parent The game object using this transform
|
||||
*/
|
||||
constructor(parent) {
|
||||
|
||||
|
@ -57,14 +57,39 @@ module Phaser.Components {
|
|||
private _distance: number;
|
||||
private _prevRotation: number;
|
||||
|
||||
/**
|
||||
* The center of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public center: Phaser.Point;
|
||||
|
||||
/**
|
||||
* The upper-left corner of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public upperLeft: Phaser.Point;
|
||||
|
||||
/**
|
||||
* The upper-right corner of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public upperRight: Phaser.Point;
|
||||
|
||||
/**
|
||||
* The bottom-left corner of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public bottomLeft: Phaser.Point;
|
||||
|
||||
/**
|
||||
* The bottom-right corner of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public bottomRight: Phaser.Point;
|
||||
|
||||
/**
|
||||
* The local transform matrix
|
||||
*/
|
||||
public local: Mat3;
|
||||
|
||||
/**
|
||||
* Populates the transform cache. Called by the parent object on creation.
|
||||
*/
|
||||
public setCache() {
|
||||
|
||||
this._pos.x = this.parent.x;
|
||||
|
@ -96,14 +121,22 @@ module Phaser.Components {
|
|||
this._sc.y = 1;
|
||||
}
|
||||
|
||||
this.center.setTo(this.center.x, this.center.y);
|
||||
this.center.x = this.parent.x + this._distance * this._scA.y;
|
||||
this.center.y = this.parent.y + this._distance * this._scA.x;
|
||||
|
||||
this.upperLeft.setTo(this.center.x - this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
this.upperRight.setTo(this.center.x + this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y + this._halfSize.x * this._sc.x);
|
||||
this.bottomLeft.setTo(this.center.x - this._halfSize.x * this._sc.y - this._halfSize.y * this._sc.x, this.center.y + this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
this.bottomRight.setTo(this.center.x + this._halfSize.x * this._sc.y - this._halfSize.y * this._sc.x, this.center.y + this._halfSize.y * this._sc.y + this._halfSize.x * this._sc.x);
|
||||
|
||||
this._pos.x = this.parent.x;
|
||||
this._pos.y = this.parent.y;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the local transform matrix and the cache values if anything has changed in the parent.
|
||||
*/
|
||||
public update() {
|
||||
|
||||
// Check cache
|
||||
|
@ -156,8 +189,6 @@ module Phaser.Components {
|
|||
this.center.x = this.parent.x + this._distance * this._scA.y;
|
||||
this.center.y = this.parent.y + this._distance * this._scA.x;
|
||||
|
||||
this.center.setTo(this.center.x, this.center.y);
|
||||
|
||||
this.upperLeft.setTo(this.center.x - this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
this.upperRight.setTo(this.center.x + this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y + this._halfSize.x * this._sc.x);
|
||||
this.bottomLeft.setTo(this.center.x - this._halfSize.x * this._sc.y - this._halfSize.y * this._sc.x, this.center.y + this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
|
@ -282,23 +313,15 @@ module Phaser.Components {
|
|||
}
|
||||
|
||||
/**
|
||||
* The center of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
* The equivalent of Math.sin(rotation + rotationOffset)
|
||||
*/
|
||||
//public get centerX(): number {
|
||||
// return this.center.x;
|
||||
//}
|
||||
|
||||
/**
|
||||
* The center of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
//public get centerY(): number {
|
||||
// return this.center.y;
|
||||
//}
|
||||
|
||||
public get sin(): number {
|
||||
return this._sc.x;
|
||||
}
|
||||
|
||||
/**
|
||||
* The equivalent of Math.cos(rotation + rotationOffset)
|
||||
*/
|
||||
public get cos(): number {
|
||||
return this._sc.y;
|
||||
}
|
||||
|
|
|
@ -221,8 +221,7 @@ module Phaser {
|
|||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
//return RectangleUtils.intersects(sprite.cameraView, camera.screenView);
|
||||
return RectangleUtils.intersects(sprite.cameraView, camera.screenView);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -60,42 +60,11 @@ module Phaser {
|
|||
}
|
||||
else
|
||||
{
|
||||
//var left:Number = Math.min(topLeft.x, topRight.x, bottomRight.x, bottomLeft.x);
|
||||
//var top:Number = Math.min(topLeft.y, topRight.y, bottomRight.y, bottomLeft.y);
|
||||
//var right:Number = Math.max(topLeft.x, topRight.x, bottomRight.x, bottomLeft.x);
|
||||
//var bottom:Number = Math.max(topLeft.y, topRight.y, bottomRight.y, bottomLeft.y);
|
||||
//return new Rectangle(left, top, right - left, bottom - top);
|
||||
|
||||
var minX: number = Math.min(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var minY: number = Math.min(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
var maxX: number = Math.max(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var maxY: number = Math.max(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
|
||||
// (min_x,min_y), (min_x,max_y), (max_x,max_y), (max_x,min_y)
|
||||
|
||||
sprite.cameraView.x = minX;
|
||||
sprite.cameraView.y = minY;
|
||||
sprite.cameraView.width = maxX - minX;
|
||||
sprite.cameraView.height = maxY - minY;
|
||||
|
||||
/*
|
||||
// Useful to get the maximum AABB size of any given rect
|
||||
|
||||
If you want a single box that covers all angles, just take the half-diagonal of your existing box as the radius of a circle.
|
||||
The new box has to contain this circle, so it should be a square with side-length equal to twice the radius
|
||||
(equiv. the diagonal of the original AABB) and with the same center as the original.
|
||||
*/
|
||||
|
||||
sprite.cameraView.x = Math.min(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
sprite.cameraView.y = Math.min(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
sprite.cameraView.width = Math.max(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x) - sprite.cameraView.x;
|
||||
sprite.cameraView.height = Math.max(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y) - sprite.cameraView.y;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (sprite.animations.currentFrame !== null && sprite.animations.currentFrame.trimmed)
|
||||
{
|
||||
//sprite.cameraView.x += sprite.animations.currentFrame.spriteSourceSizeX;
|
||||
//sprite.cameraView.y += sprite.animations.currentFrame.spriteSourceSizeY;
|
||||
//this._dw = sprite.animations.currentFrame.spriteSourceSizeW;
|
||||
//this._dh = sprite.animations.currentFrame.spriteSourceSizeH;
|
||||
}
|
||||
|
||||
return sprite.cameraView;
|
||||
|
@ -174,92 +143,60 @@ module Phaser {
|
|||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Checks to see if this <code>GameObject</code> were located at the given position, would it overlap the <code>GameObject</code> or <code>Group</code>?
|
||||
* This is distinct from overlapsPoint(), which just checks that point, rather than taking the object's size numbero account.
|
||||
* WARNING: Currently tilemaps do NOT support screen space overlap checks!
|
||||
*
|
||||
* @param X {number} The X position you want to check. Pretends this object (the caller, not the parameter) is located here.
|
||||
* @param Y {number} The Y position you want to check. Pretends this object (the caller, not the parameter) is located here.
|
||||
* @param objectOrGroup {object} The object or group being tested.
|
||||
* @param inScreenSpace {boolean} Whether to take scroll factors numbero account when checking for overlap. Default is false, or "only compare in world space."
|
||||
* @param camera {Camera} Specify which game camera you want. If null getScreenXY() will just grab the first global camera.
|
||||
*
|
||||
* @return {boolean} Whether or not the two objects overlap.
|
||||
*/
|
||||
/*
|
||||
static overlapsAt(X: number, Y: number, objectOrGroup, inScreenSpace: bool = false, camera: Camera = null): bool {
|
||||
|
||||
if (objectOrGroup.isGroup)
|
||||
{
|
||||
var results: bool = false;
|
||||
var basic;
|
||||
var i: number = 0;
|
||||
var members = objectOrGroup.members;
|
||||
|
||||
while (i < length)
|
||||
{
|
||||
if (this.overlapsAt(X, Y, members[i++], inScreenSpace, camera))
|
||||
{
|
||||
results = true;
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
if (!inScreenSpace)
|
||||
{
|
||||
return (objectOrGroup.x + objectOrGroup.width > X) && (objectOrGroup.x < X + this.width) &&
|
||||
(objectOrGroup.y + objectOrGroup.height > Y) && (objectOrGroup.y < Y + this.height);
|
||||
}
|
||||
|
||||
if (camera == null)
|
||||
{
|
||||
camera = this._game.camera;
|
||||
}
|
||||
|
||||
var objectScreenPos: Point = objectOrGroup.getScreenXY(null, Camera);
|
||||
|
||||
this._point.x = X - camera.scroll.x * this.transform.scrollFactor.x; //copied from getScreenXY()
|
||||
this._point.y = Y - camera.scroll.y * this.transform.scrollFactor.y;
|
||||
this._point.x += (this._point.x > 0) ? 0.0000001 : -0.0000001;
|
||||
this._point.y += (this._point.y > 0) ? 0.0000001 : -0.0000001;
|
||||
|
||||
return (objectScreenPos.x + objectOrGroup.width > this._point.x) && (objectScreenPos.x < this._point.x + this.width) &&
|
||||
(objectScreenPos.y + objectOrGroup.height > this._point.y) && (objectScreenPos.y < this._point.y + this.height);
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Checks to see if a point in 2D world space overlaps this <code>GameObject</code>.
|
||||
* Checks to see if the given x and y coordinates overlaps this <code>Sprite</code>, taking scaling and rotation into account.
|
||||
* The coordinates must be given in world space, not local or camera space.
|
||||
*
|
||||
* @param point {Point} The point in world space you want to check.
|
||||
* @param inScreenSpace {boolean} Whether to take scroll factors into account when checking for overlap.
|
||||
* @param camera {Camera} Specify which game camera you want. If null getScreenXY() will just grab the first global camera.
|
||||
* @param sprite {Sprite} The Sprite to check. It will take scaling and rotation into account.
|
||||
* @param x {Number} The x coordinate in world space.
|
||||
* @param y {Number} The y coordinate in world space.
|
||||
*
|
||||
* @return Whether or not the point overlaps this object.
|
||||
*/
|
||||
static overlapsPoint(sprite: Sprite, point: Point, inScreenSpace: bool = false, camera: Camera = null): bool {
|
||||
static overlapsXY(sprite: Phaser.Sprite, x: number, y: number): bool {
|
||||
|
||||
if (!inScreenSpace)
|
||||
// if rotation == 0 then just do a rect check instead!
|
||||
if (sprite.transform.rotation == 0)
|
||||
{
|
||||
return Phaser.RectangleUtils.containsPoint(sprite.body.bounds, point);
|
||||
//return (point.x > sprite.x) && (point.x < sprite.x + sprite.width) && (point.y > sprite.y) && (point.y < sprite.y + sprite.height);
|
||||
return Phaser.RectangleUtils.contains(sprite.cameraView, x, y);
|
||||
}
|
||||
|
||||
if (camera == null)
|
||||
if ((x - sprite.transform.upperLeft.x) * (sprite.transform.upperRight.x - sprite.transform.upperLeft.x) + (y - sprite.transform.upperLeft.y) * (sprite.transform.upperRight.y - sprite.transform.upperLeft.y) < 0)
|
||||
{
|
||||
camera = sprite.game.camera;
|
||||
return false;
|
||||
}
|
||||
|
||||
//var x: number = point.x - camera.scroll.x;
|
||||
//var y: number = point.y - camera.scroll.y;
|
||||
if ((x - sprite.transform.upperRight.x) * (sprite.transform.upperRight.x - sprite.transform.upperLeft.x) + (y - sprite.transform.upperRight.y) * (sprite.transform.upperRight.y - sprite.transform.upperLeft.y) > 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//this.getScreenXY(this._point, camera);
|
||||
if ((x - sprite.transform.upperLeft.x) * (sprite.transform.bottomLeft.x - sprite.transform.upperLeft.x) + (y - sprite.transform.upperLeft.y) * (sprite.transform.bottomLeft.y - sprite.transform.upperLeft.y) < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//return (x > this._point.x) && (X < this._point.x + this.width) && (Y > this._point.y) && (Y < this._point.y + this.height);
|
||||
if ((x - sprite.transform.bottomLeft.x) * (sprite.transform.bottomLeft.x - sprite.transform.upperLeft.x) + (y - sprite.transform.bottomLeft.y) * (sprite.transform.bottomLeft.y - sprite.transform.upperLeft.y) > 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks to see if the given point overlaps this <code>Sprite</code>, taking scaling and rotation into account.
|
||||
* The point must be given in world space, not local or camera space.
|
||||
*
|
||||
* @param sprite {Sprite} The Sprite to check. It will take scaling and rotation into account.
|
||||
* @param point {Point} The point in world space you want to check.
|
||||
*
|
||||
* @return Whether or not the point overlaps this object.
|
||||
*/
|
||||
static overlapsPoint(sprite: Sprite, point: Point): bool {
|
||||
return overlapsXY(sprite, point.x, point.y);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -346,19 +283,6 @@ module Phaser {
|
|||
|
||||
}
|
||||
|
||||
static setOriginToCenter(sprite: Sprite, fromFrameBounds: bool = true, fromBody?: bool = false) {
|
||||
|
||||
if (fromFrameBounds)
|
||||
{
|
||||
sprite.transform.origin.setTo(sprite.width / 2, sprite.height / 2);
|
||||
}
|
||||
else if (fromBody)
|
||||
{
|
||||
sprite.transform.origin.setTo(sprite.body.bounds.halfWidth, sprite.body.bounds.halfHeight);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the world bounds that this GameObject can exist within. By default a GameObject can exist anywhere
|
||||
* in the world. But by setting the bounds (which are given in world dimensions, not screen dimensions)
|
||||
|
|
24
README.md
24
README.md
|
@ -26,30 +26,28 @@ TODO:
|
|||
* Investigate why tweens don't restart after the game pauses
|
||||
* Fix bug in Tween yoyo + loop combo
|
||||
* Apply Sprite scaling to Body.bounds
|
||||
* When you modify the sprite x/y directly the body position doesn't update, which leads to weird results. Need to work out who controls who.
|
||||
* Check that tween pausing works with the new performance.now
|
||||
* Game.Time should monitor pause duration
|
||||
* Investigate bug re: tilemap collision and animation frames
|
||||
* Update tests that use arrow keys and include touch/mouse support (FlxControlHandler style)
|
||||
* Polygon geom primitive
|
||||
* If the Camera is larger than the Stage size then the rotation offset isn't correct
|
||||
* Texture Repeat doesn't scroll, because it's part of the camera not the world, need to think about this more
|
||||
* Bug: Sprite x/y gets shifted if dynamic from the original value
|
||||
* Input CSS cursor those little 4-way arrows on drag?
|
||||
* Stage CSS3 transforms!!! Color tints, sepia, greyscale, all of those cool things :)
|
||||
* Cameras should have option to be input disabled + Pointers should check which camera they are over before doing Sprite selection
|
||||
* Added JSON Texture Atlas object support.
|
||||
* RenderOrderID won't work across cameras - but then neither do Pointers yet anyway
|
||||
* Add JSON Texture Atlas object support.
|
||||
* Swap to using time based motion (like the tweens) rather than delta timer - it just doesn't work well on slow phones
|
||||
* Pointer.getWorldX(camera) needs to take camera scale into consideration
|
||||
* Add a 'click to bring to top' demo (+ Group feature?)
|
||||
* If stage.clear set to false and game pauses, when it unpauses you still see the pause arrow - resolve this
|
||||
|
||||
* Add clip support + shape options to Texture Component.
|
||||
* Make sure I'm using Point and not Vec2 when it's not a directional vector I need
|
||||
* Bug with setting scale or anything on a Sprite inside a Group, or maybe group.addNewSprite issue
|
||||
|
||||
Make sure I'm using Point and not Vec2 when it's not a directional vector I need
|
||||
|
||||
|
||||
* Make input check use the rotated sprite check
|
||||
* Sprite collision events
|
||||
* See which functions in the input component can move elsewhere (utils)
|
||||
* Move all of the renderDebugInfo methods to the DebugUtils class
|
||||
|
||||
V1.0.0
|
||||
|
||||
|
@ -98,7 +96,7 @@ V1.0.0
|
|||
* Added optional frame parameter to Phaser.Sprite (and game.add.sprite) so you can set a frame ID or frame name on construction.
|
||||
* Fixed bug where passing a texture atlas string would incorrectly skip the frames array.
|
||||
* Added AnimationManager.autoUpdateBounds to control if a new frame should change the physics bounds of a sprite body or not.
|
||||
* Added StageScaleMode.pageAlignHorizontally and pageAlignVertically booleans. When on Phaser will set the margin-left and top of the canvas element so that it is positioned in the middle of the page (based on window.innerWidth).
|
||||
* Added StageScaleMode.pageAlignHorizontally and pageAlignVertically booleans. When true Phaser will set the margin-left and top of the canvas element so that it is positioned in the middle of the page (based only on window.innerWidth).
|
||||
* Added support for globalCompositeOperation, opaque and backgroundColor to the Sprite.Texture and Camera.Texture components.
|
||||
* Added ability for a Camera to skew and rotate around an origin.
|
||||
* Moved the Camera rendering into CanvasRenderer to keep things consistent.
|
||||
|
@ -109,8 +107,12 @@ V1.0.0
|
|||
* Added CameraManager.swap and CameraManager.sort methods and added a z-index property to Camera to control render order.
|
||||
* Added World.postUpdate loop + Group and Camera postUpdate methods.
|
||||
* Fixed issue stopping Pointer from working in world coordinates and fixed the world drag example.
|
||||
* For consistency renamed input.scaledX/Y = input.scale.
|
||||
* For consistency renamed input.scaledX/Y to input.scale.
|
||||
* Added input.activePointer which contains a reference to the most recently active pointer.
|
||||
* Sprite.Transform now has upperLeft, upperRight, bottomLeft and bottomRight Point properties and lots of useful coordinate related methods.
|
||||
* Camera.inCamera check now uses the Sprite.worldView which finally accurately updates regardless of scale, rotation or rotation origin.
|
||||
* Added Math.Mat3 for Matrix3 operations (which Sprite.Transform uses) and Math.Mat3Utils for lots of use Mat3 related methods.
|
||||
* Added SpriteUtils.overlapsXY and overlapsPoint to check if a point is within a sprite, taking scale and rotation into account.
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -117,6 +117,10 @@
|
|||
</Content>
|
||||
<TypeScriptCompile Include="input\touch priority.ts" />
|
||||
<TypeScriptCompile Include="input\snap 1.ts" />
|
||||
<TypeScriptCompile Include="input\point in rotated sprite.ts" />
|
||||
<Content Include="input\point in rotated sprite.js">
|
||||
<DependentUpon>point in rotated sprite.ts</DependentUpon>
|
||||
</Content>
|
||||
<Content Include="input\snap 1.js">
|
||||
<DependentUpon>snap 1.ts</DependentUpon>
|
||||
</Content>
|
||||
|
|
39
Tests/input/point in rotated sprite.js
Normal file
39
Tests/input/point in rotated sprite.js
Normal file
|
@ -0,0 +1,39 @@
|
|||
/// <reference path="../../Phaser/Game.ts" />
|
||||
(function () {
|
||||
var game = new Phaser.Game(this, 'game', 800, 600, init, create, update, render);
|
||||
function init() {
|
||||
game.load.image('sprite', 'assets/sprites/atari130xe.png');
|
||||
game.load.start();
|
||||
}
|
||||
var sprite;
|
||||
var rotate = false;
|
||||
function create() {
|
||||
sprite = game.add.sprite(200, 200, 'sprite');
|
||||
game.input.onTap.add(rotateIt, this);
|
||||
}
|
||||
function rotateIt() {
|
||||
if(rotate == false) {
|
||||
rotate = true;
|
||||
} else {
|
||||
rotate = false;
|
||||
}
|
||||
}
|
||||
var inPoint = false;
|
||||
function update() {
|
||||
if(rotate) {
|
||||
sprite.rotation++;
|
||||
}
|
||||
inPoint = Phaser.SpriteUtils.overlapsXY(sprite, game.input.x, game.input.y);
|
||||
}
|
||||
function render() {
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgb(255,0,255)';
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperLeft.x) + ' y: ' + Math.round(sprite.transform.upperLeft.y), sprite.transform.upperLeft.x, sprite.transform.upperLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperRight.x) + ' y: ' + Math.round(sprite.transform.upperRight.y), sprite.transform.upperRight.x, sprite.transform.upperRight.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomLeft.x) + ' y: ' + Math.round(sprite.transform.bottomLeft.y), sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomRight.x) + ' y: ' + Math.round(sprite.transform.bottomRight.y), sprite.transform.bottomRight.x, sprite.transform.bottomRight.y);
|
||||
game.input.renderDebugInfo(32, 32);
|
||||
game.stage.context.fillText('in: ' + inPoint, 300, 32);
|
||||
game.stage.context.restore();
|
||||
}
|
||||
})();
|
60
Tests/input/point in rotated sprite.ts
Normal file
60
Tests/input/point in rotated sprite.ts
Normal file
|
@ -0,0 +1,60 @@
|
|||
/// <reference path="../../Phaser/Game.ts" />
|
||||
|
||||
(function () {
|
||||
|
||||
var game = new Phaser.Game(this, 'game', 800, 600, init, create, update, render);
|
||||
|
||||
function init() {
|
||||
|
||||
game.load.image('sprite', 'assets/sprites/atari130xe.png');
|
||||
game.load.start();
|
||||
|
||||
}
|
||||
|
||||
var sprite: Phaser.Sprite;
|
||||
var rotate: bool = false;
|
||||
|
||||
function create() {
|
||||
|
||||
sprite = game.add.sprite(200, 200, 'sprite');
|
||||
|
||||
game.input.onTap.add(rotateIt, this);
|
||||
|
||||
}
|
||||
|
||||
function rotateIt() {
|
||||
if (rotate == false) { rotate = true; } else { rotate = false; }
|
||||
}
|
||||
|
||||
var inPoint: bool = false;
|
||||
|
||||
function update() {
|
||||
|
||||
if (rotate)
|
||||
{
|
||||
sprite.rotation++;
|
||||
}
|
||||
|
||||
inPoint = Phaser.SpriteUtils.overlapsXY(sprite, game.input.x, game.input.y);
|
||||
|
||||
}
|
||||
|
||||
function render() {
|
||||
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgb(255,0,255)';
|
||||
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperLeft.x) + ' y: ' + Math.round(sprite.transform.upperLeft.y), sprite.transform.upperLeft.x, sprite.transform.upperLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperRight.x) + ' y: ' + Math.round(sprite.transform.upperRight.y), sprite.transform.upperRight.x, sprite.transform.upperRight.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomLeft.x) + ' y: ' + Math.round(sprite.transform.bottomLeft.y), sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomRight.x) + ' y: ' + Math.round(sprite.transform.bottomRight.y), sprite.transform.bottomRight.x, sprite.transform.bottomRight.y);
|
||||
|
||||
game.input.renderDebugInfo(32, 32);
|
||||
|
||||
game.stage.context.fillText('in: ' + inPoint, 300, 32);
|
||||
|
||||
game.stage.context.restore();
|
||||
|
||||
}
|
||||
|
||||
})();
|
|
@ -3,8 +3,8 @@
|
|||
var game = new Phaser.Game(this, 'game', 800, 600, init, create, update, render);
|
||||
function init() {
|
||||
game.load.image('box2', 'assets/tests/320x200.png');
|
||||
game.load.image('box', 'assets/sprites/oz_pov_melting_disk.png');
|
||||
game.load.image('box1', 'assets/sprites/bunny.png');
|
||||
game.load.image('box1', 'assets/sprites/oz_pov_melting_disk.png');
|
||||
game.load.image('box', 'assets/sprites/bunny.png');
|
||||
game.load.start();
|
||||
}
|
||||
var sprite;
|
||||
|
@ -13,7 +13,7 @@
|
|||
game.stage.backgroundColor = 'rgb(0,0,0)';
|
||||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'box');
|
||||
//sprite.transform.scale.setTo(0.5, 0.5);
|
||||
sprite.transform.origin.setTo(0, 0);
|
||||
sprite.transform.origin.setTo(1, 1);
|
||||
//sprite.transform.origin.setTo(0.5, 0.5);
|
||||
game.input.onTap.add(rotateIt, this);
|
||||
//game.add.tween(sprite.transform.scale).to({ x: 0.5, y: 0.5 }, 2000, Phaser.Easing.Linear.None, true, 0, true);
|
||||
|
@ -37,14 +37,6 @@
|
|||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperRight.x) + ' y: ' + Math.round(sprite.transform.upperRight.y), sprite.transform.upperRight.x, sprite.transform.upperRight.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomLeft.x) + ' y: ' + Math.round(sprite.transform.bottomLeft.y), sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomRight.x) + ' y: ' + Math.round(sprite.transform.bottomRight.y), sprite.transform.bottomRight.x, sprite.transform.bottomRight.y);
|
||||
var minX = Math.min(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var minY = Math.min(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
var maxX = Math.max(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var maxY = Math.max(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
var width = maxX - minX;
|
||||
var height = maxY - minY;
|
||||
game.stage.context.fillText('minX: ' + minX + ' minY: ' + minY, 32, 32);
|
||||
game.stage.context.fillText('maxX: ' + maxX + ' maxY: ' + maxY, 32, 64);
|
||||
game.stage.context.fillRect(sprite.transform.center.x, sprite.transform.center.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperLeft.x, sprite.transform.upperLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperRight.x, sprite.transform.upperRight.y, 2, 2);
|
||||
|
@ -52,7 +44,6 @@
|
|||
game.stage.context.fillRect(sprite.transform.bottomRight.x, sprite.transform.bottomRight.y, 2, 2);
|
||||
game.stage.context.strokeStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.strokeRect(sprite.cameraView.x, sprite.cameraView.y, sprite.cameraView.width, sprite.cameraView.height);
|
||||
//game.stage.context.strokeRect(minX, minY, width, height);
|
||||
game.stage.context.restore();
|
||||
}
|
||||
})();
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
function init() {
|
||||
|
||||
game.load.image('box2', 'assets/tests/320x200.png');
|
||||
game.load.image('box', 'assets/sprites/oz_pov_melting_disk.png');
|
||||
game.load.image('box1', 'assets/sprites/bunny.png');
|
||||
game.load.image('box1', 'assets/sprites/oz_pov_melting_disk.png');
|
||||
game.load.image('box', 'assets/sprites/bunny.png');
|
||||
game.load.start();
|
||||
|
||||
}
|
||||
|
@ -23,7 +23,7 @@
|
|||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'box');
|
||||
|
||||
//sprite.transform.scale.setTo(0.5, 0.5);
|
||||
sprite.transform.origin.setTo(0, 0);
|
||||
sprite.transform.origin.setTo(1, 1);
|
||||
//sprite.transform.origin.setTo(0.5, 0.5);
|
||||
|
||||
game.input.onTap.add(rotateIt, this);
|
||||
|
@ -55,17 +55,6 @@
|
|||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomLeft.x) + ' y: ' + Math.round(sprite.transform.bottomLeft.y), sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomRight.x) + ' y: ' + Math.round(sprite.transform.bottomRight.y), sprite.transform.bottomRight.x, sprite.transform.bottomRight.y);
|
||||
|
||||
var minX: number = Math.min(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var minY: number = Math.min(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
var maxX: number = Math.max(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var maxY: number = Math.max(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
|
||||
var width = maxX - minX;
|
||||
var height = maxY - minY;
|
||||
|
||||
game.stage.context.fillText('minX: ' + minX + ' minY: ' + minY, 32, 32);
|
||||
game.stage.context.fillText('maxX: ' + maxX + ' maxY: ' + maxY, 32, 64);
|
||||
|
||||
game.stage.context.fillRect(sprite.transform.center.x, sprite.transform.center.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperLeft.x, sprite.transform.upperLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperRight.x, sprite.transform.upperRight.y, 2, 2);
|
||||
|
@ -74,7 +63,6 @@
|
|||
|
||||
game.stage.context.strokeStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.strokeRect(sprite.cameraView.x, sprite.cameraView.y, sprite.cameraView.width, sprite.cameraView.height);
|
||||
//game.stage.context.strokeRect(minX, minY, width, height);
|
||||
|
||||
game.stage.context.restore();
|
||||
|
||||
|
|
|
@ -2,16 +2,17 @@
|
|||
(function () {
|
||||
var game = new Phaser.Game(this, 'game', 800, 600, init, create, update, render);
|
||||
function init() {
|
||||
game.load.image('box', 'assets/tests/320x200.png');
|
||||
game.load.spritesheet('mummy', 'assets/sprites/metalslug_mummy37x45.png', 37, 45, 18);
|
||||
game.load.start();
|
||||
}
|
||||
var sprite;
|
||||
var rotate = false;
|
||||
function create() {
|
||||
game.stage.backgroundColor = 'rgb(0,0,0)';
|
||||
game.stage.disablePauseScreen = true;
|
||||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'box');
|
||||
sprite.transform.origin.setTo(0, 0);
|
||||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'mummy');
|
||||
sprite.animations.add('walk');
|
||||
sprite.animations.play('walk', 20, true);
|
||||
sprite.transform.scale.setTo(4, 4);
|
||||
game.input.onTap.add(rotateIt, this);
|
||||
}
|
||||
function rotateIt() {
|
||||
|
@ -27,30 +28,19 @@
|
|||
}
|
||||
}
|
||||
function render() {
|
||||
var originX = sprite.transform.origin.x * sprite.width;
|
||||
var originY = sprite.transform.origin.y * sprite.height;
|
||||
var centerX = 0.5 * sprite.width;
|
||||
var centerY = 0.5 * sprite.height;
|
||||
var distanceX = originX - centerX;
|
||||
var distanceY = originY - centerY;
|
||||
var distance = Math.sqrt(((originX - centerX) * (originX - centerX)) + ((originY - centerY) * (originY - centerY)));
|
||||
var px = sprite.x + distance * Math.cos(sprite.transform.rotation + 45 * Math.PI / 180);
|
||||
var py = sprite.y + distance * Math.sin(sprite.transform.rotation + 45 * Math.PI / 180);
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.fillText('rect width: ' + originX + ' height: ' + originY, 32, 32);
|
||||
game.stage.context.fillText('center x: ' + centerX + ' centerY: ' + centerY, 32, 52);
|
||||
game.stage.context.fillText('angle: ' + sprite.rotation, 32, 72);
|
||||
game.stage.context.fillText('point of rotation x: ' + sprite.transform.origin.x + ' y: ' + sprite.transform.origin.y, 32, 92);
|
||||
game.stage.context.fillText('x: ' + sprite.x + ' y: ' + sprite.y, sprite.x + 4, sprite.y);
|
||||
game.stage.context.restore();
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgba(255,255,255,0.1)';
|
||||
game.stage.context.beginPath();
|
||||
game.stage.context.moveTo(sprite.x, sprite.y);
|
||||
game.stage.context.arc(sprite.x, sprite.y, distance, 0, Math.PI * 2);
|
||||
game.stage.context.closePath();
|
||||
game.stage.context.fill();
|
||||
game.stage.context.fillStyle = 'rgb(255,0,255)';
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperLeft.x) + ' y: ' + Math.round(sprite.transform.upperLeft.y), sprite.transform.upperLeft.x, sprite.transform.upperLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperRight.x) + ' y: ' + Math.round(sprite.transform.upperRight.y), sprite.transform.upperRight.x, sprite.transform.upperRight.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomLeft.x) + ' y: ' + Math.round(sprite.transform.bottomLeft.y), sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomRight.x) + ' y: ' + Math.round(sprite.transform.bottomRight.y), sprite.transform.bottomRight.x, sprite.transform.bottomRight.y);
|
||||
game.stage.context.fillRect(sprite.transform.center.x, sprite.transform.center.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperLeft.x, sprite.transform.upperLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperRight.x, sprite.transform.upperRight.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.bottomRight.x, sprite.transform.bottomRight.y, 2, 2);
|
||||
game.stage.context.strokeStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.strokeRect(sprite.cameraView.x, sprite.cameraView.y, sprite.cameraView.width, sprite.cameraView.height);
|
||||
game.stage.context.restore();
|
||||
}
|
||||
})();
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
function init() {
|
||||
|
||||
game.load.image('box', 'assets/tests/320x200.png');
|
||||
game.load.spritesheet('mummy', 'assets/sprites/metalslug_mummy37x45.png', 37, 45, 18);
|
||||
game.load.start();
|
||||
|
||||
}
|
||||
|
@ -17,11 +17,13 @@
|
|||
function create() {
|
||||
|
||||
game.stage.backgroundColor = 'rgb(0,0,0)';
|
||||
game.stage.disablePauseScreen = true;
|
||||
|
||||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'box');
|
||||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'mummy');
|
||||
|
||||
sprite.transform.origin.setTo(0, 0);
|
||||
sprite.animations.add('walk');
|
||||
sprite.animations.play('walk', 20, true);
|
||||
|
||||
sprite.transform.scale.setTo(4, 4);
|
||||
|
||||
game.input.onTap.add(rotateIt, this);
|
||||
|
||||
|
@ -42,33 +44,23 @@
|
|||
|
||||
function render() {
|
||||
|
||||
var originX: number = sprite.transform.origin.x * sprite.width;
|
||||
var originY: number = sprite.transform.origin.y * sprite.height;
|
||||
var centerX: number = 0.5 * sprite.width;
|
||||
var centerY: number = 0.5 * sprite.height;
|
||||
var distanceX: number = originX - centerX;
|
||||
var distanceY: number = originY - centerY;
|
||||
var distance: number = Math.sqrt(((originX - centerX) * (originX - centerX)) + ((originY - centerY) * (originY - centerY)));
|
||||
|
||||
var px = sprite.x + distance * Math.cos(sprite.transform.rotation + 45 * Math.PI / 180);
|
||||
var py = sprite.y + distance * Math.sin(sprite.transform.rotation + 45 * Math.PI / 180);
|
||||
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.fillText('rect width: ' + originX + ' height: ' + originY, 32, 32);
|
||||
game.stage.context.fillText('center x: ' + centerX + ' centerY: ' + centerY, 32, 52);
|
||||
game.stage.context.fillText('angle: ' + sprite.rotation , 32, 72);
|
||||
game.stage.context.fillText('point of rotation x: ' + sprite.transform.origin.x + ' y: ' + sprite.transform.origin.y, 32, 92);
|
||||
game.stage.context.fillText('x: ' + sprite.x + ' y: ' + sprite.y, sprite.x + 4, sprite.y);
|
||||
game.stage.context.restore();
|
||||
game.stage.context.fillStyle = 'rgb(255,0,255)';
|
||||
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperLeft.x) + ' y: ' + Math.round(sprite.transform.upperLeft.y), sprite.transform.upperLeft.x, sprite.transform.upperLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperRight.x) + ' y: ' + Math.round(sprite.transform.upperRight.y), sprite.transform.upperRight.x, sprite.transform.upperRight.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomLeft.x) + ' y: ' + Math.round(sprite.transform.bottomLeft.y), sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomRight.x) + ' y: ' + Math.round(sprite.transform.bottomRight.y), sprite.transform.bottomRight.x, sprite.transform.bottomRight.y);
|
||||
|
||||
game.stage.context.fillRect(sprite.transform.center.x, sprite.transform.center.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperLeft.x, sprite.transform.upperLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperRight.x, sprite.transform.upperRight.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.bottomRight.x, sprite.transform.bottomRight.y, 2, 2);
|
||||
|
||||
game.stage.context.strokeStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.strokeRect(sprite.cameraView.x, sprite.cameraView.y, sprite.cameraView.width, sprite.cameraView.height);
|
||||
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgba(255,255,255,0.1)';
|
||||
game.stage.context.beginPath();
|
||||
game.stage.context.moveTo(sprite.x, sprite.y);
|
||||
game.stage.context.arc(sprite.x, sprite.y, distance, 0, Math.PI * 2);
|
||||
game.stage.context.closePath();
|
||||
game.stage.context.fill();
|
||||
game.stage.context.restore();
|
||||
|
||||
}
|
||||
|
|
|
@ -2,16 +2,17 @@
|
|||
(function () {
|
||||
var game = new Phaser.Game(this, 'game', 800, 600, init, create, update, render);
|
||||
function init() {
|
||||
game.load.image('box', 'assets/tests/320x200.png');
|
||||
game.load.atlas('bot', 'assets/sprites/running_bot.png', null, botData);
|
||||
game.load.start();
|
||||
}
|
||||
var sprite;
|
||||
var rotate = false;
|
||||
function create() {
|
||||
game.stage.backgroundColor = 'rgb(0,0,0)';
|
||||
game.stage.disablePauseScreen = true;
|
||||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'box');
|
||||
sprite.transform.origin.setTo(0.3, 0.8);
|
||||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'bot');
|
||||
sprite.animations.add('run', null, 10, true);
|
||||
sprite.animations.play('run');
|
||||
//sprite.transform.scale.setTo(4, 4);
|
||||
game.input.onTap.add(rotateIt, this);
|
||||
}
|
||||
function rotateIt() {
|
||||
|
@ -27,31 +28,20 @@
|
|||
}
|
||||
}
|
||||
function render() {
|
||||
var originX = sprite.transform.origin.x * sprite.width;
|
||||
var originY = sprite.transform.origin.y * sprite.height;
|
||||
var centerX = 0.5 * sprite.width;
|
||||
var centerY = 0.5 * sprite.height;
|
||||
var distanceX = originX - centerX;
|
||||
var distanceY = originY - centerY;
|
||||
var distance = Math.sqrt(((originX - centerX) * (originX - centerX)) + ((originY - centerY) * (originY - centerY)));
|
||||
var px = sprite.x + distance * Math.cos(sprite.transform.rotation + 45 * Math.PI / 180);
|
||||
var py = sprite.y + distance * Math.sin(sprite.transform.rotation + 45 * Math.PI / 180);
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.fillText('rect width: ' + originX + ' height: ' + originY, 32, 32);
|
||||
game.stage.context.fillText('center x: ' + centerX + ' centerY: ' + centerY, 32, 52);
|
||||
game.stage.context.fillText('angle: ' + sprite.rotation, 32, 72);
|
||||
game.stage.context.fillText('point of rotation x: ' + sprite.transform.origin.x + ' y: ' + sprite.transform.origin.y, 32, 92);
|
||||
game.stage.context.fillText('sprite x: ' + sprite.x + ' sprite y: ' + sprite.y, 32, 112);
|
||||
game.stage.context.fillRect(sprite.x, sprite.y, 2, 2);
|
||||
game.stage.context.restore();
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgba(255,255,255,0.1)';
|
||||
game.stage.context.beginPath();
|
||||
game.stage.context.moveTo(sprite.x, sprite.y);
|
||||
game.stage.context.arc(sprite.x, sprite.y, distance, 0, Math.PI * 2);
|
||||
game.stage.context.closePath();
|
||||
game.stage.context.fill();
|
||||
game.stage.context.fillStyle = 'rgb(255,0,255)';
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperLeft.x) + ' y: ' + Math.round(sprite.transform.upperLeft.y), sprite.transform.upperLeft.x, sprite.transform.upperLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperRight.x) + ' y: ' + Math.round(sprite.transform.upperRight.y), sprite.transform.upperRight.x, sprite.transform.upperRight.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomLeft.x) + ' y: ' + Math.round(sprite.transform.bottomLeft.y), sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomRight.x) + ' y: ' + Math.round(sprite.transform.bottomRight.y), sprite.transform.bottomRight.x, sprite.transform.bottomRight.y);
|
||||
game.stage.context.fillRect(sprite.transform.center.x, sprite.transform.center.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperLeft.x, sprite.transform.upperLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperRight.x, sprite.transform.upperRight.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.bottomRight.x, sprite.transform.bottomRight.y, 2, 2);
|
||||
game.stage.context.strokeStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.strokeRect(sprite.cameraView.x, sprite.cameraView.y, sprite.cameraView.width, sprite.cameraView.height);
|
||||
game.stage.context.restore();
|
||||
}
|
||||
var botData = '{"frames": [{"filename": "running bot.swf/0000","frame": { "x": 34, "y": 128, "w": 56, "h": 60 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 2, "w": 56, "h": 60 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0001","frame": { "x": 54, "y": 0, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0002","frame": { "x": 54, "y": 58, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0003","frame": { "x": 0, "y": 192, "w": 34, "h": 64 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 11, "y": 0, "w": 34, "h": 64 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0004","frame": { "x": 0, "y": 64, "w": 54, "h": 64 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 1, "y": 0, "w": 54, "h": 64 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0005","frame": { "x": 196, "y": 0, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0006","frame": { "x": 0, "y": 0, "w": 54, "h": 64 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 1, "y": 0, "w": 54, "h": 64 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0007","frame": { "x": 140, "y": 0, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0008","frame": { "x": 34, "y": 188, "w": 50, "h": 60 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 3, "y": 2, "w": 50, "h": 60 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0009","frame": { "x": 0, "y": 128, "w": 34, "h": 64 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 11, "y": 0, "w": 34, "h": 64 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0010","frame": { "x": 84, "y": 188, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }}]}';
|
||||
})();
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
function init() {
|
||||
|
||||
game.load.image('box', 'assets/tests/320x200.png');
|
||||
game.load.atlas('bot', 'assets/sprites/running_bot.png', null, botData);
|
||||
game.load.start();
|
||||
|
||||
}
|
||||
|
@ -17,11 +17,14 @@
|
|||
function create() {
|
||||
|
||||
game.stage.backgroundColor = 'rgb(0,0,0)';
|
||||
game.stage.disablePauseScreen = true;
|
||||
|
||||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'box');
|
||||
sprite = game.add.sprite(game.stage.centerX, game.stage.centerY, 'bot');
|
||||
|
||||
sprite.transform.origin.setTo(0.3, 0.8);
|
||||
sprite.animations.add('run', null, 10, true);
|
||||
|
||||
sprite.animations.play('run');
|
||||
|
||||
//sprite.transform.scale.setTo(4, 4);
|
||||
|
||||
game.input.onTap.add(rotateIt, this);
|
||||
|
||||
|
@ -42,36 +45,27 @@
|
|||
|
||||
function render() {
|
||||
|
||||
var originX: number = sprite.transform.origin.x * sprite.width;
|
||||
var originY: number = sprite.transform.origin.y * sprite.height;
|
||||
var centerX: number = 0.5 * sprite.width;
|
||||
var centerY: number = 0.5 * sprite.height;
|
||||
var distanceX: number = originX - centerX;
|
||||
var distanceY: number = originY - centerY;
|
||||
var distance: number = Math.sqrt(((originX - centerX) * (originX - centerX)) + ((originY - centerY) * (originY - centerY)));
|
||||
|
||||
var px = sprite.x + distance * Math.cos(sprite.transform.rotation + 45 * Math.PI / 180);
|
||||
var py = sprite.y + distance * Math.sin(sprite.transform.rotation + 45 * Math.PI / 180);
|
||||
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.fillText('rect width: ' + originX + ' height: ' + originY, 32, 32);
|
||||
game.stage.context.fillText('center x: ' + centerX + ' centerY: ' + centerY, 32, 52);
|
||||
game.stage.context.fillText('angle: ' + sprite.rotation , 32, 72);
|
||||
game.stage.context.fillText('point of rotation x: ' + sprite.transform.origin.x + ' y: ' + sprite.transform.origin.y, 32, 92);
|
||||
game.stage.context.fillText('sprite x: ' + sprite.x + ' sprite y: ' + sprite.y, 32, 112);
|
||||
game.stage.context.fillRect(sprite.x, sprite.y, 2, 2);
|
||||
game.stage.context.restore();
|
||||
game.stage.context.fillStyle = 'rgb(255,0,255)';
|
||||
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperLeft.x) + ' y: ' + Math.round(sprite.transform.upperLeft.y), sprite.transform.upperLeft.x, sprite.transform.upperLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.upperRight.x) + ' y: ' + Math.round(sprite.transform.upperRight.y), sprite.transform.upperRight.x, sprite.transform.upperRight.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomLeft.x) + ' y: ' + Math.round(sprite.transform.bottomLeft.y), sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y);
|
||||
game.stage.context.fillText('x: ' + Math.round(sprite.transform.bottomRight.x) + ' y: ' + Math.round(sprite.transform.bottomRight.y), sprite.transform.bottomRight.x, sprite.transform.bottomRight.y);
|
||||
|
||||
game.stage.context.fillRect(sprite.transform.center.x, sprite.transform.center.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperLeft.x, sprite.transform.upperLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.upperRight.x, sprite.transform.upperRight.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.bottomLeft.x, sprite.transform.bottomLeft.y, 2, 2);
|
||||
game.stage.context.fillRect(sprite.transform.bottomRight.x, sprite.transform.bottomRight.y, 2, 2);
|
||||
|
||||
game.stage.context.strokeStyle = 'rgb(255,255,0)';
|
||||
game.stage.context.strokeRect(sprite.cameraView.x, sprite.cameraView.y, sprite.cameraView.width, sprite.cameraView.height);
|
||||
|
||||
game.stage.context.save();
|
||||
game.stage.context.fillStyle = 'rgba(255,255,255,0.1)';
|
||||
game.stage.context.beginPath();
|
||||
game.stage.context.moveTo(sprite.x, sprite.y);
|
||||
game.stage.context.arc(sprite.x, sprite.y, distance, 0, Math.PI * 2);
|
||||
game.stage.context.closePath();
|
||||
game.stage.context.fill();
|
||||
game.stage.context.restore();
|
||||
|
||||
}
|
||||
|
||||
var botData = '{"frames": [{"filename": "running bot.swf/0000","frame": { "x": 34, "y": 128, "w": 56, "h": 60 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 2, "w": 56, "h": 60 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0001","frame": { "x": 54, "y": 0, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0002","frame": { "x": 54, "y": 58, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0003","frame": { "x": 0, "y": 192, "w": 34, "h": 64 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 11, "y": 0, "w": 34, "h": 64 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0004","frame": { "x": 0, "y": 64, "w": 54, "h": 64 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 1, "y": 0, "w": 54, "h": 64 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0005","frame": { "x": 196, "y": 0, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0006","frame": { "x": 0, "y": 0, "w": 54, "h": 64 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 1, "y": 0, "w": 54, "h": 64 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0007","frame": { "x": 140, "y": 0, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0008","frame": { "x": 34, "y": 188, "w": 50, "h": 60 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 3, "y": 2, "w": 50, "h": 60 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0009","frame": { "x": 0, "y": 128, "w": 34, "h": 64 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 11, "y": 0, "w": 34, "h": 64 },"sourceSize": { "w": 56, "h": 64 }},{"filename": "running bot.swf/0010","frame": { "x": 84, "y": 188, "w": 56, "h": 58 },"rotated": false,"trimmed": true,"spriteSourceSize": { "x": 0, "y": 3, "w": 56, "h": 58 },"sourceSize": { "w": 56, "h": 64 }}]}';
|
||||
|
||||
})();
|
||||
|
|
115
Tests/phaser.js
115
Tests/phaser.js
|
@ -3060,8 +3060,8 @@ var Phaser;
|
|||
(function (Components) {
|
||||
var Transform = (function () {
|
||||
/**
|
||||
* Creates a new Sprite Transform component
|
||||
* @param parent The Sprite using this transform
|
||||
* Creates a new Transform component
|
||||
* @param parent The game object using this transform
|
||||
*/
|
||||
function Transform(parent) {
|
||||
/**
|
||||
|
@ -3096,7 +3096,10 @@ var Phaser;
|
|||
this._sc = new Phaser.Point();
|
||||
this._scA = new Phaser.Point();
|
||||
}
|
||||
Transform.prototype.setCache = function () {
|
||||
Transform.prototype.setCache = /**
|
||||
* Populates the transform cache. Called by the parent object on creation.
|
||||
*/
|
||||
function () {
|
||||
this._pos.x = this.parent.x;
|
||||
this._pos.y = this.parent.y;
|
||||
this._halfSize.x = this.parent.width / 2;
|
||||
|
@ -3121,13 +3124,19 @@ var Phaser;
|
|||
this._sc.x = 0;
|
||||
this._sc.y = 1;
|
||||
}
|
||||
this.center.setTo(this.center.x, this.center.y);
|
||||
this.center.x = this.parent.x + this._distance * this._scA.y;
|
||||
this.center.y = this.parent.y + this._distance * this._scA.x;
|
||||
this.upperLeft.setTo(this.center.x - this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
this.upperRight.setTo(this.center.x + this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y + this._halfSize.x * this._sc.x);
|
||||
this.bottomLeft.setTo(this.center.x - this._halfSize.x * this._sc.y - this._halfSize.y * this._sc.x, this.center.y + this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
this.bottomRight.setTo(this.center.x + this._halfSize.x * this._sc.y - this._halfSize.y * this._sc.x, this.center.y + this._halfSize.y * this._sc.y + this._halfSize.x * this._sc.x);
|
||||
this._pos.x = this.parent.x;
|
||||
this._pos.y = this.parent.y;
|
||||
};
|
||||
Transform.prototype.update = function () {
|
||||
Transform.prototype.update = /**
|
||||
* Updates the local transform matrix and the cache values if anything has changed in the parent.
|
||||
*/
|
||||
function () {
|
||||
// Check cache
|
||||
var dirty = false;
|
||||
// 1) Height or Width change (also triggered by a change in scale) or an Origin change
|
||||
|
@ -3166,7 +3175,6 @@ var Phaser;
|
|||
if(dirty || this.parent.x != this._pos.x || this.parent.y != this._pos.y) {
|
||||
this.center.x = this.parent.x + this._distance * this._scA.y;
|
||||
this.center.y = this.parent.y + this._distance * this._scA.x;
|
||||
this.center.setTo(this.center.x, this.center.y);
|
||||
this.upperLeft.setTo(this.center.x - this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
this.upperRight.setTo(this.center.x + this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y + this._halfSize.x * this._sc.x);
|
||||
this.bottomLeft.setTo(this.center.x - this._halfSize.x * this._sc.y - this._halfSize.y * this._sc.x, this.center.y + this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
|
@ -3255,17 +3263,8 @@ var Phaser;
|
|||
});
|
||||
Object.defineProperty(Transform.prototype, "sin", {
|
||||
get: /**
|
||||
* The center of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
* The equivalent of Math.sin(rotation + rotationOffset)
|
||||
*/
|
||||
//public get centerX(): number {
|
||||
// return this.center.x;
|
||||
//}
|
||||
/**
|
||||
* The center of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
//public get centerY(): number {
|
||||
// return this.center.y;
|
||||
//}
|
||||
function () {
|
||||
return this._sc.x;
|
||||
},
|
||||
|
@ -3273,7 +3272,10 @@ var Phaser;
|
|||
configurable: true
|
||||
});
|
||||
Object.defineProperty(Transform.prototype, "cos", {
|
||||
get: function () {
|
||||
get: /**
|
||||
* The equivalent of Math.cos(rotation + rotationOffset)
|
||||
*/
|
||||
function () {
|
||||
return this._sc.y;
|
||||
},
|
||||
enumerable: true,
|
||||
|
@ -4681,35 +4683,12 @@ var Phaser;
|
|||
sprite.cameraView.x = Math.round(sprite.x - (camera.worldView.x * sprite.transform.scrollFactor.x) - (sprite.cameraView.width * sprite.transform.origin.x));
|
||||
sprite.cameraView.y = Math.round(sprite.y - (camera.worldView.y * sprite.transform.scrollFactor.y) - (sprite.cameraView.height * sprite.transform.origin.y));
|
||||
} else {
|
||||
//var left:Number = Math.min(topLeft.x, topRight.x, bottomRight.x, bottomLeft.x);
|
||||
//var top:Number = Math.min(topLeft.y, topRight.y, bottomRight.y, bottomLeft.y);
|
||||
//var right:Number = Math.max(topLeft.x, topRight.x, bottomRight.x, bottomLeft.x);
|
||||
//var bottom:Number = Math.max(topLeft.y, topRight.y, bottomRight.y, bottomLeft.y);
|
||||
//return new Rectangle(left, top, right - left, bottom - top);
|
||||
var minX = Math.min(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var minY = Math.min(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
var maxX = Math.max(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var maxY = Math.max(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
// (min_x,min_y), (min_x,max_y), (max_x,max_y), (max_x,min_y)
|
||||
sprite.cameraView.x = minX;
|
||||
sprite.cameraView.y = minY;
|
||||
sprite.cameraView.width = maxX - minX;
|
||||
sprite.cameraView.height = maxY - minY;
|
||||
/*
|
||||
// Useful to get the maximum AABB size of any given rect
|
||||
|
||||
If you want a single box that covers all angles, just take the half-diagonal of your existing box as the radius of a circle.
|
||||
The new box has to contain this circle, so it should be a square with side-length equal to twice the radius
|
||||
(equiv. the diagonal of the original AABB) and with the same center as the original.
|
||||
*/
|
||||
}
|
||||
sprite.cameraView.x = Math.min(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
sprite.cameraView.y = Math.min(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
sprite.cameraView.width = Math.max(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x) - sprite.cameraView.x;
|
||||
sprite.cameraView.height = Math.max(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y) - sprite.cameraView.y;
|
||||
}
|
||||
}
|
||||
if(sprite.animations.currentFrame !== null && sprite.animations.currentFrame.trimmed) {
|
||||
//sprite.cameraView.x += sprite.animations.currentFrame.spriteSourceSizeX;
|
||||
//sprite.cameraView.y += sprite.animations.currentFrame.spriteSourceSizeY;
|
||||
//this._dw = sprite.animations.currentFrame.spriteSourceSizeW;
|
||||
//this._dh = sprite.animations.currentFrame.spriteSourceSizeH;
|
||||
}
|
||||
return sprite.cameraView;
|
||||
};
|
||||
SpriteUtils.getAsPoints = function getAsPoints(sprite) {
|
||||
|
@ -4724,7 +4703,7 @@ var Phaser;
|
|||
out.push(new Phaser.Point(sprite.x, sprite.y + sprite.height));
|
||||
return out;
|
||||
};
|
||||
SpriteUtils.overlapsPoint = /**
|
||||
SpriteUtils.overlapsXY = /**
|
||||
* Checks to see if some <code>GameObject</code> overlaps this <code>GameObject</code> or <code>Group</code>.
|
||||
* If the group has a LOT of things in it, it might be faster to use <code>Collision.overlaps()</code>.
|
||||
* WARNING: Currently tilemaps do NOT support screen space overlap checks!
|
||||
|
@ -4777,7 +4756,7 @@ var Phaser;
|
|||
*/
|
||||
/**
|
||||
* Checks to see if this <code>GameObject</code> were located at the given position, would it overlap the <code>GameObject</code> or <code>Group</code>?
|
||||
* This is distinct from overlapsPoint(), which just checks that point, rather than taking the object's size numbero account.
|
||||
* This is distinct from overlapsPoint(), which just checks that point, rather than taking the object's size into account.
|
||||
* WARNING: Currently tilemaps do NOT support screen space overlap checks!
|
||||
*
|
||||
* @param X {number} The X position you want to check. Pretends this object (the caller, not the parameter) is located here.
|
||||
|
@ -4832,6 +4811,43 @@ var Phaser;
|
|||
}
|
||||
*/
|
||||
/**
|
||||
* Checks to see if the given x and y coordinates overlaps this <code>Sprite</code>, taking scaling and rotation into account.
|
||||
* The coordinates must be given in world space, not local or camera space.
|
||||
*
|
||||
* @param sprite {Sprite} The Sprite to check. It will take scaling and rotation into account.
|
||||
* @param x {Number} The x coordinate in world space.
|
||||
* @param y {Number} The y coordinate in world space.
|
||||
*
|
||||
* @return Whether or not the point overlaps this object.
|
||||
*/
|
||||
function overlapsXY(sprite, x, y) {
|
||||
// if rotation == 0 then just do a rect check instead!
|
||||
if(sprite.transform.rotation == 0) {
|
||||
return Phaser.RectangleUtils.contains(sprite.cameraView, x, y);
|
||||
}
|
||||
//var ex: number = sprite.transform.upperRight.x - sprite.transform.upperLeft.x;
|
||||
//var ey: number = sprite.transform.upperRight.y - sprite.transform.upperLeft.y;
|
||||
//var fx: number = sprite.transform.bottomLeft.x - sprite.transform.upperLeft.x;
|
||||
//var fy: number = sprite.transform.bottomLeft.y - sprite.transform.upperLeft.y;
|
||||
//if ((x-ax)*ex+(y-ay)*ey<0.0) return false;
|
||||
if((x - sprite.transform.upperLeft.x) * (sprite.transform.upperRight.x - sprite.transform.upperLeft.x) + (y - sprite.transform.upperLeft.y) * (sprite.transform.upperRight.y - sprite.transform.upperLeft.y) < 0) {
|
||||
return false;
|
||||
}
|
||||
//if ((x-bx)*ex+(y-by)*ey>0.0) return false;
|
||||
if((x - sprite.transform.upperRight.x) * (sprite.transform.upperRight.x - sprite.transform.upperLeft.x) + (y - sprite.transform.upperRight.y) * (sprite.transform.upperRight.y - sprite.transform.upperLeft.y) > 0) {
|
||||
return false;
|
||||
}
|
||||
//if ((x-ax)*fx+(y-ay)*fy<0.0) return false;
|
||||
if((x - sprite.transform.upperLeft.x) * (sprite.transform.bottomLeft.x - sprite.transform.upperLeft.x) + (y - sprite.transform.upperLeft.y) * (sprite.transform.bottomLeft.y - sprite.transform.upperLeft.y) < 0) {
|
||||
return false;
|
||||
}
|
||||
//if ((x-dx)*fx+(y-dy)*fy>0.0) return false;
|
||||
if((x - sprite.transform.bottomLeft.x) * (sprite.transform.bottomLeft.x - sprite.transform.upperLeft.x) + (y - sprite.transform.bottomLeft.y) * (sprite.transform.bottomLeft.y - sprite.transform.upperLeft.y) > 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
SpriteUtils.overlapsPoint = /**
|
||||
* Checks to see if a point in 2D world space overlaps this <code>GameObject</code>.
|
||||
*
|
||||
* @param point {Point} The point in world space you want to check.
|
||||
|
@ -16574,9 +16590,8 @@ var Phaser;
|
|||
if(sprite.transform.scrollFactor.equals(0)) {
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
//return RectangleUtils.intersects(sprite.cameraView, camera.screenView);
|
||||
};
|
||||
return Phaser.RectangleUtils.intersects(sprite.cameraView, camera.screenView);
|
||||
};
|
||||
CanvasRenderer.prototype.inScreen = function (camera) {
|
||||
return true;
|
||||
};
|
||||
|
|
45
build/phaser.d.ts
vendored
45
build/phaser.d.ts
vendored
|
@ -1892,8 +1892,8 @@ module Phaser {
|
|||
module Phaser.Components {
|
||||
class Transform {
|
||||
/**
|
||||
* Creates a new Sprite Transform component
|
||||
* @param parent The Sprite using this transform
|
||||
* Creates a new Transform component
|
||||
* @param parent The game object using this transform
|
||||
*/
|
||||
constructor(parent);
|
||||
private _rotation;
|
||||
|
@ -1908,13 +1908,37 @@ module Phaser.Components {
|
|||
private _angle;
|
||||
private _distance;
|
||||
private _prevRotation;
|
||||
/**
|
||||
* The center of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public center: Point;
|
||||
/**
|
||||
* The upper-left corner of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public upperLeft: Point;
|
||||
/**
|
||||
* The upper-right corner of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public upperRight: Point;
|
||||
/**
|
||||
* The bottom-left corner of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public bottomLeft: Point;
|
||||
/**
|
||||
* The bottom-right corner of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
public bottomRight: Point;
|
||||
/**
|
||||
* The local transform matrix
|
||||
*/
|
||||
public local: Mat3;
|
||||
/**
|
||||
* Populates the transform cache. Called by the parent object on creation.
|
||||
*/
|
||||
public setCache(): void;
|
||||
/**
|
||||
* Updates the local transform matrix and the cache values if anything has changed in the parent.
|
||||
*/
|
||||
public update(): void;
|
||||
/**
|
||||
* Reference to Phaser.Game
|
||||
|
@ -1975,7 +1999,13 @@ module Phaser.Components {
|
|||
* Half the height of the parent sprite, taking into consideration scaling
|
||||
*/
|
||||
public halfHeight : number;
|
||||
/**
|
||||
* The equivalent of Math.sin(rotation + rotationOffset)
|
||||
*/
|
||||
public sin : number;
|
||||
/**
|
||||
* The equivalent of Math.cos(rotation + rotationOffset)
|
||||
*/
|
||||
public cos : number;
|
||||
}
|
||||
}
|
||||
|
@ -2705,6 +2735,17 @@ module Phaser {
|
|||
static updateCameraView(camera: Camera, sprite: Sprite): Rectangle;
|
||||
static getAsPoints(sprite: Sprite): Point[];
|
||||
/**
|
||||
* Checks to see if the given x and y coordinates overlaps this <code>Sprite</code>, taking scaling and rotation into account.
|
||||
* The coordinates must be given in world space, not local or camera space.
|
||||
*
|
||||
* @param sprite {Sprite} The Sprite to check. It will take scaling and rotation into account.
|
||||
* @param x {Number} The x coordinate in world space.
|
||||
* @param y {Number} The y coordinate in world space.
|
||||
*
|
||||
* @return Whether or not the point overlaps this object.
|
||||
*/
|
||||
static overlapsXY(sprite: Sprite, x: number, y: number): bool;
|
||||
/**
|
||||
* Checks to see if a point in 2D world space overlaps this <code>GameObject</code>.
|
||||
*
|
||||
* @param point {Point} The point in world space you want to check.
|
||||
|
|
115
build/phaser.js
115
build/phaser.js
|
@ -3060,8 +3060,8 @@ var Phaser;
|
|||
(function (Components) {
|
||||
var Transform = (function () {
|
||||
/**
|
||||
* Creates a new Sprite Transform component
|
||||
* @param parent The Sprite using this transform
|
||||
* Creates a new Transform component
|
||||
* @param parent The game object using this transform
|
||||
*/
|
||||
function Transform(parent) {
|
||||
/**
|
||||
|
@ -3096,7 +3096,10 @@ var Phaser;
|
|||
this._sc = new Phaser.Point();
|
||||
this._scA = new Phaser.Point();
|
||||
}
|
||||
Transform.prototype.setCache = function () {
|
||||
Transform.prototype.setCache = /**
|
||||
* Populates the transform cache. Called by the parent object on creation.
|
||||
*/
|
||||
function () {
|
||||
this._pos.x = this.parent.x;
|
||||
this._pos.y = this.parent.y;
|
||||
this._halfSize.x = this.parent.width / 2;
|
||||
|
@ -3121,13 +3124,19 @@ var Phaser;
|
|||
this._sc.x = 0;
|
||||
this._sc.y = 1;
|
||||
}
|
||||
this.center.setTo(this.center.x, this.center.y);
|
||||
this.center.x = this.parent.x + this._distance * this._scA.y;
|
||||
this.center.y = this.parent.y + this._distance * this._scA.x;
|
||||
this.upperLeft.setTo(this.center.x - this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
this.upperRight.setTo(this.center.x + this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y + this._halfSize.x * this._sc.x);
|
||||
this.bottomLeft.setTo(this.center.x - this._halfSize.x * this._sc.y - this._halfSize.y * this._sc.x, this.center.y + this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
this.bottomRight.setTo(this.center.x + this._halfSize.x * this._sc.y - this._halfSize.y * this._sc.x, this.center.y + this._halfSize.y * this._sc.y + this._halfSize.x * this._sc.x);
|
||||
this._pos.x = this.parent.x;
|
||||
this._pos.y = this.parent.y;
|
||||
};
|
||||
Transform.prototype.update = function () {
|
||||
Transform.prototype.update = /**
|
||||
* Updates the local transform matrix and the cache values if anything has changed in the parent.
|
||||
*/
|
||||
function () {
|
||||
// Check cache
|
||||
var dirty = false;
|
||||
// 1) Height or Width change (also triggered by a change in scale) or an Origin change
|
||||
|
@ -3166,7 +3175,6 @@ var Phaser;
|
|||
if(dirty || this.parent.x != this._pos.x || this.parent.y != this._pos.y) {
|
||||
this.center.x = this.parent.x + this._distance * this._scA.y;
|
||||
this.center.y = this.parent.y + this._distance * this._scA.x;
|
||||
this.center.setTo(this.center.x, this.center.y);
|
||||
this.upperLeft.setTo(this.center.x - this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
this.upperRight.setTo(this.center.x + this._halfSize.x * this._sc.y + this._halfSize.y * this._sc.x, this.center.y - this._halfSize.y * this._sc.y + this._halfSize.x * this._sc.x);
|
||||
this.bottomLeft.setTo(this.center.x - this._halfSize.x * this._sc.y - this._halfSize.y * this._sc.x, this.center.y + this._halfSize.y * this._sc.y - this._halfSize.x * this._sc.x);
|
||||
|
@ -3255,17 +3263,8 @@ var Phaser;
|
|||
});
|
||||
Object.defineProperty(Transform.prototype, "sin", {
|
||||
get: /**
|
||||
* The center of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
* The equivalent of Math.sin(rotation + rotationOffset)
|
||||
*/
|
||||
//public get centerX(): number {
|
||||
// return this.center.x;
|
||||
//}
|
||||
/**
|
||||
* The center of the Sprite in world coordinates, after taking scaling and rotation into consideration
|
||||
*/
|
||||
//public get centerY(): number {
|
||||
// return this.center.y;
|
||||
//}
|
||||
function () {
|
||||
return this._sc.x;
|
||||
},
|
||||
|
@ -3273,7 +3272,10 @@ var Phaser;
|
|||
configurable: true
|
||||
});
|
||||
Object.defineProperty(Transform.prototype, "cos", {
|
||||
get: function () {
|
||||
get: /**
|
||||
* The equivalent of Math.cos(rotation + rotationOffset)
|
||||
*/
|
||||
function () {
|
||||
return this._sc.y;
|
||||
},
|
||||
enumerable: true,
|
||||
|
@ -4681,35 +4683,12 @@ var Phaser;
|
|||
sprite.cameraView.x = Math.round(sprite.x - (camera.worldView.x * sprite.transform.scrollFactor.x) - (sprite.cameraView.width * sprite.transform.origin.x));
|
||||
sprite.cameraView.y = Math.round(sprite.y - (camera.worldView.y * sprite.transform.scrollFactor.y) - (sprite.cameraView.height * sprite.transform.origin.y));
|
||||
} else {
|
||||
//var left:Number = Math.min(topLeft.x, topRight.x, bottomRight.x, bottomLeft.x);
|
||||
//var top:Number = Math.min(topLeft.y, topRight.y, bottomRight.y, bottomLeft.y);
|
||||
//var right:Number = Math.max(topLeft.x, topRight.x, bottomRight.x, bottomLeft.x);
|
||||
//var bottom:Number = Math.max(topLeft.y, topRight.y, bottomRight.y, bottomLeft.y);
|
||||
//return new Rectangle(left, top, right - left, bottom - top);
|
||||
var minX = Math.min(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var minY = Math.min(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
var maxX = Math.max(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
var maxY = Math.max(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
// (min_x,min_y), (min_x,max_y), (max_x,max_y), (max_x,min_y)
|
||||
sprite.cameraView.x = minX;
|
||||
sprite.cameraView.y = minY;
|
||||
sprite.cameraView.width = maxX - minX;
|
||||
sprite.cameraView.height = maxY - minY;
|
||||
/*
|
||||
// Useful to get the maximum AABB size of any given rect
|
||||
|
||||
If you want a single box that covers all angles, just take the half-diagonal of your existing box as the radius of a circle.
|
||||
The new box has to contain this circle, so it should be a square with side-length equal to twice the radius
|
||||
(equiv. the diagonal of the original AABB) and with the same center as the original.
|
||||
*/
|
||||
}
|
||||
sprite.cameraView.x = Math.min(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x);
|
||||
sprite.cameraView.y = Math.min(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y);
|
||||
sprite.cameraView.width = Math.max(sprite.transform.upperLeft.x, sprite.transform.upperRight.x, sprite.transform.bottomLeft.x, sprite.transform.bottomRight.x) - sprite.cameraView.x;
|
||||
sprite.cameraView.height = Math.max(sprite.transform.upperLeft.y, sprite.transform.upperRight.y, sprite.transform.bottomLeft.y, sprite.transform.bottomRight.y) - sprite.cameraView.y;
|
||||
}
|
||||
}
|
||||
if(sprite.animations.currentFrame !== null && sprite.animations.currentFrame.trimmed) {
|
||||
//sprite.cameraView.x += sprite.animations.currentFrame.spriteSourceSizeX;
|
||||
//sprite.cameraView.y += sprite.animations.currentFrame.spriteSourceSizeY;
|
||||
//this._dw = sprite.animations.currentFrame.spriteSourceSizeW;
|
||||
//this._dh = sprite.animations.currentFrame.spriteSourceSizeH;
|
||||
}
|
||||
return sprite.cameraView;
|
||||
};
|
||||
SpriteUtils.getAsPoints = function getAsPoints(sprite) {
|
||||
|
@ -4724,7 +4703,7 @@ var Phaser;
|
|||
out.push(new Phaser.Point(sprite.x, sprite.y + sprite.height));
|
||||
return out;
|
||||
};
|
||||
SpriteUtils.overlapsPoint = /**
|
||||
SpriteUtils.overlapsXY = /**
|
||||
* Checks to see if some <code>GameObject</code> overlaps this <code>GameObject</code> or <code>Group</code>.
|
||||
* If the group has a LOT of things in it, it might be faster to use <code>Collision.overlaps()</code>.
|
||||
* WARNING: Currently tilemaps do NOT support screen space overlap checks!
|
||||
|
@ -4777,7 +4756,7 @@ var Phaser;
|
|||
*/
|
||||
/**
|
||||
* Checks to see if this <code>GameObject</code> were located at the given position, would it overlap the <code>GameObject</code> or <code>Group</code>?
|
||||
* This is distinct from overlapsPoint(), which just checks that point, rather than taking the object's size numbero account.
|
||||
* This is distinct from overlapsPoint(), which just checks that point, rather than taking the object's size into account.
|
||||
* WARNING: Currently tilemaps do NOT support screen space overlap checks!
|
||||
*
|
||||
* @param X {number} The X position you want to check. Pretends this object (the caller, not the parameter) is located here.
|
||||
|
@ -4832,6 +4811,43 @@ var Phaser;
|
|||
}
|
||||
*/
|
||||
/**
|
||||
* Checks to see if the given x and y coordinates overlaps this <code>Sprite</code>, taking scaling and rotation into account.
|
||||
* The coordinates must be given in world space, not local or camera space.
|
||||
*
|
||||
* @param sprite {Sprite} The Sprite to check. It will take scaling and rotation into account.
|
||||
* @param x {Number} The x coordinate in world space.
|
||||
* @param y {Number} The y coordinate in world space.
|
||||
*
|
||||
* @return Whether or not the point overlaps this object.
|
||||
*/
|
||||
function overlapsXY(sprite, x, y) {
|
||||
// if rotation == 0 then just do a rect check instead!
|
||||
if(sprite.transform.rotation == 0) {
|
||||
return Phaser.RectangleUtils.contains(sprite.cameraView, x, y);
|
||||
}
|
||||
//var ex: number = sprite.transform.upperRight.x - sprite.transform.upperLeft.x;
|
||||
//var ey: number = sprite.transform.upperRight.y - sprite.transform.upperLeft.y;
|
||||
//var fx: number = sprite.transform.bottomLeft.x - sprite.transform.upperLeft.x;
|
||||
//var fy: number = sprite.transform.bottomLeft.y - sprite.transform.upperLeft.y;
|
||||
//if ((x-ax)*ex+(y-ay)*ey<0.0) return false;
|
||||
if((x - sprite.transform.upperLeft.x) * (sprite.transform.upperRight.x - sprite.transform.upperLeft.x) + (y - sprite.transform.upperLeft.y) * (sprite.transform.upperRight.y - sprite.transform.upperLeft.y) < 0) {
|
||||
return false;
|
||||
}
|
||||
//if ((x-bx)*ex+(y-by)*ey>0.0) return false;
|
||||
if((x - sprite.transform.upperRight.x) * (sprite.transform.upperRight.x - sprite.transform.upperLeft.x) + (y - sprite.transform.upperRight.y) * (sprite.transform.upperRight.y - sprite.transform.upperLeft.y) > 0) {
|
||||
return false;
|
||||
}
|
||||
//if ((x-ax)*fx+(y-ay)*fy<0.0) return false;
|
||||
if((x - sprite.transform.upperLeft.x) * (sprite.transform.bottomLeft.x - sprite.transform.upperLeft.x) + (y - sprite.transform.upperLeft.y) * (sprite.transform.bottomLeft.y - sprite.transform.upperLeft.y) < 0) {
|
||||
return false;
|
||||
}
|
||||
//if ((x-dx)*fx+(y-dy)*fy>0.0) return false;
|
||||
if((x - sprite.transform.bottomLeft.x) * (sprite.transform.bottomLeft.x - sprite.transform.upperLeft.x) + (y - sprite.transform.bottomLeft.y) * (sprite.transform.bottomLeft.y - sprite.transform.upperLeft.y) > 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
SpriteUtils.overlapsPoint = /**
|
||||
* Checks to see if a point in 2D world space overlaps this <code>GameObject</code>.
|
||||
*
|
||||
* @param point {Point} The point in world space you want to check.
|
||||
|
@ -16574,9 +16590,8 @@ var Phaser;
|
|||
if(sprite.transform.scrollFactor.equals(0)) {
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
//return RectangleUtils.intersects(sprite.cameraView, camera.screenView);
|
||||
};
|
||||
return Phaser.RectangleUtils.intersects(sprite.cameraView, camera.screenView);
|
||||
};
|
||||
CanvasRenderer.prototype.inScreen = function (camera) {
|
||||
return true;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue