微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Phaser 在关键事件期间因玩家未定义而引发错误

如何解决Phaser 在关键事件期间因玩家未定义而引发错误

config.js

var config = {
    width: 800,height: 600,type: Phaser.AUTO,physics: {
        default: "arcade",arcade: {
            gravity: { y: 200 },},scene: [EvoGame],};

var game = new Phaser.Game(config);

evogame.js

class EvoGame extends Phaser.Scene {
    constructor() {
        super("EvoGame");
    }

    preload() {
        this.load.image("Squittle","assets/squittle.png");
    }

    create() {
        let player = this.physics.add.image(400,300,"Squittle");
        player.setBounce(0.2);
        player.setCollideWorldBounds(true);

        this.input.keyboard.on(
            "keydown-D",function (player) {
                this.image.setVeLocityX += 10;
            },this
        );
    }

    update() {}
}

当我尝试使用 D 键移动图像时,出现错误

Uncaught TypeError: Cannot read property 'setVeLocityX' of undefined
    at EvoGame.<anonymous> (evogame.js:18)
    at Keyboardplugin.emit (phaser.js:1906)
    at Keyboardplugin.update (phaser.js:185828)
    at EventEmitter.emit (phaser.js:1905)
    at onKeyDown (phaser.js:92223)

我在 create() 中定义了播放器,如果我在没有 let、var 或 const 的情况下执行此操作,则它根本不会渲染播放器图像。我正在使用 Phaser 构建游戏,除此之外,它只是纯 html、css 和 javascript。

当我在 create() 函数中 console.log 播放器时,它显示一个 x = 400 的对象,这是我最初设置它的地方。我尝试使用 this.player.x 访问它,但它仍然显示未定义。

解决方法

我找到了解决方案。我不确定它最终是否会成为永久解决方案或以后会引起问题。我会把它贴在这里,以防万一有人想查看,或者如果其他人有类似的解决方案并想尝试一下。

基本上与这个块有关。

create() {
        let player = this.physics.add.image(400,300,"Squittle");
        player.setBounce(0.2);
        player.setCollideWorldBounds(true);

        this.input.keyboard.on(
            "keydown-D",function (player) {
                this.image.setVelocityX += 10;
            },this
        );

既然我在 player 变量中定义了图像,我应该一直在键盘事件函数中使用该变量。它也不需要使用“this”,而且我只需使用 player.x 就可以访问 x 属性。

新功能是:

create() {
        let player = this.physics.add.image(400,"Squittle");
        player.setBounce(0.2);
        player.setCollideWorldBounds(true);
        console.log(this.player);

        this.input.keyboard.on("keydown-D",function (event) {
            player.x += 10;
        });
    }

第二部分:将 'let player' 更改为 this.player 也允许在更新函数中使用 player 变量。 'let player' 和 'player.x' 最终成为我认为的临时解决方案,而 this.player 使其更易于访问。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。