Omnibus's picture
Upload 131 files
4ee4376
import Phaser from 'phaser';
import * as CONST from '../../constants';
export default class tile {
#debug = {};
id;
cell;
map;
tile;
depth;
rotation;
sprite;
type;
x;
y;
props = {
draw: false,
flip: false,
offsetX: 0,
offsetY: 0,
hitbox: null
};
constructor (options) {
this.cell = options.cell;
this.map = options.cell.scene.city.map;
this.rotation = options.cell.scene.city.rotation;
this.id = options.id;
this.type = options.type;
this.tile = this.get(options.id);
this.x = options.x || 0;
this.y = options.y || 0;
this.depth = {
cell: options.cell.depth,
layer: options.layerDepth || 0,
tile: options.tileDepth || 0,
additional: options.additionalDepth || 0,
};
if (!this.check()) return;
this.props.draw = true;
}
get (id) {
id = this.cell?.scene?.tiles?.[id]?.rotate[this.rotation];
if (!id) return false;
return this.cell.scene.tiles[id];
}
check () {
if (!this.cell) return false;
if (!this.tile) return false;
return true;
}
hide () {
if (this.sprite) this.sprite.setVisible(false);
}
show () {
if (this.sprite) this.sprite.setVisible(true);
}
refresh () {
this.hide();
this.show();
}
position () {
this.x = this.cell.position.topLeft.x + this.props.offsetX;
this.y = this.cell.position.topLeft.y + this.props.offsetY;
}
create () {
if (!this.props.draw) return;
this.logic();
this.position();
if (this.tile.baseLayer) {
let tile = this.get(this.tile.baseLayer);
this.cell.tiles.set(this.tile.subtype, tile.id);
this.cell.tiles[this.tile.subtype].depthAdjustment = -2;
this.cell.tiles[this.tile.subtype].create();
}
if (this.tile.frames > 1)
this.sprite = this.cell.scene.add.sprite(this.x, this.y, CONST.TILE_ATLAS).play(this.tile.image);
else
this.sprite = this.cell.scene.add.sprite(this.x, this.y, CONST.TILE_ATLAS, this.tile.textures[0]);
this.sprite.cell = this.cell;
this.sprite.type = this.type;
this.sprite.setScale(CONST.SCALE);
this.sprite.setOrigin(CONST.ORIGIN_X, CONST.ORIGIN_Y);
this.sprite.setDepth(this.depth.cell + this.depth.layer + this.depth.tile + this.depth.additional);
this.cell.tiles.addSprite(this.sprite, this.type);
this.cell.tiles.addTile(this);
this.events();
//this.debugBox();
//this.debugHitbox();
}
events () {
if (!this.sprite) return;
this.props.hitbox = this.tile.hitbox;
this.sprite.setInteractive(this.props.hitbox, Phaser.Geom.Polygon.Contains);
this.sprite.on(CONST.E_POINTER_OVER, this.cell.onPointerOver, this.cell);
this.sprite.on(CONST.E_POINTER_OUT, this.cell.onPointerOut, this.cell);
this.sprite.on(CONST.E_POINTER_MOVE, this.cell.onPointerMove, this.cell);
this.sprite.on(CONST.E_POINTER_DOWN, this.cell.onPointerDown, this.cell);
this.sprite.on(CONST.E_POINTER_UP, this.cell.onPointerUp, this.cell);
}
logic () {
return;
}
simulation () {
return;
}
debugBox () {
let bounds = this.sprite.getBounds();
let center = this.sprite.getCenter();
this.#debug.box = this.cell.scene.add.rectangle(bounds.x, bounds.y, bounds.width, bounds.height, 0x00ffff, 0);
this.#debug.box.setOrigin(CONST.ORIGIN_X, CONST.ORIGIN_Y);
this.#debug.box.setDepth(this.depth + 2);
this.#debug.box.setStrokeStyle(1, 0x00ffff, 0.5);
this.#debug.center = this.cell.scene.add.circle(center.x, center.y, 1, 0x00ffff, 0.75);
this.#debug.center.setOrigin(CONST.ORIGIN_X, CONST.ORIGIN_Y);
this.#debug.center.setDepth(this.sprite.depth + 2);
}
debugHitbox () {
this.#debug.hitbox = this.cell.scene.add.polygon(this.x, this.y, this.props.hitbox.points, 0xff00ff, 0);
this.#debug.hitbox.setDepth(this.sprite.depth + 16);
this.#debug.hitbox.setScale(CONST.SCALE);
this.#debug.hitbox.setOrigin(CONST.ORIGIN_X, CONST.ORIGIN_Y);
this.#debug.hitbox.setStrokeStyle(1, 0xff00ff, 0.5);
}
}