added reverse animation
This commit is contained in:
parent
3e20fb89ca
commit
2273a84d0e
|
@ -3,14 +3,18 @@ import Container = Phaser.GameObjects.Container;
|
||||||
import type { ITiledMapLayer, ITiledMapLayerProperty } from "./ITiledMap";
|
import type { ITiledMapLayer, ITiledMapLayerProperty } from "./ITiledMap";
|
||||||
import type { GameScene } from "../Game/GameScene";
|
import type { GameScene } from "../Game/GameScene";
|
||||||
|
|
||||||
|
interface SpriteEntity {
|
||||||
|
animation: string|false;
|
||||||
|
sprite: Sprite;
|
||||||
|
state: boolean;
|
||||||
|
properties: { reverseInactive: boolean; } | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
export class InteractiveLayer extends Container {
|
export class InteractiveLayer extends Container {
|
||||||
|
private lastUpdate: number;
|
||||||
private allActive: boolean;
|
private allActive: boolean;
|
||||||
private layer: ITiledMapLayer;
|
private layer: ITiledMapLayer;
|
||||||
private spritesCollection: Array<{
|
private spritesCollection: Array<SpriteEntity>;
|
||||||
animation: string|false;
|
|
||||||
sprite: Sprite;
|
|
||||||
state: boolean;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
private updateListener: Function;
|
private updateListener: Function;
|
||||||
|
|
||||||
|
@ -19,6 +23,7 @@ export class InteractiveLayer extends Container {
|
||||||
|
|
||||||
super(scene, x, y);
|
super(scene, x, y);
|
||||||
|
|
||||||
|
this.lastUpdate = 0;
|
||||||
this.allActive = false;
|
this.allActive = false;
|
||||||
this.layer = layer;
|
this.layer = layer;
|
||||||
this.spritesCollection = [];
|
this.spritesCollection = [];
|
||||||
|
@ -32,7 +37,14 @@ export class InteractiveLayer extends Container {
|
||||||
this.scene.add.existing(this);
|
this.scene.add.existing(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public update(): void {
|
public update(time: number, delta: number): void {
|
||||||
|
// running this function max. 15 times per second should be enough
|
||||||
|
if (this.lastUpdate + (1000 / 15) > time) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastUpdate = time;
|
||||||
|
|
||||||
const scene = this.getScene();
|
const scene = this.getScene();
|
||||||
|
|
||||||
const radius = this.getInteractionRadius();
|
const radius = this.getInteractionRadius();
|
||||||
|
@ -54,19 +66,24 @@ export class InteractiveLayer extends Container {
|
||||||
&& sprite.y + sprite.height * (r + 1) >= y // bottom
|
&& sprite.y + sprite.height * (r + 1) >= y // bottom
|
||||||
) {
|
) {
|
||||||
if (!entity.state) {
|
if (!entity.state) {
|
||||||
if (entity.animation !== false) {
|
if (entity.animation === false) {
|
||||||
|
entity.state = true;
|
||||||
|
} else if (!sprite.anims.isPlaying) {
|
||||||
sprite.play(entity.animation, true);
|
sprite.play(entity.animation, true);
|
||||||
|
entity.state = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
entity.state = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foundActive = true;
|
foundActive = true;
|
||||||
if (radius == -1) {
|
if (radius == -1) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (radius != -1) {
|
} else if (radius != -1 && entity.state && !sprite.anims.isPlaying) {
|
||||||
entity.state = false;
|
entity.state = false;
|
||||||
|
|
||||||
|
if (entity.animation !== false && this.shouldReverse(entity)) {
|
||||||
|
sprite.anims.playReverse(entity.animation);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,6 +106,12 @@ export class InteractiveLayer extends Container {
|
||||||
for (const i in this.spritesCollection) {
|
for (const i in this.spritesCollection) {
|
||||||
const entity = this.spritesCollection[i];
|
const entity = this.spritesCollection[i];
|
||||||
entity.state = false;
|
entity.state = false;
|
||||||
|
|
||||||
|
if (entity.animation !== false && this.shouldReverse(entity)) {
|
||||||
|
const sprite = entity.sprite;
|
||||||
|
sprite.anims.pause();
|
||||||
|
sprite.anims.playReverse(entity.animation);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.allActive = false;
|
this.allActive = false;
|
||||||
|
@ -171,7 +194,8 @@ export class InteractiveLayer extends Container {
|
||||||
this.spritesCollection.push({
|
this.spritesCollection.push({
|
||||||
animation: animation === null ? false : key,
|
animation: animation === null ? false : key,
|
||||||
sprite,
|
sprite,
|
||||||
state: false
|
state: false,
|
||||||
|
properties: tileset.getTileProperties(index) as any
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,7 +252,7 @@ export class InteractiveLayer extends Container {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const prop = properties.find((property: ITiledMapLayerProperty) => property.name.toLowerCase() === name.toLowerCase());
|
const prop = properties.find((property: ITiledMapLayerProperty) => property.name === name);
|
||||||
|
|
||||||
if (typeof prop === "undefined") {
|
if (typeof prop === "undefined") {
|
||||||
return undefined;
|
return undefined;
|
||||||
|
@ -236,4 +260,8 @@ export class InteractiveLayer extends Container {
|
||||||
|
|
||||||
return prop.value;
|
return prop.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private shouldReverse(entity: SpriteEntity): boolean {
|
||||||
|
return typeof entity.properties !== "undefined" && entity.properties["reverseInactive"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue