Path: blob/main/projects/9007199254740992/js/html_actuator.js
4626 views
function HTMLActuator() {1this.tileContainer = document.querySelector(".tile-container");2this.scoreContainer = document.querySelector(".score-container");3this.bestContainer = document.querySelector(".best-container");4this.messageContainer = document.querySelector(".game-message");56this.score = 0;7}89HTMLActuator.prototype.actuate = function (grid, metadata) {10var self = this;1112window.requestAnimationFrame(function () {13self.clearContainer(self.tileContainer);1415grid.cells.forEach(function (column) {16column.forEach(function (cell) {17if (cell) {18self.addTile(cell);19}20});21});2223self.updateScore(metadata.score);24self.updateBestScore(metadata.bestScore);2526if (metadata.over) self.message(false); // You lose27if (metadata.won) self.message(true); // You win!28});29};3031HTMLActuator.prototype.restart = function () {32this.clearMessage();33};3435HTMLActuator.prototype.clearContainer = function (container) {36while (container.firstChild) {37container.removeChild(container.firstChild);38}39};4041HTMLActuator.prototype.addTile = function (tile) {42var self = this;4344var element = document.createElement("div");45var position = tile.previousPosition || { x: tile.x, y: tile.y };46positionClass = this.positionClass(position);4748// We can't use classlist because it somehow glitches when replacing classes49var classes = ["tile", "tile-" + tile.value, positionClass];50if (tile.value > 1048576)51classes = ["tile", "tile-" + 1048576, positionClass];52this.applyClasses(element, classes);5354element.textContent = tile.value;5556if (tile.previousPosition) {57// Make sure that the tile gets rendered in the previous position first58window.requestAnimationFrame(function () {59classes[2] = self.positionClass({ x: tile.x, y: tile.y });60self.applyClasses(element, classes); // Update the position61});62} else if (tile.mergedFrom) {63classes.push("tile-merged");64this.applyClasses(element, classes);6566// Render the tiles that merged67tile.mergedFrom.forEach(function (merged) {68self.addTile(merged);69});70} else {71classes.push("tile-new");72this.applyClasses(element, classes);73}7475// Put the tile on the board76this.tileContainer.appendChild(element);77};7879HTMLActuator.prototype.applyClasses = function (element, classes) {80element.setAttribute("class", classes.join(" "));81};8283HTMLActuator.prototype.normalizePosition = function (position) {84return { x: position.x + 1, y: position.y + 1 };85};8687HTMLActuator.prototype.positionClass = function (position) {88position = this.normalizePosition(position);89return "tile-position-" + position.x + "-" + position.y;90};9192HTMLActuator.prototype.updateScore = function (score) {93this.clearContainer(this.scoreContainer);9495var difference = score - this.score;96this.score = score;9798this.scoreContainer.textContent = this.score;99100if (difference > 0) {101var addition = document.createElement("div");102addition.classList.add("score-addition");103addition.textContent = "+" + difference;104105this.scoreContainer.appendChild(addition);106}107};108109HTMLActuator.prototype.updateBestScore = function (bestScore) {110this.bestContainer.textContent = bestScore;111};112113HTMLActuator.prototype.message = function (won) {114var type = won ? "game-won" : "game-over";115var message = won ? "You win!" : "Game over!";116117this.messageContainer.classList.add(type);118this.messageContainer.getElementsByTagName("p")[0].textContent = message;119};120121HTMLActuator.prototype.clearMessage = function () {122this.messageContainer.classList.remove("game-won", "game-over");123};124125126