SetTiles can now set a tile to null so that there is no more tile.
This commit is contained in:
parent
a7ced533c0
commit
bef5e139c0
3 changed files with 27 additions and 12 deletions
|
@ -5,7 +5,7 @@ export const isSetTilesEvent = tg.isArray(
|
||||||
.withProperties({
|
.withProperties({
|
||||||
x: tg.isNumber,
|
x: tg.isNumber,
|
||||||
y: tg.isNumber,
|
y: tg.isNumber,
|
||||||
tile: tg.isUnion(tg.isNumber, tg.isString),
|
tile: tg.isUnion(tg.isUnion(tg.isNumber, tg.isString), tg.isNull),
|
||||||
layer: tg.isString,
|
layer: tg.isString,
|
||||||
})
|
})
|
||||||
.get()
|
.get()
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { isDataLayerEvent } from "../Events/DataLayerEvent";
|
||||||
import { EnterLeaveEvent, isEnterLeaveEvent } from "../Events/EnterLeaveEvent";
|
import { EnterLeaveEvent, isEnterLeaveEvent } from "../Events/EnterLeaveEvent";
|
||||||
import { isGameStateEvent } from "../Events/GameStateEvent";
|
import { isGameStateEvent } from "../Events/GameStateEvent";
|
||||||
|
|
||||||
import {IframeApiContribution, queryWorkadventure, sendToWorkadventure} from "./IframeApiContribution";
|
import { IframeApiContribution, queryWorkadventure, sendToWorkadventure } from "./IframeApiContribution";
|
||||||
import { apiCallback } from "./registeredCallbacks";
|
import { apiCallback } from "./registeredCallbacks";
|
||||||
|
|
||||||
import type { ITiledMap } from "../../Phaser/Map/ITiledMap";
|
import type { ITiledMap } from "../../Phaser/Map/ITiledMap";
|
||||||
|
@ -34,7 +34,7 @@ interface User {
|
||||||
interface TileDescriptor {
|
interface TileDescriptor {
|
||||||
x: number;
|
x: number;
|
||||||
y: number;
|
y: number;
|
||||||
tile: number | string;
|
tile: number | string | null;
|
||||||
layer: string;
|
layer: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,7 +152,10 @@ export class GameMap {
|
||||||
}
|
}
|
||||||
|
|
||||||
private getTileProperty(index: number): Array<ITiledMapLayerProperty> {
|
private getTileProperty(index: number): Array<ITiledMapLayerProperty> {
|
||||||
return this.tileSetPropertyMap[index];
|
if (this.tileSetPropertyMap[index]) {
|
||||||
|
return this.tileSetPropertyMap[index];
|
||||||
|
}
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
private trigger(
|
private trigger(
|
||||||
|
@ -198,37 +201,49 @@ export class GameMap {
|
||||||
private putTileInFlatLayer(index: number, x: number, y: number, layer: string): void {
|
private putTileInFlatLayer(index: number, x: number, y: number, layer: string): void {
|
||||||
const fLayer = this.findLayer(layer);
|
const fLayer = this.findLayer(layer);
|
||||||
if (fLayer == undefined) {
|
if (fLayer == undefined) {
|
||||||
console.error("The layer that you want to change doesn't exist.");
|
console.error("The layer '" + layer + "' that you want to change doesn't exist.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (fLayer.type !== "tilelayer") {
|
if (fLayer.type !== "tilelayer") {
|
||||||
console.error("The layer that you want to change is not a tilelayer. Tile can only be put in tilelayer.");
|
console.error(
|
||||||
|
"The layer '" +
|
||||||
|
layer +
|
||||||
|
"' that you want to change is not a tilelayer. Tile can only be put in tilelayer."
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (typeof fLayer.data === "string") {
|
if (typeof fLayer.data === "string") {
|
||||||
console.error("Data of the layer that you want to change is only readable.");
|
console.error("Data of the layer '" + layer + "' that you want to change is only readable.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fLayer.data[x + y * fLayer.height] = index;
|
fLayer.data[x + y * fLayer.width] = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
public putTile(tile: string | number, x: number, y: number, layer: string): void {
|
public putTile(tile: string | number | null, x: number, y: number, layer: string): void {
|
||||||
const phaserLayer = this.findPhaserLayer(layer);
|
const phaserLayer = this.findPhaserLayer(layer);
|
||||||
if (phaserLayer) {
|
if (phaserLayer) {
|
||||||
|
if (tile === null) {
|
||||||
|
phaserLayer.putTileAt(-1, x, y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
const tileIndex = this.getIndexForTileType(tile);
|
const tileIndex = this.getIndexForTileType(tile);
|
||||||
if (tileIndex !== undefined) {
|
if (tileIndex !== undefined) {
|
||||||
this.putTileInFlatLayer(tileIndex, x, y, layer);
|
this.putTileInFlatLayer(tileIndex, x, y, layer);
|
||||||
const phaserTile = phaserLayer.putTileAt(tileIndex, x, y);
|
const phaserTile = phaserLayer.putTileAt(tileIndex, x, y);
|
||||||
for (const property of this.getTileProperty(tileIndex)) {
|
for (const property of this.getTileProperty(tileIndex)) {
|
||||||
if (property.name === "collides" && property.value === "true") {
|
if (property.name === "collides" && property.value) {
|
||||||
phaserTile.setCollision(true);
|
phaserTile.setCollision(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.error("The tile that you want to place doesn't exist.");
|
console.error("The tile '" + tile + "' that you want to place doesn't exist.");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.error("The layer that you want to change is not a tilelayer. Tile can only be put in tilelayer.");
|
console.error(
|
||||||
|
"The layer '" +
|
||||||
|
layer +
|
||||||
|
"' that you want to change is not a tilelayer. Tile can only be put in tilelayer."
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue