Я много часов искал в Интернете ответ, но, похоже, никто не делал таких движений, как я. Я только начал свое путешествие по Фазеру и довольно рано застрял. Я хочу, чтобы в моей игре движение было привязано к игроку в центре, а все остальное двигалось вокруг него. Однако когда я пытался добавить здание, игрока выталкивало из середины.
Я пробовал установить для обоих спрайтов неподвижность или .body.moves = false
, но в итоге два спрайта просто проходят друг через друга. Я также пытался зафиксировать плеер по центру, но безуспешно. Если есть лучший способ перемещения игрока, дайте мне знать, но пока я не могу этого понять.
КОД:
class greenearth extends Phaser.Scene {
constructor() {
super("startGame");
}
create() {
this.playerCanMove = true;
this.keyA = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.A);
this.keyS = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.S);
this.keyD = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.D);
this.keyW = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.W);
this.background = this.add.tileSprite(0, 0, config.width, config.height, "background").setScale(2);
this.background.setOrigin(0, 0);
this.house = this.physics.add.sprite(200, 300, "house").setScale(1);
this.house.setImmovable(true);
this.player = this.physics.add.sprite(config.width / 2, config.height / 2, "player").setScale(4);
this.player.play("idle");
this.physics.add.collider(this.player, this.house);
}
playerMovement(delta) {
this.playerStopped();
if (this.keyA.isDown) {
this.playerMovedLeft(player.speed, delta);
} else if (this.keyD.isDown) {
this.playerMovedRight(player.speed, delta);
}
if (this.keyW.isDown) {
this.playerMovedUp(player.speed, delta);
} else if (this.keyS.isDown) {
this.playerMovedDown(player.speed, delta);
}
this.player.body.velocity.normalize().scale(player.speed);
if (this.keyA.isDown) {
this.player.play("walkLeft", true);
} else if (this.keyD.isDown) {
this.player.play("walkRight", true);
} else if (this.keyW.isDown) {
this.player.play("walkUp", true);
} else if (this.keyS.isDown) {
this.player.play("walkDown", true);
} else {
this.player.play("idle", true);
}
}
playerMovedLeft(speed, delta) {
let speedCorrection = (1000 / 60) / delta;
this.house.setVelocityX(player.speed * speedCorrection);
this.background.tilePositionX -= this.house.body.velocity.x / 120;
}
playerMovedRight(speed, delta) {
let speedCorrection = (1000 / 60) / delta;
this.house.setVelocityX(-player.speed * speedCorrection);
this.background.tilePositionX -= this.house.body.velocity.x / 120;
}
playerMovedUp(speed, delta) {
let speedCorrection = (1000 / 60) / delta;
this.house.setVelocityY(player.speed * speedCorrection);
this.background.tilePositionY -= this.house.body.velocity.y / 120;
}
playerMovedDown(speed, delta) {
let speedCorrection = (1000 / 60) / delta;
this.house.setVelocityY(-player.speed * speedCorrection);
this.background.tilePositionY -= this.house.body.velocity.y / 120;
}
playerStopped() {
this.house.setVelocityX(0);
this.house.setVelocityY(0);
}
update(time, delta) {
this.playerMovement(delta);
// this.player.x = config.width/2;
// this.player.y = config.height/2;
}
}
Простое решение — настроить камеру так, чтобы она следовала за игроком, с помощью функции startFollow
.
(ссылка на документацию)
Вот короткая демонстрация, демонстрирующая это:
document.body.style = 'margin:0;';
var config = {
width: 536,
height: 183,
physics: {
default: 'arcade',
arcade: {
debug: true
}
},
scene: { create },
};
function create () {
this.add.text(10, 10, 'Camera set to follow the player')
.setScale(1.5)
.setOrigin(0)
.setStyle({fontStyle: 'bold', fontFamily: 'Arial'});
let graphics = this.make.graphics();
graphics.fillStyle(0xffffff);
graphics.fillRect(0, 0, 10, 10);
graphics.generateTexture('img', 10, 10);
graphics.fillStyle(0xff0000);
graphics.fillRect(0, 0, 20, 20);
graphics.generateTexture('obj', 20, 20);
this.cursors = this.input.keyboard.createCursorKeys();
this.player = this.physics.add.image(150, 90, 'img');
this.player.setCollideWorldBounds(true);
this.player.setImmovable(true)
let testHouse = this.physics.add.image(200, 90, 'obj');
testHouse.setVelocity(-150, 0);
this.physics.add.collider(this.player, testHouse);
this.cameras.main.startFollow(this.player);
}
new Phaser.Game(config);
console.clear();
<script src = "//cdn.jsdelivr.net/npm/phaser/dist/phaser.min.js"></script>
Что ж, мой первый совет — просмотреть официальные примеры фазеров , если у вас есть время, просмотрите некоторые из них или, если вы ищете что-то конкретное, просто воспользуйтесь поиском. Здесь показано большинство возможностей и функций (не перестаю удивляться тому, что я там могу найти). Но также может помочь официальная документация и неофициальный сборник HowTo. Надеюсь, это облегчит ваше путешествие.
Кстати: бесплатная официальная электронная книга вышла некоторое время назад, но я не знаю, насколько она хороша. P.s.: Вы также можете проверить фазерный дискурс и/или дискорд, там вы иногда даже можете взаимодействовать с разработчиками фазера. :)
НАСТОЯЩАЯ НАХОДКА! Не могу поверить, что потратил столько часов на кодирование функции слежения за камерой, когда она уже существует. Я злюсь и счастлив. Большое спасибо. Можно ли как-нибудь узнать все о фазере? Я смотрел часы уроков и никогда не сталкивался с этим. Вероятно, есть еще много чего, на чем я мог бы сэкономить время. Еще раз спасибо!