Как настроить физические границы игрока? - PullRequest
0 голосов
/ 07 апреля 2020

Граница объекта

Я новый разработчик Phaser, на начальных этапах моей первой игры. Моя проблема в том, что когда мой игрок падает на землю, ограничивающий прямоугольник, определяющий его границы, оказывается намного больше его (см. Pi c). Так что в показанном примере игрок будет подпрыгивать, когда границы касаются, а не его ног.

В действии

Game

Physics Matter

Нужно ли мне переходить с физики ARCADE на более надежный физический движок, чтобы достичь sh моей цели?

Код

На самом деле особо нечего показать , но вот что у меня есть:

/// <reference path="../defs/phaser.d.ts" />

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

  preload() {
    this.load.image("bg1", "assets/bg-level1.png");
    this.load.image('ground', 'assets/platform.png');
    this.load.spritesheet('dude', 'assets/final-jump.png', {
      frameWidth: 118,
      frameHeight: 118
    });
  }

  create() {

    this.setupBackground();
    this.setupPlayer();

    this.add.text(0, 0, 'Use Cursors to scroll camera.\nQ / E to zoom in and out', {
      font: '18px Courier',
      fill: 'black'
    });

    this.physics.add.collider(this.player, this.platforms);

  }

  update() {

    // Set Player Animations
    this.setPlayerAnimation();

    if (this.player.body.onFloor()) {
      console.log("FLOOR");
      this.player.body.setAccelerationX(31);
      this.player.body.setAccelerationY(31);

    }

  }

  //---------------------------------
  // CREATE RELATED FUNCTIONS
  //---------------------------------

  setupBackground() {
    this.background = this.add.image(0, 0, "bg1");
    this.background.setOrigin(0, 0);

    //this.background.setInteractive();
    this.background.setAlpha(.2, .2, .2, .2);

    //  The platforms group contains the ground and the 2 ledges we can jump on
    this.platforms = this.physics.add.staticGroup();

    //  Here we create the ground.
    //  Scale it to fit the width of the game (the original sprite is 400x32 in size)
    this.platforms.create(400, 568, 'ground').setScale(2).refreshBody();

  }



  setupPlayer() {

    this.player = this.physics.add.sprite(100, 283, 'dude');
    console.log(this.player.body.touching.down);

    this.player.setVelocity(200, 100).setBounce(.8, .8).setCollideWorldBounds(true);

    // Re-Size Player Size
    this.player.setDisplaySize(220, 210);

    // Collision Handler
    this.physics.add.overlap(this.player, this.platforms, this.showJump, null, this);


    // ANIMATIONS
    this.anims.create({
      key: 'jump-up',
      frames: this.anims.generateFrameNumbers('dude', {
        start: 1,
        end: 2
      }),
      frameRate: 5,
      repeat: 1
    });

    this.anims.create({
      key: 'falling',
      frames: this.anims.generateFrameNumbers('dude', {
        start: 0,
        end: 1
      }),
      frameRate: 5,
      repeat: 1
    });

    this.anims.create({
      key: 'onGround',
      frames: this.anims.generateFrameNumbers('dude', {
        start: 4,
        end: 4
      }),
      frameRate: 24,
      repeat: 1
    });

  }


  showJump() {

    this.player.anims.play('jump-up', true);
  }


  //---------------------------------
  // UPDATE RELATED FUNCTIONS
  //---------------------------------

  setPlayerAnimation() {
    //this.player.anims.play('jump-up', true);

    if (this.player.body.deltaY() > 0 && this.player.body.onFloor()) {
      this.player.anims.play('falling', true);
    }

  }


}

О, да ...

Я очень впечатлен функциональностью локального пакета документации, который я скачал и установил, однако я ' Я запутался в том, с чего начать искать что-то. Например, скажем, я пытаюсь заставить моего игрока прыгать и воспроизводить анимацию, когда он в воздухе, и переключаться обратно, когда он падает на землю. Учитывая эту информацию, как мне найти правильный класс или функцию, которая мне нужна ???

1 Ответ

0 голосов
/ 16 апреля 2020

Вам не нужно переходить с аркадной физики. Попробуйте что-то вроде этого:

// Change the size of the bounding box.
this.player.setSize(32, 32);
// Change the location of the bounding box.
this.player.setOffset(0, 28);

// If that doesn't work, try this instead:
// this.player.body.setOffset(0, 28);

Очевидно, вам нужно настроить ширину / высоту и смещения для вашего сценария.

Ссылки:

...