@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
82 lines (59 loc) • 2.17 kB
JavaScript
import Vector2 from "../../../core/geom/Vector2.js";
import { UUID } from "../../../engine/ecs/guid/UUID.js";
import dom from "../../DOM.js";
import View from "../../View.js";
class TileView extends View {
uuid = UUID.string();
/**
*
* @param {Rectangle} model
* @param {Vector2} [spacing]
* @param {Vector2} [size]
*/
constructor({ model, spacing = Vector2.zero, size = new Vector2(50, 50) }) {
super();
this.model = model;
this.__cellSize = size;
this.__spacing = spacing;
this.el = dom("div").addClass("ui-tile-grid-element-view").el;
this.updateSize();
//listen to position changes
this.bindSignal(model.position.onChanged, this.updatePosition, this);
this.on.linked.add(() => {
this.updateSize();
this.updatePosition();
});
}
updatePosition() {
this.position.copy(this.calculatePosition());
}
updateSize() {
this.size.copy(this.calculateSize());
}
calculatePosition() {
const spacing = this.__spacing;
const cellSize = this.__cellSize;
const discretePosition = this.model.position;
return TileView.calculatePosition(cellSize, spacing, discretePosition);
}
calculateSize() {
const spacing = this.__spacing;
const cellSize = this.__cellSize;
const discreteSize = this.model.size;
return TileView.calculateSize(cellSize, spacing, discreteSize);
}
render() {
const size = this.model.size.clone().multiply(this.__cellSize);
this.size.copy(size);
}
static calculatePosition(cellSize, spacing, discretePosition) {
return cellSize.clone().add(spacing).multiply(discretePosition);
}
static calculateSize(cellSize, spacing, discreteSize) {
const result = cellSize.clone().multiply(discreteSize);
const gaps = discreteSize.clone().addScalar(-1).clampLow(0, 0);
result.add(gaps.multiply(spacing));
return result;
}
}
export default TileView;