提交 02b66ccb 编写于 作者: G Gabriele Cirulli

add retry button

上级 2c066a55
......@@ -22,6 +22,11 @@
<p class="game-intro">Join the numbers and get to the <strong>2048 tile!</strong></p>
<div class="game-container">
<div class="game-message">
<p></p>
<a class="retry-button">Try again</a>
</div>
<div class="grid-container">
<div class="grid-row">
<div class="grid-cell"></div>
......
......@@ -4,19 +4,28 @@ function GameManager(size, InputManager, Actuator) {
this.actuator = new Actuator;
this.startTiles = 2;
this.grid = new Grid(this.size);
this.score = 0;
this.over = false;
this.won = false;
this.inputManager.on("move", this.move.bind(this));
this.inputManager.on("restart", this.restart.bind(this));
this.setup();
}
// Restart the game
GameManager.prototype.restart = function () {
this.actuator.restart();
this.setup();
};
// Set up the game
GameManager.prototype.setup = function () {
this.grid = new Grid(this.size);
this.score = 0;
this.over = false;
this.won = false;
// Add the initial tiles
this.addStartTiles();
// Update the actuator
......
function HTMLActuator() {
this.tileContainer = document.getElementsByClassName("tile-container")[0];
this.gameContainer = document.getElementsByClassName("game-container")[0];
this.scoreContainer = document.getElementsByClassName("score-container")[0];
this.tileContainer = document.getElementsByClassName("tile-container")[0];
this.scoreContainer = document.getElementsByClassName("score-container")[0];
this.messageContainer = document.getElementsByClassName("game-message")[0];
this.score = 0;
}
......@@ -27,6 +27,10 @@ HTMLActuator.prototype.actuate = function (grid, metadata) {
});
};
HTMLActuator.prototype.restart = function () {
this.clearMessage();
};
HTMLActuator.prototype.clearContainer = function (container) {
while (container.firstChild) {
container.removeChild(container.firstChild);
......@@ -77,7 +81,7 @@ HTMLActuator.prototype.updateScore = function (score) {
this.scoreContainer.textContent = this.score;
if (difference) {
if (difference > 0) {
var addition = document.createElement("div");
addition.classList.add("score-addition");
addition.textContent = "+" + difference;
......@@ -87,6 +91,15 @@ HTMLActuator.prototype.updateScore = function (score) {
};
HTMLActuator.prototype.message = function (won) {
var type = won ? "game-won" : "game-over";
this.gameContainer.classList.add(type);
if (ga) ga("send", "event", "game", "end", type, this.score);
var type = won ? "game-won" : "game-over";
var message = won ? "You win!" : "Game over!"
this.messageContainer.classList.add(type);
this.messageContainer.getElementsByTagName("p")[0].textContent = message;
};
HTMLActuator.prototype.clearMessage = function () {
this.messageContainer.classList.remove("game-won", "game-over");
};
......@@ -40,4 +40,10 @@ KeyboardInputManager.prototype.listen = function () {
self.emit("move", mapped);
}
});
var retry = document.getElementsByClassName("retry-button")[0];
retry.addEventListener("click", function (event) {
event.preventDefault();
self.emit("restart");
});
};
......@@ -94,7 +94,8 @@ p {
a {
color: #776e65;
font-weight: bold;
text-decoration: underline; }
text-decoration: underline;
cursor: pointer; }
strong.important {
text-transform: uppercase; }
......@@ -143,30 +144,41 @@ hr {
width: 500px;
height: 500px;
box-sizing: border-box; }
.game-container.game-over:after, .game-container.game-won:after {
.game-container .game-message {
display: none;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: block;
background: rgba(238, 228, 218, 0.5);
text-align: center;
height: 500px;
line-height: 500px;
z-index: 100;
font-size: 60px;
font-weight: bold;
text-align: center;
-webkit-animation: fade-in 800ms ease 1200ms;
-moz-animation: fade-in 800ms ease 1200ms;
-webkit-animation-fill-mode: both;
-moz-animation-fill-mode: both; }
.game-container.game-over:after {
content: "Game over!"; }
.game-container.game-won:after {
content: "You win!";
background: rgba(237, 194, 46, 0.5);
color: #f9f6f2; }
.game-container .game-message p {
font-size: 60px;
font-weight: bold;
height: 60px;
line-height: 60px;
margin-top: 222px; }
.game-container .game-message a {
display: inline-block;
background: #a69382;
border-radius: 3px;
padding: 0 20px;
text-decoration: none;
color: #f9f6f2;
height: 40px;
line-height: 42px;
margin-top: 59px; }
.game-container .game-message.game-won {
background: rgba(237, 194, 46, 0.5);
color: #f9f6f2; }
.game-container .game-message.game-won, .game-container .game-message.game-over {
display: block; }
.grid-container {
position: absolute;
......
......@@ -110,6 +110,7 @@ a {
color: $text-color;
font-weight: bold;
text-decoration: underline;
cursor: pointer;
}
strong {
......@@ -156,35 +157,52 @@ hr {
height: $field-width;
box-sizing: border-box;
&.game-over, &.game-won {
&:after {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: block;
background: rgba($tile-color, .5);
text-align: center;
height: $field-width;
line-height: $field-width;
z-index: 100;
.game-message {
display: none;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: rgba($tile-color, .5);
z-index: 100;
text-align: center;
p {
font-size: 60px;
font-weight: bold;
height: 60px;
line-height: 60px;
margin-top: 222px;
// height: $field-width;
// line-height: $field-width;
}
@include animation(fade-in 800ms ease $transition-speed * 12);
@include animation-fill-mode(both);
a {
display: inline-block;
background: darken($game-container-background, 10%);
border-radius: 3px;
padding: 0 20px;
text-decoration: none;
color: $bright-text-color;
height: 40px;
line-height: 42px;
margin-top: 59px;
}
}
&.game-over:after {
content: "Game over!";
}
@include animation(fade-in 800ms ease $transition-speed * 12);
@include animation-fill-mode(both);
&.game-won:after {
content: "You win!";
background: rgba($tile-gold-color, .5);
color: $bright-text-color;
&.game-won {
background: rgba($tile-gold-color, .5);
color: $bright-text-color;
}
&.game-won, &.game-over {
display: block;
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册