如何在Phaser 3中将Sprite的X和Y位置用于“翻转”物理?

我正在使用Phaser 3(特别是物质物理引擎)进行游戏。我正在尝试遵循有关跳跃物理学https://www.emanueleferonato.com/2019/03/08/fling-unity-game-built-in-html5-with-phaser-and-matter-js-updated-with-the-latest-constraints-tweaks-fly-through-the-screen-with-your-ninja-rope/

的教程
let game;
let gameOptions = {
    gravity: 1,constraintSpeed: 2,hookSpeed: 20,ropeTolerance: 6
};
const BALL = 1;
const HOOK = 2;

window.onload = function() {

    let gameConfig = {
        type: Phaser.AUTO,scale: {
            mode: Phaser.Scale.FIT,autoCenter: Phaser.Scale.CENTER_BOTH,parent: "thegame",width: 1200,height: 750
        },scene: playGame,physics: {
            default: "matter",matter: {
                gravity: {
                    y: gameOptions.gravity
                },debug: true
            }
        }
    }
    game = new Phaser.Game(gameConfig);
    window.focus();
};
class playGame extends Phaser.Scene{
    constructor(){
        super("PlayGame");
    }
    preload() {
        //Load background image
        this.load.image('background','images/background.png');

        this.load.atlas('sheet','assets/spiderTP.png','assets/spiderTP.json');
        this.load.json('shapes','assets/spritesPE.json');
    }
    create() {
        //Place background image
        let background = this.add.image(600,375,'background');

        //Update the game at 30Hz
        this.matter.world.update30Hz();

        //Get hitboxes
        var shapes = this.cache.json.get('shapes');

        //Set boundaries for physics
        this.matter.world.setbounds(0,game.config.width,800);

        //Player
        this.hero = this.matter.add.sprite(600,500,'sheet','0001',{shape: shapes.s0001})
        this.hero.label = BALL;
        this.hook = null;

        //Fire the hook
        this.input.on("pointerdown",this.fireHook,this);

        this.rope = null;

        //Listen for collisions with the hook
        this.matter.world.on("collisionstart",function(e,b1,b2){
            if((b1.label == HOOK || b2.label == HOOK) && !this.rope) {
                Phaser.Physics.Matter.Matter.Body.setStatic(this.hook,true);
                let distance = Phaser.Math.Distance.Between(this.hero.body.position.x,this.hero.body.position.y,this.hook.position.x,this.hook.position.y);

                if (distance > gameOptions.heroSize * 2) {
                    this.rope = this.matter.add.constraint(this.hero,this.hook,distance,0.1);
                }
            }
        },this);
    }

    fireHook(e) {
        if(this.hook) {
            this.releaseHook();
        }
        else {
            let angle = Phaser.Math.Angle.Between(this.hero.body.position.x,e.position.x,e.position.y);

            this.hook = this.matter.add.rectangle(this.hero.body.position.x + 40 * Math.cos(angle),this.hero.body.position.y + 40 * Math.sin(angle),10,10);
            this.hook.label = HOOK;

            Phaser.Physics.Matter.Matter.Body.setVelocity(this.hook,{
                x: gameOptions.hookSpeed * Math.cos(angle),y: gameOptions.hookSpeed * Math.sin(angle)
            });
        }
    }

    releaseHook() {
        if(this.rope) {
            this.matter.world.removeConstraint(this.rope);
            this.rope = null;
        }
        if(this.hook){
            this.matter.world.remove(this.hook);
            this.hook = null;
        };
    }
    update() {
        // is there a constraint? Shrink it
        if(this.rope){
            this.rope.length -= gameOptions.constraintSpeed;
            let hookPosition = this.hook.position;
            let distance = Phaser.Math.Distance.Between(hookPosition.x,hookPosition.y,this.hero.body.position.x,this.hero.body.position.y);
            if(distance - this.rope.length > gameOptions.ropeTolerance){
                this.rope.length = distance;
            }
            this.rope.length = Math.max(this.rope.length,gameOptions.heroSize * 2);
        }
    }
}

编辑-我越来越近了。现在没有错误,但是,没有绳索被射出

greatmrr 回答:如何在Phaser 3中将Sprite的X和Y位置用于“翻转”物理?

您可以像这样获得 sprite 位置X和Y:

hero.body.position.x
hero.body.position.y
,

让我们看看 this.hero

“无法读取未定义的属性'x'” 表示找不到在 this.hero.position.x 中的x前面声明的属性,并且可能在其父属性中不存在。在这种情况下, this.hero 不包含 position 属性。

我们可以在代码运行时在控制台中键入 this.hero 的属性:

Properties of this.hero

您可以看到位置不存在作为可访问属性。

以您为例,您需要使用 body 属性。

enter image description here

此属性包括 position 属性,该属性包括x和y坐标。

作为结论,请使用以下几行访问 this.hook 的x和y坐标:

this.hero.body.position.x
this.hero.body.position.y

(此答案是针对此问题的first revision

本文链接:https://www.f2er.com/3120186.html

大家都在问