mirror of
https://github.com/photonstorm/phaser
synced 2025-02-16 22:18:29 +00:00
Direct assignment of Body values, allows for sloped ground walking.
This commit is contained in:
parent
dbdb2a2026
commit
fbe508ab1b
8 changed files with 199 additions and 122 deletions
|
@ -58,6 +58,7 @@ Significant API changes:
|
|||
* Button.forceOut default value has changed from true to false, so Buttons will revert to an Up state (if set) when pressed and released.
|
||||
* The way the collision process callback works has changed significantly and now works as originally intended.
|
||||
* The World level quadtree is no longer created, they are now built and ripped down each time you collide a Group, this helps collision accuracy.
|
||||
* A SAT system has been integrated for Body collision and separation.
|
||||
* Bodies are no longer added to a world quadtree, so have had all of their quadtree properties removed such as skipQuadtree, quadTreeIndex, etc.
|
||||
* Body.drag has been removed. Please use the new Body.friction value instead (which is a number value, not a Point object)
|
||||
* Body.embedded and Body.wasTouching have been removed as they are no longer required.
|
||||
|
@ -195,6 +196,7 @@ Bug Fixes:
|
|||
* InputHandler.checkBoundsRect and checkBoundsSprite now take into account if the Sprite is fixedToCamera or not.
|
||||
* Removed the frame property from TileSprites as it cannot use them, it tiles the whole image only, not just a section of it.
|
||||
* Fixed WebGLRenderer updateGraphics bug (thanks theadam)
|
||||
* Removed duplicate Timer.create line (thanks hstolte)
|
||||
|
||||
|
||||
You can view the Change Log for all previous versions at https://github.com/photonstorm/phaser/changelog.md
|
||||
|
|
|
@ -62,6 +62,7 @@ function update() {
|
|||
|
||||
function render() {
|
||||
|
||||
game.debug.renderBodyInfo(car, 16, 24);
|
||||
// game.debug.renderBodyInfo(car, 16, 24);
|
||||
game.debug.renderBodyInfo(aliens.getFirstAlive(), 16, 24);
|
||||
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ function preload() {
|
|||
var sprite;
|
||||
var sprite2;
|
||||
var land;
|
||||
var cursors;
|
||||
|
||||
function create() {
|
||||
|
||||
|
@ -39,10 +40,13 @@ function create() {
|
|||
new SAT.Vector(780,100),
|
||||
new SAT.Vector(0,100),
|
||||
]);
|
||||
console.log(land);
|
||||
sprite.body.velocity.x = 100;
|
||||
|
||||
game.input.onDown.add(launch, this);
|
||||
console.log(land);
|
||||
|
||||
// sprite.body.velocity.x = 150;
|
||||
|
||||
cursors = game.input.keyboard.createCursorKeys();
|
||||
// game.input.onDown.add(launch, this);
|
||||
|
||||
}
|
||||
|
||||
|
@ -55,42 +59,26 @@ function launch() {
|
|||
|
||||
}
|
||||
|
||||
/*
|
||||
Tweening body scale test!
|
||||
|
||||
sprite = game.add.sprite(300, 300, 'gameboy', 0);
|
||||
sprite.name = 'red';
|
||||
sprite.body.collideWorldBounds = true;
|
||||
// sprite.body.checkCollision.right = false;
|
||||
sprite.body.bounce.setTo(1, 1);
|
||||
sprite.body.friction = 0;
|
||||
// sprite.scale.setTo(2, 2);
|
||||
|
||||
sprite2 = game.add.sprite(500, 300, 'gameboy', 2);
|
||||
sprite2.name = 'green';
|
||||
sprite2.body.collideWorldBounds = true;
|
||||
sprite2.body.bounce.setTo(1, 1);
|
||||
sprite2.body.friction = 0;
|
||||
|
||||
game.add.tween(sprite.scale).to({x: 3, y: 3}, 2000, Phaser.Easing.Linear.None, true, 0, 1000, true);
|
||||
// to: function (properties, duration, ease, autoStart, delay, repeat, yoyo) {
|
||||
|
||||
|
||||
*/
|
||||
|
||||
function update() {
|
||||
|
||||
// game.physics.collide(sprite, land);
|
||||
game.physics.collide(sprite, land);
|
||||
|
||||
if (sprite.body.overlap(land.body))
|
||||
{
|
||||
console.log('o', sprite.body.response);
|
||||
sprite.body.separate(land.body);
|
||||
}
|
||||
sprite.body.velocity.x = 0;
|
||||
// sprite.body.velocity.y = 0;
|
||||
|
||||
if (cursors.left.isDown)
|
||||
{
|
||||
sprite.body.velocity.x = -100;
|
||||
}
|
||||
else if (cursors.right.isDown)
|
||||
{
|
||||
sprite.body.velocity.x = 100;
|
||||
}
|
||||
|
||||
// game.physics.collide(sprite, sprite2);
|
||||
// game.physics.collide(sprite2, land);
|
||||
if (cursors.up.isDown)
|
||||
{
|
||||
sprite.body.velocity.y = -200;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -113,7 +101,7 @@ function render() {
|
|||
game.debug.renderPolygon(sprite2.body.polygons);
|
||||
}
|
||||
|
||||
game.debug.renderRectangle(land.body);
|
||||
// game.debug.renderRectangle(land.body);
|
||||
|
||||
|
||||
}
|
||||
|
|
55
examples/wip/tween-limit.js
Normal file
55
examples/wip/tween-limit.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
|
||||
var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render });
|
||||
|
||||
function preload() {
|
||||
|
||||
game.load.image('phaser', 'assets/sprites/phaser1.png');
|
||||
game.load.spritesheet('arrows', 'assets/sprites/arrows.png', 23, 31);
|
||||
|
||||
}
|
||||
|
||||
var arrowStart;
|
||||
var arrowEnd;
|
||||
var sprite;
|
||||
|
||||
function create() {
|
||||
|
||||
game.stage.backgroundColor = '#2384e7';
|
||||
|
||||
arrowStart = game.add.sprite(100, 100, 'arrows', 0);
|
||||
|
||||
arrowEnd = game.add.sprite(400, 100, 'arrows', 1);
|
||||
|
||||
sprite = game.add.sprite(100, 164, 'phaser');
|
||||
sprite.inputEnabled = true;
|
||||
|
||||
sprite.events.onInputDown.add(move, this);
|
||||
|
||||
}
|
||||
|
||||
function move() {
|
||||
|
||||
var tween = game.add.tween(sprite).to( { x: '+500' }, 3000, Phaser.Easing.Linear.None, true);
|
||||
|
||||
tween.onComplete.add(over, this);
|
||||
|
||||
}
|
||||
|
||||
function over() {
|
||||
console.log('done');
|
||||
sprite.alpha = 0.5;
|
||||
}
|
||||
|
||||
function update() {
|
||||
|
||||
if (sprite.x > 200)
|
||||
{
|
||||
sprite.x = 200;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function render() {
|
||||
|
||||
|
||||
}
|
38
examples/wip/world.js
Normal file
38
examples/wip/world.js
Normal file
|
@ -0,0 +1,38 @@
|
|||
|
||||
var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render });
|
||||
|
||||
function preload() {
|
||||
|
||||
game.load.spritesheet('gameboy', 'assets/sprites/gameboy_seize_color_40x60.png', 40, 60);
|
||||
|
||||
}
|
||||
|
||||
var sprite;
|
||||
|
||||
function create() {
|
||||
|
||||
game.stage.backgroundColor = '#124184';
|
||||
|
||||
game.physics.gravity.y = 200;
|
||||
|
||||
sprite = game.add.sprite(200, 250, 'gameboy', 4);
|
||||
sprite.name = 'green';
|
||||
// sprite.anchor.setTo(0.5, 0.5);
|
||||
|
||||
sprite.body.bounce.setTo(0.9, 0.9);
|
||||
sprite.body.velocity.x = 150;
|
||||
|
||||
}
|
||||
|
||||
function update() {
|
||||
|
||||
// sprite.worldTransform[2] += 1;
|
||||
|
||||
}
|
||||
|
||||
function render() {
|
||||
|
||||
game.debug.renderBodyInfo(sprite, 32, 32);
|
||||
game.debug.renderPolygon(sprite.body.polygons);
|
||||
|
||||
}
|
|
@ -263,7 +263,7 @@ Phaser.Particles.Arcade.Emitter.prototype.makeParticles = function (keys, frames
|
|||
var particle;
|
||||
var i = 0;
|
||||
var rndKey = keys;
|
||||
var rndFrame = 0;
|
||||
var rndFrame = frames;
|
||||
|
||||
while (i < quantity)
|
||||
{
|
||||
|
|
|
@ -341,6 +341,9 @@ Phaser.Physics.Arcade.Body = function (sprite) {
|
|||
*/
|
||||
this._distances = [0, 0, 0, 0];
|
||||
|
||||
this._x = 0;
|
||||
this._y = 0;
|
||||
|
||||
this._debug = 0;
|
||||
|
||||
};
|
||||
|
@ -401,8 +404,11 @@ Phaser.Physics.Arcade.Body.prototype = {
|
|||
this.screenX = (this.sprite.worldTransform[2] - (this.sprite.anchor.x * this.width)) + this.offset.x;
|
||||
this.screenY = (this.sprite.worldTransform[5] - (this.sprite.anchor.y * this.height)) + this.offset.y;
|
||||
|
||||
this._x = this.sprite.x;
|
||||
this._y = this.sprite.y;
|
||||
this.preX = (this.sprite.world.x - (this.sprite.anchor.x * this.width)) + this.offset.x;
|
||||
this.preY = (this.sprite.world.y - (this.sprite.anchor.y * this.height)) + this.offset.y;
|
||||
|
||||
this.preRotation = this.sprite.angle;
|
||||
|
||||
this.blocked.up = false;
|
||||
|
@ -447,66 +453,55 @@ Phaser.Physics.Arcade.Body.prototype = {
|
|||
*/
|
||||
checkWorldBounds: function () {
|
||||
|
||||
this.blockedPoint.setTo(0, 0);
|
||||
if (this.x <= this.game.world.bounds.x)
|
||||
{
|
||||
this.x += this.game.world.bounds.x - this.x;
|
||||
this.blocked.left = true;
|
||||
}
|
||||
else if (this.right >= this.game.world.bounds.right)
|
||||
{
|
||||
this.x -= this.right - this.game.world.bounds.right;
|
||||
this.blocked.right = true;
|
||||
}
|
||||
|
||||
if (this.y <= this.game.world.bounds.y)
|
||||
{
|
||||
this.y += this.game.world.bounds.y - this.y;
|
||||
this.blocked.up = true;
|
||||
}
|
||||
else if (this.bottom >= this.game.world.bounds.bottom)
|
||||
{
|
||||
this.y -= this.bottom - this.game.world.bounds.bottom;
|
||||
this.blocked.down = true;
|
||||
}
|
||||
|
||||
/*
|
||||
if (this.x <= this.game.world.bounds.x)
|
||||
{
|
||||
this.blockedPoint.x = this.game.world.bounds.x - this.x;
|
||||
this.blocked.left = true;
|
||||
this.touching.left = true;
|
||||
// console.log('cw left', this.blockedPoint.x);
|
||||
}
|
||||
else if (this.right >= this.game.world.bounds.right)
|
||||
{
|
||||
this.blockedPoint.x = this.right - this.game.world.bounds.right;
|
||||
this.blocked.right = true;
|
||||
this.touching.right = true;
|
||||
// console.log('cw right', this.blockedPoint.x);
|
||||
}
|
||||
|
||||
if (this.y <= this.game.world.bounds.y)
|
||||
{
|
||||
this.blockedPoint.y = this.game.world.bounds.y - this.y;
|
||||
this.blocked.up = true;
|
||||
this.touching.up = true;
|
||||
// console.log('cw up', this.blockedPoint.y);
|
||||
}
|
||||
else if (this.bottom >= this.game.world.bounds.bottom)
|
||||
{
|
||||
this.blockedPoint.y = this.bottom - this.game.world.bounds.bottom;
|
||||
this.blocked.down = true;
|
||||
this.touching.down = true;
|
||||
// console.log('cw down', this.blockedPoint.y);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Internal method used to check the Body against the World Bounds.
|
||||
*
|
||||
* @method Phaser.Physics.Arcade#adjustWorldBounds
|
||||
* @protected
|
||||
*/
|
||||
adjustWorldBounds: function () {
|
||||
|
||||
if (this.x < this.game.world.bounds.x)
|
||||
{
|
||||
this.x += this.game.world.bounds.x - this.x;
|
||||
this.preX += this.game.world.bounds.x - this.x;
|
||||
}
|
||||
else if (this.right > this.game.world.bounds.right)
|
||||
{
|
||||
this.x -= this.right - this.game.world.bounds.right;
|
||||
this.preX -= this.right - this.game.world.bounds.right;
|
||||
}
|
||||
|
||||
if (this.y < this.game.world.bounds.y)
|
||||
{
|
||||
this.y += this.game.world.bounds.y - this.y;
|
||||
this.preY += this.game.world.bounds.y - this.y;
|
||||
}
|
||||
else if (this.bottom > this.game.world.bounds.bottom)
|
||||
{
|
||||
this.y -= this.bottom - this.game.world.bounds.bottom;
|
||||
this.preY -= this.bottom - this.game.world.bounds.bottom;
|
||||
}
|
||||
|
||||
*/
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -532,46 +527,41 @@ Phaser.Physics.Arcade.Body.prototype = {
|
|||
this.velocity.y = Math.sin(this.angle) * this.speed;
|
||||
}
|
||||
|
||||
// overlapX/Y values at this point will be penetration into the bounds and DELTA WILL BE ZERO
|
||||
if (this.blocked.left && this.blockedPoint.x > 0)
|
||||
if (this.blocked.left)
|
||||
{
|
||||
// Separate
|
||||
this.x += this.blockedPoint.x;
|
||||
this.velocity.x *= -this.bounce.x;
|
||||
this.reboundCheck(true, false);
|
||||
|
||||
this._dx = this.game.time.physicsElapsed * (this.velocity.x + this.motionVelocity.x / 2);
|
||||
|
||||
// if (this._dx > this.minBounceVelocity || this.getTotalGravityX() > 0)
|
||||
// {
|
||||
if (this._dx > this.minBounceVelocity || this.getTotalGravityX() > 0)
|
||||
{
|
||||
this.x += this._dx;
|
||||
this.velocity.x += this.motionVelocity.x;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// this.preX = this.x;
|
||||
// this.velocity.x = 0;
|
||||
// }
|
||||
}
|
||||
else
|
||||
{
|
||||
this.preX = this.x;
|
||||
this.velocity.x = 0;
|
||||
}
|
||||
}
|
||||
else if (this.blocked.right && this.blockedPoint.x > 0)
|
||||
else if (this.blocked.right)
|
||||
{
|
||||
// Separate
|
||||
this.x -= this.blockedPoint.x;
|
||||
this.velocity.x *= -this.bounce.x;
|
||||
this.reboundCheck(true, false);
|
||||
|
||||
this._dx = this.game.time.physicsElapsed * (this.velocity.x + this.motionVelocity.x / 2);
|
||||
|
||||
// if (this._dx < -this.minBounceVelocity || this.getTotalGravityX() < 0)
|
||||
// {
|
||||
if (this._dx < -this.minBounceVelocity || this.getTotalGravityX() < 0)
|
||||
{
|
||||
this.x += this._dx;
|
||||
this.velocity.x += this.motionVelocity.x;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// this.preX = this.x;
|
||||
// this.velocity.x = 0;
|
||||
// }
|
||||
}
|
||||
else
|
||||
{
|
||||
this.preX = this.x;
|
||||
this.velocity.x = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -580,45 +570,41 @@ Phaser.Physics.Arcade.Body.prototype = {
|
|||
}
|
||||
|
||||
// overlapX/Y values at this point will be penetration into the bounds and DELTA WILL BE ZERO
|
||||
if (this.blocked.up && this.blockedPoint.y > 0)
|
||||
if (this.blocked.up)
|
||||
{
|
||||
// Separate
|
||||
this.y += this.blockedPoint.y;
|
||||
this.velocity.y *= -this.bounce.y;
|
||||
this.reboundCheck(false, true);
|
||||
|
||||
this._dy = this.game.time.physicsElapsed * (this.velocity.y + this.motionVelocity.y / 2);
|
||||
|
||||
// if (this._dy > this.minBounceVelocity || this.getTotalGravityY() > 0)
|
||||
// {
|
||||
if (this._dy > this.minBounceVelocity || this.getTotalGravityY() > 0)
|
||||
{
|
||||
this.y += this._dy;
|
||||
this.velocity.y += this.motionVelocity.y;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// this.preY = this.y;
|
||||
// this.velocity.y = 0;
|
||||
// }
|
||||
}
|
||||
else
|
||||
{
|
||||
this.preY = this.y;
|
||||
this.velocity.y = 0;
|
||||
}
|
||||
}
|
||||
else if (this.blocked.down && this.blockedPoint.y > 0)
|
||||
else if (this.blocked.down)
|
||||
{
|
||||
// Separate
|
||||
this.y -= this.blockedPoint.y;
|
||||
this.velocity.y *= -this.bounce.y;
|
||||
this.reboundCheck(false, true);
|
||||
|
||||
this._dy = this.game.time.physicsElapsed * (this.velocity.y + this.motionVelocity.y / 2);
|
||||
|
||||
// if (this._dy < -this.minBounceVelocity || this.getTotalGravityY() < 0)
|
||||
// {
|
||||
if (this._dy < -this.minBounceVelocity || this.getTotalGravityY() < 0)
|
||||
{
|
||||
this.y += this._dy;
|
||||
this.velocity.y += this.motionVelocity.y;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// this.preY = this.y;
|
||||
// this.velocity.y = 0;
|
||||
// }
|
||||
}
|
||||
else
|
||||
{
|
||||
this.preY = this.y;
|
||||
this.velocity.y = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1205,7 +1191,9 @@ Phaser.Physics.Arcade.Body.prototype = {
|
|||
|
||||
if (this.moves)
|
||||
{
|
||||
this.adjustWorldBounds();
|
||||
this.checkWorldBounds();
|
||||
|
||||
this.syncPosition();
|
||||
|
||||
if (this.deltaX() < 0)
|
||||
{
|
||||
|
@ -1225,6 +1213,10 @@ Phaser.Physics.Arcade.Body.prototype = {
|
|||
this.facing = Phaser.DOWN;
|
||||
}
|
||||
|
||||
this.sprite.x = this.sprite.worldTransform[2] = this.x - (this.preX - this._x);
|
||||
this.sprite.y = this.sprite.worldTransform[5] = this.y - (this.preY - this._y);
|
||||
|
||||
/*
|
||||
if ((this.deltaX() < 0 && !this.blocked.left) || (this.deltaX() > 0 && !this.blocked.right))
|
||||
{
|
||||
this.sprite.x += this.deltaX();
|
||||
|
@ -1236,7 +1228,7 @@ Phaser.Physics.Arcade.Body.prototype = {
|
|||
this.sprite.y += this.deltaY();
|
||||
this.sprite.worldTransform[5] += this.deltaY();
|
||||
}
|
||||
|
||||
*/
|
||||
this.center.setTo(this.x + this.halfWidth, this.y + this.halfHeight);
|
||||
|
||||
if (this.allowRotation)
|
||||
|
|
|
@ -455,6 +455,7 @@ Phaser.Utils.Debug.prototype = {
|
|||
this.start(x, y, color, 220);
|
||||
|
||||
this.splitline('x: ' + sprite.body.x.toFixed(2), 'y: ' + sprite.body.y.toFixed(2), 'width: ' + sprite.width, 'height: ' + sprite.height);
|
||||
this.splitline('_x: ' + sprite.body._x.toFixed(2), '_y: ' + sprite.body._y.toFixed(2), 'wx: ' + sprite.worldTransform[2].toFixed(2), 'wy: ' + sprite.worldTransform[5].toFixed(2));
|
||||
this.splitline('speed: ' + sprite.body.speed.toFixed(2), 'angle: ' + sprite.body.angle.toFixed(2), 'friction: ' + sprite.body.friction);
|
||||
this.splitline('blocked left: ' + sprite.body.blocked.left, 'right: ' + sprite.body.blocked.right, 'up: ' + sprite.body.blocked.up, 'down: ' + sprite.body.blocked.down);
|
||||
this.splitline('touching left: ' + sprite.body.touching.left, 'right: ' + sprite.body.touching.right, 'up: ' + sprite.body.touching.up, 'down: ' + sprite.body.touching.down);
|
||||
|
|
Loading…
Add table
Reference in a new issue