Je commence sur Phaser, en utilisant TypeScript. J'essaie donc de déplacer mes objets principaux hors des méthodes de création et de préchargement, et j'ai pensé que la meilleure façon de le faire était de les charger en tant que propriétés de classe Phaser.Scene. Mais je fais peut-être quelque chose de mal ou de déconseillé ... après avoir fait cela, je n'ai eu aucune erreur, mais le jeu n'affiche qu'un écran noir ...

Pourriez-vous s'il vous plaît jeter un œil dans le code ci-dessous et voir ce qui ne va pas?

import * as Phaser from 'phaser';

const sceneConfig = {
    active: false,
    visible: false,
    key: 'Game',
}

export default class GameScene extends Phaser.Scene {
    platforms : Phaser.Physics.Arcade.StaticGroup
    player: Phaser.Types.Physics.Arcade.SpriteWithDynamicBody 
  
    constructor() {
      super(sceneConfig);
      this.platforms = this.physics.add.staticGroup()
      this.player = this.physics.add.sprite(100, 450, 'dude')
    }
  
    preload() {
      this.load.image('sky', 'src/assets/sky.png');
      this.load.image('ground', 'src/assets/platform.png');
      this.load.image('star', 'src/assets/star.png');
      this.load.image('bomb', 'src/assets/bomb.png');
      this.load.spritesheet('dude', 
          'src/assets/dude.png',
          { frameWidth: 32, frameHeight: 48 }
      );
    }
   
    create() {
      
      this.add.image(0, 0, 'sky').setOrigin(0,0) 
  
  
      this.platforms.create(400, 568, 'ground').setScale(2).refreshBody();
  
      this.platforms.create(600, 400, 'ground');
      this.platforms.create(50, 250, 'ground');
      this.platforms.create(750, 220, 'ground');
      
      this.player.body.setGravityY(300)
      this.player.setBounce(0.2);
      this.player.setCollideWorldBounds(true);
  
      this.anims.create({
          key: 'left',
          frames: this.anims.generateFrameNumbers('dude', { start: 0, end: 3 }),
          frameRate: 10,
          repeat: -1
      });
  
      this.anims.create({
          key: 'turn',
          frames: [ { key: 'dude', frame: 4 } ],
          frameRate: 20
      });
  
      this.anims.create({
          key: 'right',
          frames: this.anims.generateFrameNumbers('dude', { start: 5, end: 8 }),
          frameRate: 10,
          repeat: -1
      });
  
      this.physics.add.collider(this.player, this.platforms);
  
  
      
  
  
    }
   
    public update() {
      // TODO
      var cursors = this.input.keyboard.createCursorKeys();
      if (cursors.left.isDown)
      {
          this.player.setVelocityX(-160);
  
          this.player.anims.play('left', true);
      }
      else if (cursors.right.isDown)
      {
          this.player.setVelocityX(160);
  
          this.player.anims.play('right', true);
      }
      else
      {
          this.player.setVelocityX(0);
  
          this.player.anims.play('turn');
      }
  
      if (cursors.up.isDown && this.player.body.touching.down)
      {
          this.player.setVelocityY(-330);
      }
  
    }
  }
  
1
rdrgtec 11 févr. 2021 à 23:37

1 réponse

Meilleure réponse

Vous ne devriez pas ajouter à la scène dans le constructeur, car la scène n'a pas encore été initialisée (évidemment, vous êtes toujours dans le constructeur!)

Déplacez-les pour créer et utiliser un assertion d'affectation définitive:

export default class GameScene extends Phaser.Scene {
  platforms!: Phaser.Physics.Arcade.StaticGroup
  player!: Phaser.Types.Physics.Arcade.SpriteWithDynamicBody 
  
  constructor() {
    super(sceneConfig);
  }
  
  create() {
    this.platforms = this.physics.add.staticGroup()
    this.player = this.physics.add.sprite(100, 450, 'dude')
    ...
1
Dave 4 mars 2021 à 22:47