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
Aanvänder klassB, såAär beroende avB - Klass
Banvänder klassA, såBär också beroende avA
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.
- Så i
Game-klassen verkar det som om du inte behövde användaPlayerInterface. - Och du behövde inte heller utöka från
SceneochPhaser.Physics.Arcade.Spritei 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.
