Как заставить два неподвижных объекта столкнуться и просто остановиться?

Я много часов искал в Интернете ответ, но, похоже, никто не делал таких движений, как я. Я только начал свое путешествие по Фазеру и довольно рано застрял. Я хочу, чтобы в моей игре движение было привязано к игроку в центре, а все остальное двигалось вокруг него. Однако когда я пытался добавить здание, игрока выталкивало из середины.

Я пробовал установить для обоих спрайтов неподвижность или .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;
    }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Простое решение — настроить камеру так, чтобы она следовала за игроком, с помощью функции 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>

НАСТОЯЩАЯ НАХОДКА! Не могу поверить, что потратил столько часов на кодирование функции слежения за камерой, когда она уже существует. Я злюсь и счастлив. Большое спасибо. Можно ли как-нибудь узнать все о фазере? Я смотрел часы уроков и никогда не сталкивался с этим. Вероятно, есть еще много чего, на чем я мог бы сэкономить время. Еще раз спасибо!

LeftClickMage 28.06.2024 06:24

Кстати: бесплатная официальная электронная книга вышла некоторое время назад, но я не знаю, насколько она хороша. P.s.: Вы также можете проверить фазерный дискурс и/или дискорд, там вы иногда даже можете взаимодействовать с разработчиками фазера. :)

winner_joiner 28.06.2024 06:45

Другие вопросы по теме