Почему обнаружение столкновений не работает в Phaser?

Для простоты у меня есть игра, и я пытаюсь заставить свою машину врезаться в стену. Я пытался искать, и я пробовал несколько вещей, как вы увидите ниже, я не уверен, почему я не могу заставить его работать.

Вот код в моей функции create:

    create: function () {
        game.physics.startSystem(Phaser.Physics.ARCADE);

        this.carSprite = game.add.sprite(game.world.centerX, game.world.centerY, 'car');
        game.physics.arcade.enable(this.carSprite);
    this.timer = game.time.events.loop(300,
        this.addRoad, this);
    }

Затем в моей функции update:

    update: function () {
        game.physics.arcade.overlap(this.carSprite, this.wallSprite, this.scoring, null, this);
}

Я создаю wallSprite следующим образом:

 addOneRoadSection: function (x, y) {
this.scoreCalculator += 1;
        if (this.scoreCalculator == 10) {
            this.scoreCalculator = 0;

            this.wallSprite = game.add.sprite(x + 100, y, 'wall');
            game.physics.arcade.enable(this.wallSprite);
            this.wallAnimation = this.wallSprite .animations.add('wallAnimation');
            this.wallSprite.animations.play('wallAnimation', 30, true);
            this.wallSprite.body.velocity.y = 100;
            this.wallSprite.checkWorldBounds = true;
            this.wallSprite.outOfBoundsKill = true;
        }
}

Я звоню addOneRoadSection так:

    addRoad: function () {
        this.addOneRoadSection(this.xValue, 0);
}

addRoad вызывается в create с использованием this.timer.

Итак, вкратце, что это делает, так это то, что когда scoreCalculator равно десяти, это добавляет стену. Это работает нормально, стена анимируется нормально, но обнаружение столкновений не работает вообще.

Я попытался переместить код внутри оператора if в свою функцию create, и он отлично работает с обнаружением столкновений (но другие вещи ломаются, поэтому я не могу оставить его там). Что я делаю не так? У меня есть подозрение, что, поскольку я вызываю this.wallSprite в среднем примерно раз в секунду, он перезаписывается новым спрайтом, который добавляется как this.wallSprite, но я не совсем уверен, как еще я должен это сделать?


person maxshuty    schedule 29.03.2016    source источник


Ответы (1)


Итак, я понял это. Происходило то, что моя первоначальная склонность к созданию нового спрайта и написанию другого была правильной.

Вот как я решил проблему:

in create:

create: function(){ 
 //Create a wallSprite array
 var wallSprite = [];
}

Теперь, когда у меня есть массив, когда я добавляю новый wallSprite в addOneRoadSection, я могу добавить физику к каждому спрайту следующим образом:

   addOneRoadSection: function (x, y) {

            this.wallSprite.push(game.add.sprite(x + 100, y, 'wall'));
            game.physics.arcade.enable(this.wallSprite[this.wallSprite.length -1]);
            this.wallAnimation = this.wallSprite[this.wallSprite.length - 1].animations.add('wallAnimation');
            this.wallSprite[this.wallSprite.length - 1].animations.play('wallAnimation', 30, true);
            this.wallSprite[this.wallSprite.length -1].body.velocity.y = 100;
            this.wallSprite[this.wallSprite.length - 1].checkWorldBounds = true;
            this.wallSprite[this.wallSprite.length -1].outOfBoundsKill = true;
}

Наконец, в update мне просто нужно сделать это:

    for (var i = 0; i < this.wallSprite.length; i++) {
        game.physics.arcade.overlap(this.car, this.wallSprite, this.scoring, null, this);
    }

Вуаля - обнаружение столкновений теперь работает для каждого спрайта.

person maxshuty    schedule 29.03.2016