Great new thrust ship example added for ScrollZones. Also added rotationOffset value to GameObject base class.

This commit is contained in:
Richard Davey 2013-04-23 21:27:45 +01:00
parent 00fb20f8c2
commit 6466361f5f
10 changed files with 129 additions and 24 deletions

View file

@ -79,6 +79,11 @@ module Phaser {
*/
public velocityFromAngle(angle: number, speed: number): Point {
if (isNaN(speed))
{
speed = 0;
}
var a: number = this._game.math.degreesToRadians(angle);
return new Point((Math.cos(a) * speed), (Math.sin(a) * speed));

View file

@ -76,6 +76,11 @@ module Phaser {
public origin: MicroPoint;
public z: number = 0;
// This value is added to the angle of the GameObject.
// For example if you had a sprite drawn facing straight up then you could set
// rotationOffset to 90 and it would correspond correctly with Phasers rotation system
public rotationOffset: number = 0;
// Physics properties
public immovable: bool;

View file

@ -224,14 +224,14 @@ module Phaser {
}
// Rotation - needs to work from origin point really, but for now from center
if (this.angle !== 0 || this.flipped == true)
if (this.angle !== 0 || this.rotationOffset !== 0 || this.flipped == true)
{
this._game.stage.context.save();
this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2));
if (this.angle !== 0)
if (this.angle !== 0 || this.rotationOffset !== 0)
{
this._game.stage.context.rotate(this.angle * (Math.PI / 180));
this._game.stage.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180));
}
this._dx = -(this._dw / 2);

View file

@ -3,7 +3,7 @@ Phaser
Version 0.9.3
21st April 2013
23rd April 2013
By Richard Davey, [Photon Storm](http://www.photonstorm.com)
@ -25,9 +25,9 @@ V0.9.3
* Re-built Tilemap handling from scratch to allow for proper layered maps (as exported from Tiled / Mappy)
* Tilemap no longer requires a buffer per Camera (in prep for WebGL support)
* Added shiftSinTable and shiftCosTable to the GameMath class to allow for quick iteration through the data tables.
* Added the new ScrollZone game object. Endlessly useful but especially for scrolling backdrops. Created several example tests.
* Added the new ScrollZone game object. Endlessly useful but especially for scrolling backdrops. Created 6 example tests.
* Removed the need for DynamicTextures to require a key property and updated test cases.
* Add the rotationOffset value to GameObject (and thus Sprite). Useful if your graphics need to rotate but don't weren't drawn facing zero degrees (to the right).
V0.9.2

View file

@ -467,6 +467,10 @@ var Phaser;
_super.call(this, game);
this._angle = 0;
this.z = 0;
// This value is added to the angle of the GameObject.
// For example if you had a sprite drawn facing straight up then you could set
// rotationOffset to 90 and it would correspond correctly with Phasers rotation system
this.rotationOffset = 0;
this.moves = true;
// Input
this.inputEnabled = false;
@ -1541,11 +1545,11 @@ var Phaser;
this._dy -= (camera.worldView.y * this.scrollFactor.y);
}
// Rotation - needs to work from origin point really, but for now from center
if(this.angle !== 0 || this.flipped == true) {
if(this.angle !== 0 || this.rotationOffset !== 0 || this.flipped == true) {
this._game.stage.context.save();
this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2));
if(this.angle !== 0) {
this._game.stage.context.rotate(this.angle * (Math.PI / 180));
if(this.angle !== 0 || this.rotationOffset !== 0) {
this._game.stage.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180));
}
this._dx = -(this._dw / 2);
this._dy = -(this._dh / 2);
@ -6983,6 +6987,9 @@ var Phaser;
* @return A Point where Point.x contains the velocity x value and Point.y contains the velocity y value
*/
function (angle, speed) {
if(isNaN(speed)) {
speed = 0;
}
var a = this._game.math.degreesToRadians(angle);
return new Phaser.Point((Math.cos(a) * speed), (Math.sin(a) * speed));
};

View file

