javascript - Phaser 3 Cirkelberoendeproblem


Hur man löser ett cirkulärt beroende i Phaser 3

Bakgrund

Jag håller på att göra ett spel med Phaser 3, TypeScript och Parcel. Jag har lagt till några klasser som implementerar vissa gränssnitt, men gränssnitten importerar och använder varandra. Jag började använda eslint med airbnb-regeluppsättning. En av reglerna de implementerar är import/no-cycle men jag känner att mitt spel behöver det.

Exempelkod

GameInterface.ts

import { Scene } from 'phaser';
import PlayerInterface from '../../entities/player/PlayerInterface'; // circular

interface GameInterface extends Scene {
  player: PlayerInterface;
}

export default GameInterface;

Spelargränssnitt.ts

import GameInterface from '../../scenes/game/GameInterface'; // circular

interface PlayerInterface extends Phaser.Physics.Arcade.Sprite {
  scene: GameInterface;
  speed: number;
}

export default PlayerInterface;

Fråga

En "Spelare" läggs till i "Spelet" och Spelarklassen har en scen. Så de båda behöver vara i gränssnittet. Eftersom detta bara är en typfil, kan jag ignorera denna regel? Eller finns det en smart omstrukturering jag kan göra?

Redigera 1

Dessutom här är en länk till hela repot.

Redigera 2

Här är de 2 klasserna som implementerar dessa gränssnitt.

Spel.ts

class Game extends Scene implements GameInterface {
  player: PlayerInterface;

  constructor() {
    super({
      key: 'Game',
    });
  }

  preload(): void {
    /* preload code */
  }

  create(): void {
   /* create code */ 
  }
}

Spelare.ts

class Player extends Phaser.Physics.Arcade.Sprite implements PlayerInterface {
  scene: GameInterface;

  constructor(scene: GameInterface) {
    super(scene, x, y, 'player');
    this.scene = scene;
    this.scene.add.existing(this);
    this.scene.physics.add.existing(this);
  }

  static preload(scene: GameInterface): void {
    /* preload */
  }
}

Som du kan se skapar spelklassen spelaren, men spelaren får också en scen när den skapas.

Svar #1

först och främst Cirkulärt beroende betyder när du har två klasser A & B:

  • Klass A använder klass B, så A är beroende av B
  • Klass B använder klass A, så B är också beroende av A

Som ett resultat, vid initiering av båda klasserna går det igenom en oändlig loop eftersom det vill skapa klass A baserat på B, och klassen vill bli skapad baserat på klass A trots att det gick in i en fördelaktig loop.

Så bara klipp den onödiga beroendet.

  1. Så i Game-klassen verkar det som om du inte behövde använda PlayerInterface.
  2. Och du behövde inte heller utöka från Scene och Phaser.Physics.Arcade.Sprite i dina gränssnitt. Eftersom du redan utökar dem i dina konkreta klasser. Ta bara bort dem.

Svar #2

Placera båda gränssnitten i samma fil. Detta kommer att bli av med den cirkulära filinläsningen, vilket är vad som ställer till problem för dig här.

Relaterade artiklar