h5p-memory-game/memory-game.js

180 lines
4.9 KiB
JavaScript
Raw Normal View History

H5P.MemoryGame = (function (EventDispatcher, $) {
2014-03-28 14:52:41 +01:00
/**
* Memory Game Constructor
2014-03-28 14:52:41 +01:00
*
* @class
2014-03-28 14:52:41 +01:00
* @param {Object} parameters
* @param {Number} id
*/
function MemoryGame(parameters, id) {
2014-03-28 14:52:41 +01:00
var self = this;
// Initialize event inheritance
EventDispatcher.call(self);
2014-03-28 14:52:41 +01:00
var flipped, timer, counter, popup, $feedback;
var cards = [];
var removed = 0;
2014-03-28 14:52:41 +01:00
2016-10-02 16:09:34 +02:00
/**
* Update the time on the screen
*
* @private
* @param {H5P.jQuery} $container - element to be updated
* @param {H5P.Timer} timer - the timer containing the time
*/
var updateDisplayTime = function($container, timer) {
var time = timer.getTime();
var minutes = H5P.Timer.extractTimeElement(time, 'minutes');
var seconds = H5P.Timer.extractTimeElement(time, 'seconds');
if (seconds < 10) {
seconds = '0' + seconds;
}
$container.text(minutes + ':' + seconds);
}
2014-03-28 14:52:41 +01:00
/**
* Check if these two cards belongs together.
2014-03-28 14:52:41 +01:00
*
* @private
* @param {H5P.MemoryGame.Card} card
* @param {H5P.MemoryGame.Card} mate
* @param {H5P.MemoryGame.Card} correct
2014-03-28 14:52:41 +01:00
*/
var check = function (card, mate, correct) {
if (mate === correct) {
// Remove them from the game.
card.remove();
mate.remove();
2014-03-28 14:52:41 +01:00
removed += 2;
var finished = (removed === cards.length);
var desc = card.getDescription();
if (finished) {
self.triggerXAPIScored(1, 1, 'completed');
}
if (desc !== undefined) {
// Pause timer and show desciption.
2016-10-02 16:09:34 +02:00
timer.pause();
2015-08-26 15:51:43 +02:00
popup.show(desc, card.getImage(), function () {
if (finished) {
// Game has finished
$feedback.addClass('h5p-show');
}
else {
// Popup is closed, continue.
2016-10-02 16:09:34 +02:00
timer.play();
}
});
}
else if (finished) {
// Game has finished
2014-03-28 14:52:41 +01:00
timer.stop();
$feedback.addClass('h5p-show');
}
}
else {
// Flip them back
card.flipBack();
mate.flipBack();
}
};
2014-03-28 14:52:41 +01:00
/**
* Adds card to card list and set up a flip listener.
2014-03-28 14:52:41 +01:00
*
* @private
* @param {H5P.MemoryGame.Card} card
* @param {H5P.MemoryGame.Card} mate
2014-03-28 14:52:41 +01:00
*/
var addCard = function (card, mate) {
card.on('flip', function () {
self.triggerXAPI('interacted');
2014-03-28 14:52:41 +01:00
// Keep track of time spent
2016-10-02 16:09:34 +02:00
timer.play();
2014-03-28 14:52:41 +01:00
if (flipped !== undefined) {
var matie = flipped;
// Reset the flipped card.
flipped = undefined;
2014-03-28 14:52:41 +01:00
setTimeout(function () {
check(card, matie, mate);
}, 800);
}
else {
// Keep track of the flipped card.
flipped = card;
}
2014-03-28 14:52:41 +01:00
// Count number of cards turned
counter.increment();
});
2014-03-28 14:52:41 +01:00
cards.push(card);
};
2014-03-28 14:52:41 +01:00
// Initialize cards.
for (var i = 0; i < parameters.cards.length; i++) {
if (MemoryGame.Card.isValid(parameters.cards[i])) {
// Add two of each card
var cardOne = new MemoryGame.Card(parameters.cards[i], id);
var cardTwo = new MemoryGame.Card(parameters.cards[i], id);
addCard(cardOne, cardTwo);
addCard(cardTwo, cardOne);
}
2014-03-28 14:52:41 +01:00
}
H5P.shuffleArray(cards);
2014-03-28 14:52:41 +01:00
/**
* Attach this game's html to the given container.
2014-03-28 14:52:41 +01:00
*
* @param {H5P.jQuery} $container
2014-03-28 14:52:41 +01:00
*/
self.attach = function ($container) {
this.triggerXAPI('attempted');
// TODO: Only create on first!
2014-03-28 14:52:41 +01:00
$container.addClass('h5p-memory-game').html('');
2014-03-28 14:52:41 +01:00
// Add cards to list
var $list = $('<ul/>');
for (var i = 0; i < cards.length; i++) {
cards[i].appendTo($list);
}
2014-03-28 14:52:41 +01:00
if ($list.children().length) {
$list.appendTo($container);
2014-03-28 14:52:41 +01:00
$feedback = $('<div class="h5p-feedback">' + parameters.l10n.feedback + '</div>').appendTo($container);
2014-03-28 14:52:41 +01:00
// Add status bar
var $status = $('<dl class="h5p-status">' +
'<dt>' + parameters.l10n.timeSpent + '</dt>' +
'<dd class="h5p-time-spent">0:00</dd>' +
'<dt>' + parameters.l10n.cardTurns + '</dt>' +
'<dd class="h5p-card-turns">0</dd>' +
'</dl>').appendTo($container);
2016-10-02 16:09:34 +02:00
timer = new H5P.Timer(100);
timer.notifyEvery(H5P.Timer.TYPE_CLOCK, 0, 1000, updateDisplayTime, [$status.find('.h5p-time-spent'), timer]);
counter = new MemoryGame.Counter($status.find('.h5p-card-turns'));
popup = new MemoryGame.Popup($container);
$container.click(function () {
popup.close();
});
2014-03-28 14:52:41 +01:00
}
};
}
// Extends the event dispatcher
MemoryGame.prototype = Object.create(EventDispatcher.prototype);
MemoryGame.prototype.constructor = MemoryGame;
2014-03-28 14:52:41 +01:00
return MemoryGame;
})(H5P.EventDispatcher, H5P.jQuery);