@ -8,6 +8,7 @@
}
function create() {
var zone = myGame.createScrollZone('starray');
// Hide the default region (the full image)
zone.currentRegion.visible = false;
var y = 0;
var speed = 16;

View file

@ -17,6 +17,7 @@
var zone: Phaser.ScrollZone = myGame.createScrollZone('starray');
// Hide the default region (the full image)
zone.currentRegion.visible = false;
var y:number = 0;

View file

@ -3,19 +3,49 @@
(function () {
var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update);
function init() {
myGame.loader.addImageFile('nashwan', 'assets/sprites/xenon2_ship.png');
myGame.loader.addImageFile('starfield', 'assets/misc/starfield.jpg');
myGame.loader.addImageFile('jet', 'assets/sprites/jets.png');
myGame.loader.load();
}
var scroller;
var emitter;
var ship;
var speed = 0;
function create() {
// 512 x 512
scroller = myGame.createScrollZone('starfield', 0, 0, 1024, 512);
// Some sin/cos data for the movement
myGame.math.sinCosGenerator(256, 4, 4, 2);
scroller = myGame.createScrollZone('starfield', 0, 0, 1024, 1024);
emitter = myGame.createEmitter(myGame.stage.centerX + 16, myGame.stage.centerY + 12);
emitter.makeParticles('jet', 250, 0, false, 0);
//emitter.lifespan
ship = myGame.createSprite(myGame.stage.centerX, myGame.stage.centerY, 'nashwan');
// We do this because the ship was drawn facing up, but 0 degrees is pointing to the right
ship.rotationOffset = 90;
}
function update() {
scroller.currentRegion.scrollSpeed.x = myGame.math.shiftSinTable();
scroller.currentRegion.scrollSpeed.y = myGame.math.shiftCosTable();
ship.angularVelocity = 0;
if(myGame.input.keyboard.isDown(Phaser.Keyboard.LEFT)) {
ship.angularVelocity = -200;
} else if(myGame.input.keyboard.isDown(Phaser.Keyboard.RIGHT)) {
ship.angularVelocity = 200;
}
if(myGame.input.keyboard.isDown(Phaser.Keyboard.UP)) {
speed += 0.1;
if(speed > 10) {
speed = 10;
}
} else {
speed -= 0.1;
if(speed < 0) {
speed = 0;
}
}
var motion = myGame.motion.velocityFromAngle(ship.angle, speed);
scroller.setSpeed(motion.x, motion.y);
// emit particles
if(speed > 2) {
emitter.setXSpeed(-(motion.x * 20), -(motion.x * 30));
emitter.setYSpeed(-(motion.y * 20), -(motion.y * 30));
emitter.emitParticle();
}
}
})();

View file

@ -7,29 +7,78 @@
function init() {
myGame.loader.addImageFile('nashwan', 'assets/sprites/xenon2_ship.png');
myGame.loader.addImageFile('starfield', 'assets/misc/starfield.jpg');
myGame.loader.addImageFile('jet', 'assets/sprites/jets.png');
myGame.loader.load();
}
var scroller: Phaser.ScrollZone;
var emitter: Phaser.Emitter;
var ship: Phaser.Sprite;
var speed: number = 0;
function create() {
// 512 x 512
scroller = myGame.createScrollZone('starfield', 0, 0, 1024, 512);
scroller = myGame.createScrollZone('starfield', 0, 0, 1024, 1024);
// Some sin/cos data for the movement
myGame.math.sinCosGenerator(256, 4, 4, 2);
emitter = myGame.createEmitter(myGame.stage.centerX + 16, myGame.stage.centerY + 12);
emitter.makeParticles('jet', 250, 0, false, 0);
//emitter.lifespan
ship = myGame.createSprite(myGame.stage.centerX, myGame.stage.centerY, 'nashwan');
// We do this because the ship was drawn facing up, but 0 degrees is pointing to the right
ship.rotationOffset = 90;
}
function update() {
scroller.currentRegion.scrollSpeed.x = myGame.math.shiftSinTable();
scroller.currentRegion.scrollSpeed.y = myGame.math.shiftCosTable();
ship.angularVelocity = 0;
if (myGame.input.keyboard.isDown(Phaser.Keyboard.LEFT))
{
ship.angularVelocity = -200;
}
else if (myGame.input.keyboard.isDown(Phaser.Keyboard.RIGHT))
{
ship.angularVelocity = 200;
}
if (myGame.input.keyboard.isDown(Phaser.Keyboard.UP))
{
speed += 0.1;
if (speed > 10)
{
speed = 10;
}
}
else
{
speed -= 0.1;
if (speed < 0) {
speed = 0;
}
}
var motion:Phaser.Point = myGame.motion.velocityFromAngle(ship.angle, speed);
scroller.setSpeed(motion.x, motion.y);
// emit particles
if (speed > 2)
{
emitter.setXSpeed(-(motion.x * 20), -(motion.x * 30));
emitter.setYSpeed(-(motion.y * 20), -(motion.y * 30));
emitter.emitParticle();
}
}

View file

@ -467,6 +467,10 @@ var Phaser;
_super.call(this, game);
this._angle = 0;
this.z = 0;
// This value is added to the angle of the GameObject.
// For example if you had a sprite drawn facing straight up then you could set
// rotationOffset to 90 and it would correspond correctly with Phasers rotation system
this.rotationOffset = 0;
this.moves = true;
// Input
this.inputEnabled = false;
@ -1541,11 +1545,11 @@ var Phaser;
this._dy -= (camera.worldView.y * this.scrollFactor.y);
}
// Rotation - needs to work from origin point really, but for now from center
if(this.angle !== 0 || this.flipped == true) {
if(this.angle !== 0 || this.rotationOffset !== 0 || this.flipped == true) {
this._game.stage.context.save();
this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2));
if(this.angle !== 0) {
this._game.stage.context.rotate(this.angle * (Math.PI / 180));
if(this.angle !== 0 || this.rotationOffset !== 0) {
this._game.stage.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180));
}
this._dx = -(this._dw / 2);
this._dy = -(this._dh / 2);
@ -6983,6 +6987,9 @@ var Phaser;
* @return A Point where Point.x contains the velocity x value and Point.y contains the velocity y value
*/
function (angle, speed) {
if(isNaN(speed)) {
speed = 0;
}
var a = this._game.math.degreesToRadians(angle);
return new Phaser.Point((Math.cos(a) * speed), (Math.sin(a) * speed));
};