Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mamayaya1
GitHub Repository: mamayaya1/game
Path: blob/main/projects/9007199254740992/js/html_actuator.js
4626 views
1
function HTMLActuator() {
2
this.tileContainer = document.querySelector(".tile-container");
3
this.scoreContainer = document.querySelector(".score-container");
4
this.bestContainer = document.querySelector(".best-container");
5
this.messageContainer = document.querySelector(".game-message");
6
7
this.score = 0;
8
}
9
10
HTMLActuator.prototype.actuate = function (grid, metadata) {
11
var self = this;
12
13
window.requestAnimationFrame(function () {
14
self.clearContainer(self.tileContainer);
15
16
grid.cells.forEach(function (column) {
17
column.forEach(function (cell) {
18
if (cell) {
19
self.addTile(cell);
20
}
21
});
22
});
23
24
self.updateScore(metadata.score);
25
self.updateBestScore(metadata.bestScore);
26
27
if (metadata.over) self.message(false); // You lose
28
if (metadata.won) self.message(true); // You win!
29
});
30
};
31
32
HTMLActuator.prototype.restart = function () {
33
this.clearMessage();
34
};
35
36
HTMLActuator.prototype.clearContainer = function (container) {
37
while (container.firstChild) {
38
container.removeChild(container.firstChild);
39
}
40
};
41
42
HTMLActuator.prototype.addTile = function (tile) {
43
var self = this;
44
45
var element = document.createElement("div");
46
var position = tile.previousPosition || { x: tile.x, y: tile.y };
47
positionClass = this.positionClass(position);
48
49
// We can't use classlist because it somehow glitches when replacing classes
50
var classes = ["tile", "tile-" + tile.value, positionClass];
51
if (tile.value > 1048576)
52
classes = ["tile", "tile-" + 1048576, positionClass];
53
this.applyClasses(element, classes);
54
55
element.textContent = tile.value;
56
57
if (tile.previousPosition) {
58
// Make sure that the tile gets rendered in the previous position first
59
window.requestAnimationFrame(function () {
60
classes[2] = self.positionClass({ x: tile.x, y: tile.y });
61
self.applyClasses(element, classes); // Update the position
62
});
63
} else if (tile.mergedFrom) {
64
classes.push("tile-merged");
65
this.applyClasses(element, classes);
66
67
// Render the tiles that merged
68
tile.mergedFrom.forEach(function (merged) {
69
self.addTile(merged);
70
});
71
} else {
72
classes.push("tile-new");
73
this.applyClasses(element, classes);
74
}
75
76
// Put the tile on the board
77
this.tileContainer.appendChild(element);
78
};
79
80
HTMLActuator.prototype.applyClasses = function (element, classes) {
81
element.setAttribute("class", classes.join(" "));
82
};
83
84
HTMLActuator.prototype.normalizePosition = function (position) {
85
return { x: position.x + 1, y: position.y + 1 };
86
};
87
88
HTMLActuator.prototype.positionClass = function (position) {
89
position = this.normalizePosition(position);
90
return "tile-position-" + position.x + "-" + position.y;
91
};
92
93
HTMLActuator.prototype.updateScore = function (score) {
94
this.clearContainer(this.scoreContainer);
95
96
var difference = score - this.score;
97
this.score = score;
98
99
this.scoreContainer.textContent = this.score;
100
101
if (difference > 0) {
102
var addition = document.createElement("div");
103
addition.classList.add("score-addition");
104
addition.textContent = "+" + difference;
105
106
this.scoreContainer.appendChild(addition);
107
}
108
};
109
110
HTMLActuator.prototype.updateBestScore = function (bestScore) {
111
this.bestContainer.textContent = bestScore;
112
};
113
114
HTMLActuator.prototype.message = function (won) {
115
var type = won ? "game-won" : "game-over";
116
var message = won ? "You win!" : "Game over!";
117
118
this.messageContainer.classList.add(type);
119
this.messageContainer.getElementsByTagName("p")[0].textContent = message;
120
};
121
122
HTMLActuator.prototype.clearMessage = function () {
123
this.messageContainer.classList.remove("game-won", "game-over");
124
};
125
126