Javascript 是否可以将移相器物理应用于TileSprite';什么是滚动位置?
我正在尝试制作一个游戏,玩家的精灵固定在屏幕中央,背景向与玩家方向相反的方向移动(滚动),因此它会产生玩家移动的效果 我从以下示例开始:(用于背景滚动)和(用于精灵移动)。前者使用及其Javascript 是否可以将移相器物理应用于TileSprite';什么是滚动位置?,javascript,game-engine,phaser-framework,Javascript,Game Engine,Phaser Framework,我正在尝试制作一个游戏,玩家的精灵固定在屏幕中央,背景向与玩家方向相反的方向移动(滚动),因此它会产生玩家移动的效果 我从以下示例开始:(用于背景滚动)和(用于精灵移动)。前者使用及其tilePosition属性对背景进行垂直滚动。这适用于固定方向(垂直或水平)的线性滚动。但在我的情况下,我需要实现任何方向的滚动(即移动)。此外,我需要诸如加速度和阻力之类的物理特性,就像小行星的例子一样。所以我想把街机物理应用到TileSprite上。但似乎Arcade物理不适用于TileSprite。或者,更
tilePosition
属性对背景进行垂直滚动。这适用于固定方向(垂直或水平)的线性滚动。但在我的情况下,我需要实现任何方向的滚动(即移动)。此外,我需要诸如加速度和阻力之类的物理特性,就像小行星的例子一样。所以我想把街机物理应用到TileSprite上。但似乎Arcade物理不适用于TileSprite。或者,更准确地说,它没有像我预期的那样工作
我尝试为TileSprite启用街机物理,因为它与精灵一起使用。代码如下:
function preload() {
game.load.baseURL = 'http://examples.phaser.io/assets/';
game.load.crossOrigin = 'anonymous';
game.load.image('ship', 'games/invaders/player.png');
game.load.image('starfield', 'games/invaders/starfield.png');
}
var player;
var cursors;
var starfield;
var playerAngle = 0; // angle of the player's movement, in degrees
var playerSpeed = 5; // the player's speed, px per frame
function create() {
game.physics.startSystem(Phaser.Physics.ARCADE);
// The scrolling starfield background
starfield = game.add.tileSprite(0, 0, 800, 600, 'starfield');
game.physics.enable(starfield, Phaser.Physics.ARCADE);
starfield.body.velocity.set(200);
// The player sprite
player = game.add.sprite(400, 300, 'ship');
player.anchor.setTo(0.5, 0.5);
// Gameplay controls
cursors = game.input.keyboard.createCursorKeys();
}
function update() {
// Scroll the background
var delta = 0;
if (cursors.left.isDown)
delta = -1;
else if (cursors.right.isDown)
delta = 1;
if (delta)
player.angle = playerAngle = (playerAngle + delta + 360) % 360;
var a = (playerAngle + 90) / 360 * 2 * Math.PI; // angle of the background movement/scrolling, in radians
// move the background by playerSpeed along the a angle
game.physics.arcade.velocityFromRotation(a, 200, starfield.body.velocity);
}
function preload() {
game.load.baseURL = 'http://examples.phaser.io/assets/';
game.load.crossOrigin = 'anonymous';
game.load.image('ship', 'games/invaders/player.png');
game.load.image('starfield', 'games/invaders/starfield.png');
}
var player;
var cursors;
var starfield;
var playerAngle = 0; // angle of the player's movement, in degrees
var playerSpeed = 5; // the player's speed, px per frame
function create() {
game.physics.startSystem(Phaser.Physics.ARCADE);
// The scrolling starfield background
starfield = game.add.tileSprite(0, 0, 800, 600, 'starfield');
// The player sprite
player = game.add.sprite(400, 300, 'ship');
player.anchor.setTo(0.5, 0.5);
// Gameplay controls
cursors = game.input.keyboard.createCursorKeys();
}
function update() {
// Scroll the background
var delta = 0;
if (cursors.left.isDown)
delta = -1;
else if (cursors.right.isDown)
delta = 1;
if (delta)
player.angle = playerAngle = (playerAngle + delta + 360) % 360;
var a = (playerAngle + 90) / 360 * 2 * Math.PI; // angle of the background movement/scrolling, in radians
// move the background by playerSpeed along the a angle
starfield.tilePosition.x += playerSpeed * Math.cos(a);
starfield.tilePosition.y += playerSpeed * Math.sin(a);
}
不幸的是,这段代码没有像我预期的那样工作
据我所知,如中所述,Arcade Physics仅适用于Sprite
,而不是TileSprite
或任何其他游戏对象。如果是这样的话,这意味着我必须手动重现所有的物理特性,比如加速度和拖动我自己相对于TileSprite
。我写过简单的TileSprite
匀速运动(没有加速度、阻力和其他东西)。代码如下:
function preload() {
game.load.baseURL = 'http://examples.phaser.io/assets/';
game.load.crossOrigin = 'anonymous';
game.load.image('ship', 'games/invaders/player.png');
game.load.image('starfield', 'games/invaders/starfield.png');
}
var player;
var cursors;
var starfield;
var playerAngle = 0; // angle of the player's movement, in degrees
var playerSpeed = 5; // the player's speed, px per frame
function create() {
game.physics.startSystem(Phaser.Physics.ARCADE);
// The scrolling starfield background
starfield = game.add.tileSprite(0, 0, 800, 600, 'starfield');
game.physics.enable(starfield, Phaser.Physics.ARCADE);
starfield.body.velocity.set(200);
// The player sprite
player = game.add.sprite(400, 300, 'ship');
player.anchor.setTo(0.5, 0.5);
// Gameplay controls
cursors = game.input.keyboard.createCursorKeys();
}
function update() {
// Scroll the background
var delta = 0;
if (cursors.left.isDown)
delta = -1;
else if (cursors.right.isDown)
delta = 1;
if (delta)
player.angle = playerAngle = (playerAngle + delta + 360) % 360;
var a = (playerAngle + 90) / 360 * 2 * Math.PI; // angle of the background movement/scrolling, in radians
// move the background by playerSpeed along the a angle
game.physics.arcade.velocityFromRotation(a, 200, starfield.body.velocity);
}
function preload() {
game.load.baseURL = 'http://examples.phaser.io/assets/';
game.load.crossOrigin = 'anonymous';
game.load.image('ship', 'games/invaders/player.png');
game.load.image('starfield', 'games/invaders/starfield.png');
}
var player;
var cursors;
var starfield;
var playerAngle = 0; // angle of the player's movement, in degrees
var playerSpeed = 5; // the player's speed, px per frame
function create() {
game.physics.startSystem(Phaser.Physics.ARCADE);
// The scrolling starfield background
starfield = game.add.tileSprite(0, 0, 800, 600, 'starfield');
// The player sprite
player = game.add.sprite(400, 300, 'ship');
player.anchor.setTo(0.5, 0.5);
// Gameplay controls
cursors = game.input.keyboard.createCursorKeys();
}
function update() {
// Scroll the background
var delta = 0;
if (cursors.left.isDown)
delta = -1;
else if (cursors.right.isDown)
delta = 1;
if (delta)
player.angle = playerAngle = (playerAngle + delta + 360) % 360;
var a = (playerAngle + 90) / 360 * 2 * Math.PI; // angle of the background movement/scrolling, in radians
// move the background by playerSpeed along the a angle
starfield.tilePosition.x += playerSpeed * Math.cos(a);
starfield.tilePosition.y += playerSpeed * Math.sin(a);
}
当然,这是可行的,然而,即使像线性运动这样简单的事情也需要一些数学知识。其他事情需要更多的数学和物理知识。我不想手动实现这些事情
那么,有没有办法将移相器物理与
tilePosition
结合使用呢 我的建议是重新考虑整件事。主要的想法是不是使玩家精灵固定,而是使其在启用物理的情况下“动态”。为了达到你想要的效果,只需让相机跟随玩家精灵(没有死区)。这样,玩家就可以保持在中间位置,并以经典的方式管理tilesprite。谢谢您的建议。尽管附带一些代码会很好。@最后面的部分,您可能想看看phaser站点上的摄像头示例。@Konrad“Zegis”我已经看过该示例以及其他类似示例:。关键是没有一个相机例子使用角运动,所以“照原样”它们对我来说是无用的。你真的试过根据我的需要修改这个例子吗?我很明显,这是行不通的。所以这个答案对我来说也没用。