mirror of
https://github.com/photonstorm/phaser
synced 2024-11-22 20:53:39 +00:00
ArcadePhysics.Body.onCollide is a new Signal that is dispatched whenever the Body collides with another Body. Due to the potentially high volume of signals this could create it is disabled by default. To use this feature set this property to a Phaser.Signal: sprite.body.onCollide = new Phaser.Signal()
and it will be called when a collision happens, passing two arguments: the sprites which collided.
ArcadePhysics.Body.onOverlap is a new Signal that is dispatched whenever the Body overlaps with another Body. Due to the potentially high volume of signals this could create it is disabled by default. To use this feature set this property to a Phaser.Signal: `sprite.body.onOverlap = new Phaser.Signal()` and it will be called when an overlap happens, passing two arguments: the sprites which collided.
This commit is contained in:
parent
6ba3c9401f
commit
c0ba439e82
4 changed files with 100 additions and 3 deletions
|
@ -329,6 +329,8 @@ You can read all about the philosophy behind Lazer [here](http://phaser.io/news/
|
|||
* ArcadePhysics.World.separateCircle is a new method that handles all circular body collisions internally within Arcade Physics (thanks @VitaZheltyakov)
|
||||
* All of the Arcade Physics internal methods, such as `collideGroupVsSelf`, `collideSpriteVsSprite` and so on, have been updated to work with circular body shapes (thanks @VitaZheltyakov)
|
||||
* ArcadePhysics.Body.onWorldBounds is a new Signal that is dispatched whenever the Body collides with the world bounds, something that was previously difficult to detect. Due to the potentially high volume of signals this could create it is disabled by default. To use this feature set this property to a Phaser.Signal: `sprite.body.onWorldBounds = new Phaser.Signal()` and it will be called when a collision happens, passing one argument: the sprite on which it occurred.
|
||||
* ArcadePhysics.Body.onCollide is a new Signal that is dispatched whenever the Body collides with another Body. Due to the potentially high volume of signals this could create it is disabled by default. To use this feature set this property to a Phaser.Signal: `sprite.body.onCollide = new Phaser.Signal()` and it will be called when a collision happens, passing two arguments: the sprites which collided.
|
||||
* ArcadePhysics.Body.onOverlap is a new Signal that is dispatched whenever the Body overlaps with another Body. Due to the potentially high volume of signals this could create it is disabled by default. To use this feature set this property to a Phaser.Signal: `sprite.body.onOverlap = new Phaser.Signal()` and it will be called when an overlap happens, passing two arguments: the sprites which collided.
|
||||
|
||||
### Updates
|
||||
|
||||
|
|
|
@ -191,13 +191,52 @@ Phaser.Physics.Arcade.Body = function (sprite) {
|
|||
/**
|
||||
* A Signal that is dispatched when this Body collides with the world bounds.
|
||||
* Due to the potentially high volume of signals this could create it is disabled by default.
|
||||
* To use this feature set this property to a Phaser.Signal:
|
||||
* `sprite.body.onWorldBounds = new Phaser.Signal()`
|
||||
* To use this feature set this property to a Phaser.Signal: `sprite.body.onWorldBounds = new Phaser.Signal()`
|
||||
* and it will be called when a collision happens, passing one argument: the sprite on which it occurred.
|
||||
* @property {Phaser.Signal} onWorldBounds
|
||||
*/
|
||||
this.onWorldBounds = null;
|
||||
|
||||
/**
|
||||
* A Signal that is dispatched when this Body collides with another Body.
|
||||
*
|
||||
* You still need to call `game.physics.arcade.collide` in your `update` method in order
|
||||
* for this signal to be dispatched.
|
||||
*
|
||||
* Usually you'd pass a callback to the `collide` method, but this signal provides for
|
||||
* a different level of notification.
|
||||
*
|
||||
* Due to the potentially high volume of signals this could create it is disabled by default.
|
||||
*
|
||||
* To use this feature set this property to a Phaser.Signal: `sprite.body.onCollide = new Phaser.Signal()`
|
||||
* and it will be called when a collision happens, passing two arguments: the sprites which collided.
|
||||
* The first sprite in the argument is always the owner of this Body.
|
||||
*
|
||||
* If two Bodies with this Signal set collide, both will dispatch the Signal.
|
||||
* @property {Phaser.Signal} onCollide
|
||||
*/
|
||||
this.onCollide = null;
|
||||
|
||||
/**
|
||||
* A Signal that is dispatched when this Body overlaps with another Body.
|
||||
*
|
||||
* You still need to call `game.physics.arcade.overlap` in your `update` method in order
|
||||
* for this signal to be dispatched.
|
||||
*
|
||||
* Usually you'd pass a callback to the `overlap` method, but this signal provides for
|
||||
* a different level of notification.
|
||||
*
|
||||
* Due to the potentially high volume of signals this could create it is disabled by default.
|
||||
*
|
||||
* To use this feature set this property to a Phaser.Signal: `sprite.body.onOverlap = new Phaser.Signal()`
|
||||
* and it will be called when a collision happens, passing two arguments: the sprites which collided.
|
||||
* The first sprite in the argument is always the owner of this Body.
|
||||
*
|
||||
* If two Bodies with this Signal set collide, both will dispatch the Signal.
|
||||
* @property {Phaser.Signal} onOverlap
|
||||
*/
|
||||
this.onOverlap = null;
|
||||
|
||||
/**
|
||||
* @property {Phaser.Point} maxVelocity - The maximum velocity in pixels per second sq. that the Body can reach.
|
||||
* @default
|
||||
|
|
|
@ -1019,7 +1019,37 @@ Phaser.Physics.Arcade.prototype = {
|
|||
}
|
||||
}
|
||||
|
||||
return (resultX || resultY);
|
||||
var result = (resultX || resultY);
|
||||
|
||||
if (result)
|
||||
{
|
||||
if (overlapOnly)
|
||||
{
|
||||
if (body1.onOverlap)
|
||||
{
|
||||
body1.onOverlap.dispatch(body1.sprite, body2.sprite);
|
||||
}
|
||||
|
||||
if (body2.onOverlap)
|
||||
{
|
||||
body2.onOverlap.dispatch(body2.sprite, body1.sprite);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (body1.onCollide)
|
||||
{
|
||||
body1.onCollide.dispatch(body1.sprite, body2.sprite);
|
||||
}
|
||||
|
||||
if (body2.onCollide)
|
||||
{
|
||||
body2.onCollide.dispatch(body2.sprite, body1.sprite);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
},
|
||||
|
||||
|
@ -1175,6 +1205,19 @@ Phaser.Physics.Arcade.prototype = {
|
|||
// Can't separate two immovable bodies, or a body with its own custom separation logic
|
||||
if (overlapOnly || overlap === 0 || (body1.immovable && body2.immovable) || body1.customSeparateX || body2.customSeparateX)
|
||||
{
|
||||
if (overlap !== 0)
|
||||
{
|
||||
if (body1.onOverlap)
|
||||
{
|
||||
body1.onOverlap.dispatch(body1.sprite, body2.sprite);
|
||||
}
|
||||
|
||||
if (body2.onOverlap)
|
||||
{
|
||||
body2.onOverlap.dispatch(body2.sprite, body1.sprite);
|
||||
}
|
||||
}
|
||||
|
||||
// return true if there was some overlap, otherwise false
|
||||
return (overlap !== 0);
|
||||
}
|
||||
|
@ -1263,6 +1306,16 @@ Phaser.Physics.Arcade.prototype = {
|
|||
body2.y += (body2.velocity.y * this.game.time.physicsElapsed) + overlap * Math.sin(angleCollision);
|
||||
}
|
||||
|
||||
if (body1.onCollide)
|
||||
{
|
||||
body1.onCollide.dispatch(body1.sprite, body2.sprite);
|
||||
}
|
||||
|
||||
if (body2.onCollide)
|
||||
{
|
||||
body2.onCollide.dispatch(body2.sprite, body1.sprite);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
},
|
||||
|
|
3
typescript/phaser.d.ts
vendored
3
typescript/phaser.d.ts
vendored
|
@ -3011,7 +3011,10 @@ declare module Phaser {
|
|||
movementCallbackContext: any;
|
||||
newVelocity: Phaser.Point;
|
||||
offset: Phaser.Point;
|
||||
onCollide: Phaser.Signal;
|
||||
onMoveComplete: Phaser.Signal;
|
||||
onOverlap: Phaser.Signal;
|
||||
onWorldBounds: Phaser.Signal;
|
||||
overlapX: number;
|
||||
overlapY: number;
|
||||
phase: number;
|
||||
|
|
Loading…
Reference in a new issue