diff --git a/src/game/lib/realtime_stage_timer.js b/src/game/lib/realtime_stage_timer.js index 043a3fd..685ccd1 100644 --- a/src/game/lib/realtime_stage_timer.js +++ b/src/game/lib/realtime_stage_timer.js @@ -1,11 +1,13 @@ -function RealtimeStageTimer(timeLimitMS) { - this.timeLimit = timeLimitMS; +function RealtimeStageTimer(timeLimitSec) { + this.timeLimit = timeLimitSec; this.startTime = 0; this.elapsedTime = 0; + this.isStarted = false; this.isPaused = true; this.onTimeUpdate = null; + this.onTimeOver = null; this.timerEvent = null; } @@ -14,7 +16,14 @@ RealtimeStageTimer.prototype.setTimeUpdateEvent = function(eventMethod) { this.onTimeUpdate = eventMethod; } +RealtimeStageTimer.prototype.setTimeOverEvent = function(eventMethod) { + this.onTimeOver = eventMethod; +} + RealtimeStageTimer.prototype.start = function() { + if(this.isStarted === true) + return; + this.isPaused = false; this.startTime = game.time.totalElapsedSeconds(); @@ -27,13 +36,22 @@ RealtimeStageTimer.prototype.start = function() { RealtimeStageTimer.prototype.pause = function() { this.isPaused = true; + + this.sendElapsedTime(); } RealtimeStageTimer.prototype.resume = function() { this.isPaused = false; + + this.sendElapsedTime(); } RealtimeStageTimer.prototype.stop = function() { + this.isStarted = false; + this.isPaused = true; + + this.sendElapsedTime(); + var recordTime = game.time.totalElapsedSeconds() - this.startTime; this.removeTimer(); @@ -45,6 +63,17 @@ RealtimeStageTimer.prototype.updateTimer = function() { return; this.elapsedTime = game.time.totalElapsedSeconds() - this.startTime; + + var timeLeft = this.timeLimit - this.elapsedTime; + if(timeLeft < 0) { + this.stop(); + + if(this.onTimeOver !== null) + this.onTimeOver(); + + return; + } + this.sendElapsedTime(); } diff --git a/src/game/lib/util/time_util.js b/src/game/lib/util/time_util.js index 6d04e99..29d47d6 100644 --- a/src/game/lib/util/time_util.js +++ b/src/game/lib/util/time_util.js @@ -46,6 +46,87 @@ TimeUtil.getTwoDigitSecondFromMS = function(timeMS) { +TimeUtil.getFullHourFromSec = function(timeSec) { + return Math.floor(timeSec / TimeUtil.HOUR_SEC); +} + +TimeUtil.getHourFromSec = function(timeSec) { + return TimeUtil.getFullHourFromSec(timeSec) % 24; +} + +TimeUtil.getTwoDigitHourFromSec = function(timeSec) { + var twoDigitHour = TimeUtil.getHourFromSec(timeSec); + return StringUtil.getNumberStartWithZero(twoDigitHour, 2); +} + + +TimeUtil.getFullMinuteFromSec = function(timeSec) { + return Math.floor(timeSec / TimeUtil.MINUTE_SEC); +} + +TimeUtil.getMinuteFromSec = function(timeSec) { + return TimeUtil.getFullMinuteFromSec(timeSec) % 60; +} + +TimeUtil.getTwoDigitMinuteFromSec = function(timeSec) { + var twoDigitMinute = TimeUtil.getMinuteFromSec(timeSec); + return StringUtil.getNumberStartWithZero(twoDigitMinute, 2); +} + + +TimeUtil.getFullSecondFromSec = function(timeSec) { + return Math.floor(timeSec / TimeUtil.SECOND_SEC); +} + +TimeUtil.getSecondFromSec = function(timeSec) { + return TimeUtil.getFullSecondFromSec(timeSec) % 60; +} + +TimeUtil.getTwoDigitSecondFromSec = function(timeSec) { + var twoDigitSecond = TimeUtil.getSecondFromSec(timeSec); + return StringUtil.getNumberStartWithZero(twoDigitSecond, 2); +} + + + +TimeUtil.printTimeFromSec = function(timeSec) { + var fullTime = ""; + + var twoDigitHour = TimeUtil.getTwoDigitHourFromSec(timeSec); + if(twoDigitHour !== "00") + fullTime = twoDigitHour + "시간 "; + + var twoDigitMinute = TimeUtil.getTwoDigitMinuteFromSec(timeSec); + if(twoDigitMinute !== "00") + fullTime = fullTime + twoDigitMinute + "분 "; + + var twoDigitSecond = TimeUtil.getTwoDigitSecondFromSec(timeSec); + fullTime = fullTime + twoDigitSecond + "초"; + + return fullTime; +} + + +TimeUtil.printHHMMSSFromSec = function(timeSec) { + var fullTime = ""; + + var twoDigitHour = TimeUtil.getTwoDigitHourFromSec(timeSec); + if(twoDigitHour !== "00") + fullTime = twoDigitHour + ":"; + + var twoDigitMinute = TimeUtil.getTwoDigitMinuteFromSec(timeSec); + if(twoDigitMinute !== "00") + fullTime = fullTime + twoDigitMinute + ":"; + + var twoDigitSecond = TimeUtil.getTwoDigitSecondFromSec(timeSec); + fullTime = fullTime + twoDigitSecond; + + return fullTime; +} + + + + TimeUtil.getYYYYMMDD = function(date) { // return date.toISOString().slice(0,10); @@ -75,4 +156,10 @@ TimeUtil.printMonthDay = function(date) { TimeUtil.SECOND_MS = 1000; TimeUtil.MINUTE_MS = TimeUtil.SECOND_MS * 60; TimeUtil.HOUR_MS = TimeUtil.MINUTE_MS * 60; -TimeUtil.DAY_MS = TimeUtil.HOUR_MS * 24; \ No newline at end of file +TimeUtil.DAY_MS = TimeUtil.HOUR_MS * 24; + + +TimeUtil.SECOND_SEC = 1; +TimeUtil.MINUTE_SEC = TimeUtil.SECOND_SEC * 60; +TimeUtil.HOUR_SEC = TimeUtil.MINUTE_SEC * 60; +TimeUtil.DAY_SEC = TimeUtil.HOUR_SEC * 24; \ No newline at end of file diff --git a/src/game/typing/examination/game.js b/src/game/typing/examination/game.js index 54c6a30..1522161 100644 --- a/src/game/typing/examination/game.js +++ b/src/game/typing/examination/game.js @@ -46,26 +46,22 @@ TypingExamination.prototype.create = function() { this.averageTypingSpeedText = new AverageTypingSpeed(); - this.textTimer = this.makeDefaultText(960, 30); - this.textTimer.anchor.set(1, 0.5); - this.textTimer.fontSize = 30; + this.textTimer = null; + this.realtimeStageTimer = new RealtimeStageTimer(TypingExamination.GAME_TIME_SEC); + this.realtimeStageTimer.setTimeUpdateEvent( + (function(timeLeftSec) { + if(this.textTimer === null) + return; - this.stageTimer = new RealtimeStageTimer(Phaser.Timer.SECOND * 300); - this.stageTimer.setTimeUpdateEvent( - (function(timeLeftMS) { - this.textTimer.text = "남은 시간 : " + Math.floor(timeLeftMS); + this.textTimer.text = TimeUtil.printHHMMSSFromSec(timeLeftSec); }).bind(this) ); - this.stageTimer.start(); - /* - this.stageTimer = new StageTimer( - TypingExamination.GAME_TIME_SEC, + this.realtimeStageTimer.setTimeOverEvent( (function() { - // this.setClickEnable(false); - this.timeOver(); + this.textTimer.text = "타임 오버"; + console.log("Time over"); }).bind(this) ); - */ // bottom ui @@ -82,6 +78,7 @@ TypingExamination.prototype.fontLoaded = function() { // this.animalRecordList.hide(); this.animalRecordList.applyLoadedFont(); + this.makeStageTimerText(); this.makeTextContents(); } @@ -96,6 +93,13 @@ TypingExamination.prototype.makeDefaultText = function(x, y) { return defaultText; } +TypingExamination.prototype.makeStageTimerText = function() { + this.textTimer = this.makeDefaultText(960, 30); + this.textTimer.anchor.set(1, 0.5); + this.textTimer.fontSize = 30; + this.textTimer.text = TimeUtil.printHHMMSSFromSec(TypingExamination.GAME_TIME_SEC); +} + TypingExamination.prototype.makeUnderlineText = function(x, y) { var CONTENT_TEXT_WIDTH = 800; var CONTENT_UNDERLINE_OFFSET_Y = 20; // 17; @@ -278,7 +282,7 @@ TypingExamination.prototype.startGame = function() { this.showTypingExaminationContents(); this.showPlayingWordNumber(); - // this.stageTimer.start(); + this.realtimeStageTimer.start(); } TypingExamination.prototype.timeOver = function() { @@ -290,7 +294,7 @@ TypingExamination.prototype.gameOver = function() { var missionClearText = new MissionClearText(); this.stopAndGoResult(); - // this.stageTimer.pause(); + this.realtimeStageTimer.pause(); } TypingExamination.prototype.stopAndGoResult = function() { @@ -636,7 +640,7 @@ TypingExamination.prototype.setTimeTypingStart = function() { } -TypingExamination.GAME_TIME_SEC = 60 * 5; // 5 minutes +TypingExamination.GAME_TIME_SEC = TimeUtil.MINUTE_SEC * 5; // 5 minutes TypingExamination.SPACE_INDICATOR = "␣"; // "ˇ"; // "ᵔ"; // "ᵕ"; // "ˣ"; // "ᵛ"; // " · "; TypingExamination.ENTER_INDICATOR = "⏎"; // "↵"; // "↵"; diff --git a/src/web/client/typing_exam.html b/src/web/client/typing_exam.html index 5f34364..eb8f6d7 100644 --- a/src/web/client/typing_exam.html +++ b/src/web/client/typing_exam.html @@ -46,6 +46,7 @@ + diff --git a/test/tdd.js b/test/tdd.js index a454884..86c4a6e 100644 --- a/test/tdd.js +++ b/test/tdd.js @@ -46,6 +46,8 @@ QUnit.test( "TimeUtil", function( assert ) { assert.equal(TimeUtil.getHourFromMS(testTimeMS), 9, "getHourFromMS"); assert.equal(TimeUtil.getTwoDigitHourFromMS(testTimeMS), "09", "getTwoDigitHourFromMS"); + testTimeMS = 3000; + assert.equal(TimeUtil.getTwoDigitSecondFromMS(testTimeMS), "03", "getTwoDigitHourFromMS"); });