mirror of
https://github.com/photonstorm/phaser
synced 2024-11-22 04:33:31 +00:00
Lots of updates to Impact physics system
New Sprite and Image handlers with helper methods. Updated motion, world and new Factory class.
This commit is contained in:
parent
8cf216a530
commit
cc781c5ee2
6 changed files with 142 additions and 28 deletions
42
v3/src/physics/impact/Factory.js
Normal file
42
v3/src/physics/impact/Factory.js
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
var Class = require('../../utils/Class');
|
||||||
|
var ImpactImage = require('./ImpactImage');
|
||||||
|
var ImpactSprite = require('./ImpactSprite');
|
||||||
|
|
||||||
|
var Factory = new Class({
|
||||||
|
|
||||||
|
initialize:
|
||||||
|
|
||||||
|
function Factory (world)
|
||||||
|
{
|
||||||
|
this.world = world;
|
||||||
|
|
||||||
|
this.sys = world.scene.sys;
|
||||||
|
},
|
||||||
|
|
||||||
|
body: function (x, y, sizeX, sizeY)
|
||||||
|
{
|
||||||
|
return this.world.create(x, y, sizeX, sizeY);
|
||||||
|
},
|
||||||
|
|
||||||
|
image: function (x, y, key, frame)
|
||||||
|
{
|
||||||
|
var image = new ImpactImage(this.world, x, y, key, frame);
|
||||||
|
|
||||||
|
this.sys.displayList.add(image);
|
||||||
|
|
||||||
|
return image;
|
||||||
|
},
|
||||||
|
|
||||||
|
sprite: function (x, y, key, frame)
|
||||||
|
{
|
||||||
|
var sprite = new ImpactSprite(this.world, x, y, key, frame);
|
||||||
|
|
||||||
|
this.sys.displayList.add(sprite);
|
||||||
|
this.sys.updateList.add(sprite);
|
||||||
|
|
||||||
|
return sprite;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = Factory;
|
38
v3/src/physics/impact/ImpactImage.js
Normal file
38
v3/src/physics/impact/ImpactImage.js
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
|
||||||
|
var Class = require('../../utils/Class');
|
||||||
|
var Components = require('./Components');
|
||||||
|
var Image = require('../../gameobjects/image/Image');
|
||||||
|
|
||||||
|
var ImpactImage = new Class({
|
||||||
|
|
||||||
|
Extends: Image,
|
||||||
|
|
||||||
|
Mixins: [
|
||||||
|
Components.Acceleration,
|
||||||
|
Components.BodyType,
|
||||||
|
Components.Bounce,
|
||||||
|
Components.CheckAgainst,
|
||||||
|
Components.Collides,
|
||||||
|
Components.Velocity
|
||||||
|
],
|
||||||
|
|
||||||
|
initialize:
|
||||||
|
|
||||||
|
function ImpactImage (world, x, y, texture, frame)
|
||||||
|
{
|
||||||
|
Image.call(this, world.scene, x, y, texture, frame);
|
||||||
|
|
||||||
|
this.body = world.create(x, y, this.width, this.height);
|
||||||
|
|
||||||
|
this.body.gameObject = this;
|
||||||
|
|
||||||
|
// Local references to the Body properties
|
||||||
|
this.vel = this.body.vel;
|
||||||
|
this.accel = this.body.accel;
|
||||||
|
this.friction = this.body.friction;
|
||||||
|
this.maxVel = this.body.maxVel;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = ImpactImage;
|
38
v3/src/physics/impact/ImpactSprite.js
Normal file
38
v3/src/physics/impact/ImpactSprite.js
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
|
||||||
|
var Class = require('../../utils/Class');
|
||||||
|
var Components = require('./Components');
|
||||||
|
var Sprite = require('../../gameobjects/sprite/Sprite');
|
||||||
|
|
||||||
|
var ImpactSprite = new Class({
|
||||||
|
|
||||||
|
Extends: Sprite,
|
||||||
|
|
||||||
|
Mixins: [
|
||||||
|
Components.Acceleration,
|
||||||
|
Components.BodyType,
|
||||||
|
Components.Bounce,
|
||||||
|
Components.CheckAgainst,
|
||||||
|
Components.Collides,
|
||||||
|
Components.Velocity
|
||||||
|
],
|
||||||
|
|
||||||
|
initialize:
|
||||||
|
|
||||||
|
function ImpactSprite (world, x, y, texture, frame)
|
||||||
|
{
|
||||||
|
Sprite.call(this, world.scene, x, y, texture, frame);
|
||||||
|
|
||||||
|
this.body = world.create(x, y, this.width, this.height);
|
||||||
|
|
||||||
|
this.body.gameObject = this;
|
||||||
|
|
||||||
|
// Local references to the Body properties
|
||||||
|
this.vel = this.body.vel;
|
||||||
|
this.accel = this.body.accel;
|
||||||
|
this.friction = this.body.friction;
|
||||||
|
this.maxVel = this.body.maxVel;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = ImpactSprite;
|
|
@ -67,19 +67,8 @@ var UpdateMotion = function (body, res)
|
||||||
body.standing = true;
|
body.standing = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window.dumpit)
|
|
||||||
{
|
|
||||||
console.group('slope');
|
|
||||||
console.log(s);
|
|
||||||
console.log('pos', res.pos.x, res.pos.y);
|
|
||||||
console.log('vel', body.vel.x, body.vel.y);
|
|
||||||
console.groupEnd();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// body.pos = res.pos;
|
|
||||||
|
|
||||||
body.pos.x = res.pos.x;
|
body.pos.x = res.pos.x;
|
||||||
body.pos.y = res.pos.y;
|
body.pos.y = res.pos.y;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,22 +1,24 @@
|
||||||
// Phaser.Physics.Impact.World
|
// Phaser.Physics.Impact.World
|
||||||
|
|
||||||
var Class = require('../../utils/Class');
|
|
||||||
var Set = require('../../structs/Set');
|
|
||||||
var Body = require('./Body');
|
var Body = require('./Body');
|
||||||
var Solver = require('./Solver');
|
var Class = require('../../utils/Class');
|
||||||
var CollisionMap = require('./CollisionMap');
|
|
||||||
var COLLIDES = require('./COLLIDES');
|
var COLLIDES = require('./COLLIDES');
|
||||||
|
var CollisionMap = require('./CollisionMap');
|
||||||
|
var Set = require('../../structs/Set');
|
||||||
|
var Solver = require('./Solver');
|
||||||
var TYPE = require('./TYPE');
|
var TYPE = require('./TYPE');
|
||||||
|
|
||||||
var World = new Class({
|
var World = new Class({
|
||||||
|
|
||||||
initialize:
|
initialize:
|
||||||
|
|
||||||
function World (gravity, cellSize)
|
function World (scene, gravity, cellSize)
|
||||||
{
|
{
|
||||||
if (gravity === undefined) { gravity = 0; }
|
if (gravity === undefined) { gravity = 0; }
|
||||||
if (cellSize === undefined) { cellSize = 64; }
|
if (cellSize === undefined) { cellSize = 64; }
|
||||||
|
|
||||||
|
this.scene = scene;
|
||||||
|
|
||||||
this.bodies = new Set();
|
this.bodies = new Set();
|
||||||
|
|
||||||
this.gravity = gravity;
|
this.gravity = gravity;
|
||||||
|
@ -52,22 +54,27 @@ var World = new Class({
|
||||||
|
|
||||||
// Update all bodies
|
// Update all bodies
|
||||||
|
|
||||||
this.bodies.iterate(function (body)
|
var i;
|
||||||
|
var bodies = this.bodies.entries;
|
||||||
|
var len = bodies.length;
|
||||||
|
var hash = {};
|
||||||
|
var size = this.cellSize;
|
||||||
|
|
||||||
|
// Update all active bodies
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
|
var body = bodies[i];
|
||||||
|
|
||||||
if (body.enabled)
|
if (body.enabled)
|
||||||
{
|
{
|
||||||
body.update(delta);
|
body.update(delta);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
// Run collision against them all
|
// Run collision against them all now they're in the new positions
|
||||||
|
|
||||||
var hash = {};
|
for (i = 0; i < len; i++)
|
||||||
var size = this.cellSize;
|
|
||||||
|
|
||||||
var bodies = this.bodies.entries;
|
|
||||||
|
|
||||||
for (var i = 0; i < bodies.length; i++)
|
|
||||||
{
|
{
|
||||||
var body = bodies[i];
|
var body = bodies[i];
|
||||||
|
|
||||||
|
@ -85,9 +92,8 @@ var World = new Class({
|
||||||
// Check the body against the spatial hash
|
// Check the body against the spatial hash
|
||||||
checkHash: function (body, hash, size)
|
checkHash: function (body, hash, size)
|
||||||
{
|
{
|
||||||
// console.log('checkHash');
|
|
||||||
|
|
||||||
var checked = {};
|
var checked = {};
|
||||||
|
|
||||||
var xmin = Math.floor(body.pos.x / size);
|
var xmin = Math.floor(body.pos.x / size);
|
||||||
var ymin = Math.floor(body.pos.y / size);
|
var ymin = Math.floor(body.pos.y / size);
|
||||||
var xmax = Math.floor((body.pos.x + body.size.x) / size) + 1;
|
var xmax = Math.floor((body.pos.x + body.size.x) / size) + 1;
|
||||||
|
|
|
@ -18,6 +18,7 @@ module.exports = {
|
||||||
COLLIDES: require('./COLLIDES'),
|
COLLIDES: require('./COLLIDES'),
|
||||||
CollisionMap: require('./CollisionMap'),
|
CollisionMap: require('./CollisionMap'),
|
||||||
TYPE: require('./TYPE'),
|
TYPE: require('./TYPE'),
|
||||||
World: require('./World')
|
World: require('./World'),
|
||||||
|
Factory: require('./Factory')
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue