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”我已经看过该示例以及其他类似示例:。关键是没有一个相机例子使用角运动,所以“照原样”它们对我来说是无用的。你真的试过根据我的需要修改这个例子吗?我很明显,这是行不通的。所以这个答案对我来说也没用。