提交 c6d4e4f2 编写于 作者: G Gabriele Cirulli

merge super tiles

...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
<div class="game-message"> <div class="game-message">
<p></p> <p></p>
<div class="lower"> <div class="lower">
<a class="keep-playing-button">Keep going</a>
<a class="retry-button">Try again</a> <a class="retry-button">Try again</a>
<div class="score-sharing"></div> <div class="score-sharing"></div>
</div> </div>
......
...@@ -8,23 +8,39 @@ function GameManager(size, InputManager, Actuator, ScoreManager) { ...@@ -8,23 +8,39 @@ function GameManager(size, InputManager, Actuator, ScoreManager) {
this.inputManager.on("move", this.move.bind(this)); this.inputManager.on("move", this.move.bind(this));
this.inputManager.on("restart", this.restart.bind(this)); this.inputManager.on("restart", this.restart.bind(this));
this.inputManager.on("keepPlaying", this.keepPlaying.bind(this));
this.setup(); this.setup();
} }
// Restart the game // Restart the game
GameManager.prototype.restart = function () { GameManager.prototype.restart = function () {
this.actuator.restart(); this.actuator.continue();
this.setup(); this.setup();
}; };
// Keep playing after winning
GameManager.prototype.keepPlaying = function () {
this.keepPlaying = true;
this.actuator.continue();
};
GameManager.prototype.isGameTerminated = function () {
if (this.over || (this.won && !this.keepPlaying)) {
return true;
} else {
return false;
}
};
// Set up the game // Set up the game
GameManager.prototype.setup = function () { GameManager.prototype.setup = function () {
this.grid = new Grid(this.size); this.grid = new Grid(this.size);
this.score = 0; this.score = 0;
this.over = false; this.over = false;
this.won = false; this.won = false;
this.keepPlaying = false;
// Add the initial tiles // Add the initial tiles
this.addStartTiles(); this.addStartTiles();
...@@ -57,10 +73,11 @@ GameManager.prototype.actuate = function () { ...@@ -57,10 +73,11 @@ GameManager.prototype.actuate = function () {
} }
this.actuator.actuate(this.grid, { this.actuator.actuate(this.grid, {
score: this.score, score: this.score,
over: this.over, over: this.over,
won: this.won, won: this.won,
bestScore: this.scoreManager.get() bestScore: this.scoreManager.get(),
terminated: this.isGameTerminated()
}); });
}; };
...@@ -87,7 +104,7 @@ GameManager.prototype.move = function (direction) { ...@@ -87,7 +104,7 @@ GameManager.prototype.move = function (direction) {
// 0: up, 1: right, 2:down, 3: left // 0: up, 1: right, 2:down, 3: left
var self = this; var self = this;
if (this.over || this.won) return; // Don't do anything if the game's over if (this.isGameTerminated()) return; // Don't do anything if the game's over
var cell, tile; var cell, tile;
......
...@@ -25,15 +25,23 @@ HTMLActuator.prototype.actuate = function (grid, metadata) { ...@@ -25,15 +25,23 @@ HTMLActuator.prototype.actuate = function (grid, metadata) {
self.updateScore(metadata.score); self.updateScore(metadata.score);
self.updateBestScore(metadata.bestScore); self.updateBestScore(metadata.bestScore);
if (metadata.over) self.message(false); // You lose if (metadata.terminated) {
if (metadata.won) self.message(true); // You win! if (metadata.over) {
self.message(false); // You lose
} else if (metadata.won) {
self.message(true); // You win!
}
}
}); });
}; };
HTMLActuator.prototype.restart = function () { // Continues the game (both restart and keep playing)
HTMLActuator.prototype.continue = function () {
if (typeof ga !== "undefined") { if (typeof ga !== "undefined") {
ga("send", "event", "game", "restart"); ga("send", "event", "game", "restart");
} }
this.clearMessage(); this.clearMessage();
}; };
...@@ -49,10 +57,13 @@ HTMLActuator.prototype.addTile = function (tile) { ...@@ -49,10 +57,13 @@ HTMLActuator.prototype.addTile = function (tile) {
var wrapper = document.createElement("div"); var wrapper = document.createElement("div");
var inner = document.createElement("div"); var inner = document.createElement("div");
var position = tile.previousPosition || { x: tile.x, y: tile.y }; var position = tile.previousPosition || { x: tile.x, y: tile.y };
positionClass = this.positionClass(position); var positionClass = this.positionClass(position);
// We can't use classlist because it somehow glitches when replacing classes // We can't use classlist because it somehow glitches when replacing classes
var classes = ["tile", "tile-" + tile.value, positionClass]; var classes = ["tile", "tile-" + tile.value, positionClass];
if (tile.value > 2048) classes.push("tile-super");
this.applyClasses(wrapper, classes); this.applyClasses(wrapper, classes);
inner.classList.add("tile-inner"); inner.classList.add("tile-inner");
......
...@@ -53,10 +53,14 @@ KeyboardInputManager.prototype.listen = function () { ...@@ -53,10 +53,14 @@ KeyboardInputManager.prototype.listen = function () {
} }
}); });
var retry = document.getElementsByClassName("retry-button")[0]; var retry = document.querySelector(".retry-button");
retry.addEventListener("click", this.restart.bind(this)); retry.addEventListener("click", this.restart.bind(this));
retry.addEventListener("touchend", this.restart.bind(this)); retry.addEventListener("touchend", this.restart.bind(this));
var keepPlaying = document.querySelector(".keep-playing-button");
keepPlaying.addEventListener("click", this.keepPlaying.bind(this));
keepPlaying.addEventListener("touchend", this.keepPlaying.bind(this));
// Listen to swipe events // Listen to swipe events
var touchStartClientX, touchStartClientY; var touchStartClientX, touchStartClientY;
var gameContainer = document.getElementsByClassName("game-container")[0]; var gameContainer = document.getElementsByClassName("game-container")[0];
...@@ -93,3 +97,8 @@ KeyboardInputManager.prototype.restart = function (event) { ...@@ -93,3 +97,8 @@ KeyboardInputManager.prototype.restart = function (event) {
event.preventDefault(); event.preventDefault();
this.emit("restart"); this.emit("restart");
}; };
KeyboardInputManager.prototype.keepPlaying = function (event) {
event.preventDefault();
this.emit("keepPlaying");
};
...@@ -19,12 +19,25 @@ window.fakeStorage = { ...@@ -19,12 +19,25 @@ window.fakeStorage = {
}; };
function LocalScoreManager() { function LocalScoreManager() {
var localSupported = !!window.localStorage;
this.key = "bestScore"; this.key = "bestScore";
this.storage = localSupported ? window.localStorage : window.fakeStorage;
var supported = this.localStorageSupported();
this.storage = supported ? window.localStorage : window.fakeStorage;
} }
LocalScoreManager.prototype.localStorageSupported = function () {
var testKey = "test";
var storage = window.localStorage;
try {
storage.setItem(testKey, "1");
storage.removeItem(testKey);
return true;
} catch (error) {
return false;
}
};
LocalScoreManager.prototype.get = function () { LocalScoreManager.prototype.get = function () {
return this.storage.getItem(this.key) || 0; return this.storage.getItem(this.key) || 0;
}; };
......
...@@ -193,6 +193,8 @@ hr { ...@@ -193,6 +193,8 @@ hr {
height: 40px; height: 40px;
line-height: 42px; line-height: 42px;
margin-left: 9px; } margin-left: 9px; }
.game-container .game-message a.keep-playing-button {
display: none; }
.game-container .game-message .score-sharing { .game-container .game-message .score-sharing {
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
...@@ -200,6 +202,8 @@ hr { ...@@ -200,6 +202,8 @@ hr {
.game-container .game-message.game-won { .game-container .game-message.game-won {
background: rgba(237, 194, 46, 0.5); background: rgba(237, 194, 46, 0.5);
color: #f9f6f2; } color: #f9f6f2; }
.game-container .game-message.game-won a.keep-playing-button {
display: inline-block; }
.game-container .game-message.game-won, .game-container .game-message.game-over { .game-container .game-message.game-won, .game-container .game-message.game-over {
display: block; } display: block; }
...@@ -372,6 +376,13 @@ hr { ...@@ -372,6 +376,13 @@ hr {
@media screen and (max-width: 480px) { @media screen and (max-width: 480px) {
.tile.tile-2048 .tile-inner { .tile.tile-2048 .tile-inner {
font-size: 15px; } } font-size: 15px; } }
.tile.tile-super .tile-inner {
color: #f9f6f2;
background: #3c3a32;
font-size: 30px; }
@media screen and (max-width: 480px) {
.tile.tile-super .tile-inner {
font-size: 10px; } }
@-webkit-keyframes appear { @-webkit-keyframes appear {
0% { 0% {
...@@ -564,6 +575,8 @@ hr { ...@@ -564,6 +575,8 @@ hr {
height: 40px; height: 40px;
line-height: 42px; line-height: 42px;
margin-left: 9px; } margin-left: 9px; }
.game-container .game-message a.keep-playing-button {
display: none; }
.game-container .game-message .score-sharing { .game-container .game-message .score-sharing {
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
...@@ -571,6 +584,8 @@ hr { ...@@ -571,6 +584,8 @@ hr {
.game-container .game-message.game-won { .game-container .game-message.game-won {
background: rgba(237, 194, 46, 0.5); background: rgba(237, 194, 46, 0.5);
color: #f9f6f2; } color: #f9f6f2; }
.game-container .game-message.game-won a.keep-playing-button {
display: inline-block; }
.game-container .game-message.game-won, .game-container .game-message.game-over { .game-container .game-message.game-won, .game-container .game-message.game-over {
display: block; } display: block; }
......
...@@ -218,6 +218,10 @@ hr { ...@@ -218,6 +218,10 @@ hr {
@include button; @include button;
margin-left: 9px; margin-left: 9px;
// margin-top: 59px; // margin-top: 59px;
&.keep-playing-button {
display: none;
}
} }
.score-sharing { .score-sharing {
...@@ -232,6 +236,10 @@ hr { ...@@ -232,6 +236,10 @@ hr {
&.game-won { &.game-won {
background: rgba($tile-gold-color, .5); background: rgba($tile-gold-color, .5);
color: $bright-text-color; color: $bright-text-color;
a.keep-playing-button {
display: inline-block;
}
} }
&.game-won, &.game-over { &.game-won, &.game-over {
...@@ -391,6 +399,18 @@ hr { ...@@ -391,6 +399,18 @@ hr {
$exponent: $exponent + 1; $exponent: $exponent + 1;
} }
// Super tiles (above 2048)
&.tile-super .tile-inner {
color: $bright-text-color;
background: mix(#333, $tile-gold-color, 95%);
font-size: 30px;
@include smaller(480px) {
font-size: 10px;
}
}
} }
@include keyframes(appear) { @include keyframes(appear) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册