Path: blob/main/projects/cupcake2048/js/html_actuator.js
4626 views
function HTMLActuator() {1this.tileContainer = document.querySelector(".tile-container");2this.scoreContainer = document.querySelector(".score-container");3this.scorePoints = document.querySelector(".score-points");4this.bestContainer = document.querySelector(".best-container");5this.bestPoints = document.querySelector(".best-points");6this.messageContainer = document.querySelector(".game-message");7this.sharingContainer = document.querySelector(".score-sharing");89this.score = 0;10this.points = 0;11}1213HTMLActuator.prototype.actuate = function (grid, metadata) {14var self = this;1516window.requestAnimationFrame(function () {17self.clearContainer(self.tileContainer);1819grid.cells.forEach(function (column) {20column.forEach(function (cell) {21if (cell) {22self.addTile(cell);23}24});25});2627self.updateScore(metadata.score, metadata.points);28self.updateBestScore(metadata.bestScore, metadata.bestPoints);2930if (metadata.terminated) {31if (metadata.over) {32self.message(false); // You lose33} else if (metadata.won) {34self.message(true); // You win!35}36}3738});39};4041// Continues the game (both restart and keep playing)42HTMLActuator.prototype.continueGame = function () {43this.clearMessage();44};4546HTMLActuator.prototype.clearContainer = function (container) {47while (container.firstChild) {48container.removeChild(container.firstChild);49}50};5152HTMLActuator.prototype.addTile = function (tile) {53var self = this;5455var wrapper = document.createElement("div");56var inner = document.createElement("div");57var img = document.createElement("img");58var position = tile.previousPosition || { x: tile.x, y: tile.y };59var positionClass = this.positionClass(position);6061// We can't use classlist because it somehow glitches when replacing classes62var classes = ["tile", "tile-" + tile.value, positionClass];6364if (tile.value > 2048) classes.push("tile-super");6566this.applyClasses(wrapper, classes);6768inner.classList.add("tile-inner");69// inner.textContent = tile.value;70// img.style.width = '100%';71img.src = "style/img/" + tile.value + ".jpg";72inner.appendChild(img);7374if (tile.previousPosition) {75// Make sure that the tile gets rendered in the previous position first76window.requestAnimationFrame(function () {77classes[2] = self.positionClass({ x: tile.x, y: tile.y });78self.applyClasses(wrapper, classes); // Update the position79});80} else if (tile.mergedFrom) {81classes.push("tile-merged");82this.applyClasses(wrapper, classes);8384// Render the tiles that merged85tile.mergedFrom.forEach(function (merged) {86self.addTile(merged);87});88} else {89classes.push("tile-new");90this.applyClasses(wrapper, classes);91}9293// Add the inner part of the tile to the wrapper94wrapper.appendChild(inner);9596// Put the tile on the board97this.tileContainer.appendChild(wrapper);98};99100HTMLActuator.prototype.applyClasses = function (element, classes) {101element.setAttribute("class", classes.join(" "));102};103104HTMLActuator.prototype.normalizePosition = function (position) {105return { x: position.x + 1, y: position.y + 1 };106};107108HTMLActuator.prototype.positionClass = function (position) {109position = this.normalizePosition(position);110return "tile-position-" + position.x + "-" + position.y;111};112113HTMLActuator.prototype.updateScore = function (score, points) {114this.clearContainer(this.scoreContainer);115this.clearContainer(this.scorePoints);116117var difference = score - this.score;118this.score = score;119var pointDifference = points - this.points;120this.points = points;121122// this.scoreContainer.textContent = this.score;123this.scorePoints.textContent = this.points;124this.scoreContainer.textContent = Localize( "p" + this.score );125126if (difference > 0) {127var addition = document.createElement("div");128addition.classList.add("score-addition");129// addition.textContent = "+" + difference;130addition.textContent = Localize( "p" + this.score );131132this.scoreContainer.appendChild(addition);133}134135if (pointDifference > 0) {136var punti = document.createElement("div");137punti.classList.add("score-addition");138punti.textContent = "+" + pointDifference;139this.scorePoints.appendChild(punti);140}141};142143HTMLActuator.prototype.updateBestScore = function (bestScore, bestPoints) {144this.bestContainer.textContent = Localize( "p" + bestScore);145this.bestPoints.textContent = bestPoints;146147// var difference = score - this.score;148// this.score = score;149};150151HTMLActuator.prototype.message = function (won) {152var type = won ? "game-won" : "game-over";153var message = Localize(type);154155this.messageContainer.classList.add(type);156this.messageContainer.getElementsByTagName("p")[0].textContent = message;157158this.clearContainer(this.sharingContainer);159this.sharingContainer.appendChild(this.scoreTweetButton());160twttr.widgets.load();161};162163HTMLActuator.prototype.clearMessage = function () {164// IE only takes one value to remove at a time.165this.messageContainer.classList.remove("game-won");166this.messageContainer.classList.remove("game-over");167};168169HTMLActuator.prototype.scoreTweetButton = function () {170var tweet = document.createElement("a");171tweet.classList.add("twitter-share-button");172tweet.setAttribute("href", "https://twitter.com/share");173tweet.setAttribute("data-via", "giampiex");174tweet.setAttribute("data-url", "http://git.io/cupcakes");175tweet.setAttribute("data-counturl", "http://0x0800.github.io/2048-CUPCAKES");176tweet.textContent = "Tweet";177178var text = Localize("tweet1") + Localize( this.score ).toUpperCase() + '", ' + this.points + " Kcal " + Localize("tweet2");179tweet.setAttribute("data-text", text);180181return tweet;182};183184185