This commit is contained in:
2026-05-15 20:45:17 +02:00
parent 1b427c8679
commit 1c48f9fe32
12 changed files with 126 additions and 110 deletions

View File

@@ -0,0 +1,37 @@
import Phaser from "phaser";
import { Platform } from "../Platform";
export class ObstaclePlatformDisappearing extends Phaser.GameObjects.TileSprite {
static readonly TRIGGER_DISTANCE = 110;
static readonly FADE_MS = 200;
declare body: Phaser.Physics.Arcade.StaticBody;
private vanished = false;
constructor(scene: Phaser.Scene, x: number, y: number, width: number, height: number) {
super(scene, x, y, width, height, Platform.TEXTURE_KEY);
scene.add.existing(this);
scene.physics.add.existing(this, true);
}
react(playerX: number, playerY: number): void {
if (this.vanished) return;
const dx = this.x - playerX;
const dy = this.y - playerY;
if (Math.hypot(dx, dy) < ObstaclePlatformDisappearing.TRIGGER_DISTANCE) {
this.vanish();
}
}
private vanish(): void {
this.vanished = true;
this.body.enable = false;
this.scene.tweens.add({
targets: this,
alpha: 0,
duration: ObstaclePlatformDisappearing.FADE_MS,
onComplete: () => this.setVisible(false),
});
}
}

View File

@@ -0,0 +1,15 @@
import Phaser from "phaser";
export class ObstacleSpikeNormal extends Phaser.GameObjects.Image {
static readonly TEXTURE_KEY = "spike-normal";
static readonly WIDTH = 40;
static readonly HEIGHT = 20;
declare body: Phaser.Physics.Arcade.StaticBody;
constructor(scene: Phaser.Scene, x: number, y: number) {
super(scene, x, y, ObstacleSpikeNormal.TEXTURE_KEY);
scene.add.existing(this);
scene.physics.add.existing(this, true);
}
}

View File

@@ -0,0 +1,30 @@
import Phaser from "phaser";
export class ObstacleSpikeTricky extends Phaser.GameObjects.Image {
static readonly TEXTURE_KEY = "spike-tricky";
static readonly WIDTH = 40;
static readonly HEIGHT = 20;
static readonly TRIGGER_DISTANCE = 55;
static readonly DISPLACEMENT = 100;
declare body: Phaser.Physics.Arcade.StaticBody;
private moved = false;
constructor(scene: Phaser.Scene, x: number, y: number) {
super(scene, x, y, ObstacleSpikeTricky.TEXTURE_KEY);
scene.add.existing(this);
scene.physics.add.existing(this, true);
}
react(playerX: number): void {
if (this.moved) return;
const dx = this.x - playerX;
if (Math.abs(dx) < ObstacleSpikeTricky.TRIGGER_DISTANCE) {
const direction = Math.sign(dx) || 1;
this.x += direction * ObstacleSpikeTricky.DISPLACEMENT;
this.body.updateFromGameObject();
this.moved = true;
}
}
}

View File

@@ -0,0 +1,3 @@
export { ObstaclePlatformDisappearing } from "./ObstaclePlatformDisappearing";
export { ObstacleSpikeNormal } from "./ObstacleSpikeNormal";
export { ObstacleSpikeTricky } from "./ObstacleSpikeTricky";