diff --git a/src/game/lib/realtime_stage_timer.js b/src/game/lib/realtime_stage_timer.js new file mode 100644 index 0000000..043a3fd --- /dev/null +++ b/src/game/lib/realtime_stage_timer.js @@ -0,0 +1,78 @@ +function RealtimeStageTimer(timeLimitMS) { + this.timeLimit = timeLimitMS; + + this.startTime = 0; + this.elapsedTime = 0; + this.isPaused = true; + + this.onTimeUpdate = null; + + this.timerEvent = null; +} + +RealtimeStageTimer.prototype.setTimeUpdateEvent = function(eventMethod) { + this.onTimeUpdate = eventMethod; +} + +RealtimeStageTimer.prototype.start = function() { + this.isPaused = false; + this.startTime = game.time.totalElapsedSeconds(); + + this.elapsedTimer = game.time.create(false); + this.timerEvent = this.elapsedTimer.loop(10, this.updateTimer, this); + this.elapsedTimer.start(); + + this.sendElapsedTime(); +} + +RealtimeStageTimer.prototype.pause = function() { + this.isPaused = true; +} + +RealtimeStageTimer.prototype.resume = function() { + this.isPaused = false; +} + +RealtimeStageTimer.prototype.stop = function() { + var recordTime = game.time.totalElapsedSeconds() - this.startTime; + this.removeTimer(); + + return recordTime; +} + +RealtimeStageTimer.prototype.updateTimer = function() { + if(this.isPaused == true) + return; + + this.elapsedTime = game.time.totalElapsedSeconds() - this.startTime; + this.sendElapsedTime(); +} + +RealtimeStageTimer.prototype.sendElapsedTime = function() { + if(this.onTimeUpdate === null) + return; + + var timeLeft = this.timeLimit - this.elapsedTime; + this.onTimeUpdate(timeLeft); +} + +RealtimeStageTimer.prototype.removeTimer = function() { + game.time.events.remove(this.timerEvent); + if(this.timerEvent) + this.timerEvent = null; + + this.elapsedTimer.stop(); + this.elapsedTimer = null; +} + + + +RealtimeStageTimer.FONT_HEIGHT_PX = 70; + +RealtimeStageTimer.DEFAULT_TEXT_FONT = { + font: "38px Arial", + align: "center", + boundsAlignH: "center", // left, center. right + boundsAlignV: "middle", // top, middle, bottom + fill: "#fff" +}; \ No newline at end of file diff --git a/src/game/lib/util/record_util.js b/src/game/lib/util/record_util.js index ce86b57..2883f05 100644 --- a/src/game/lib/util/record_util.js +++ b/src/game/lib/util/record_util.js @@ -16,7 +16,7 @@ RecordUtil.getRecordValueText = function(record, appID) { } RecordUtil.getRecordUnit = function(appID) { - if(appID == 104 || appID == 105) // dodge + if(appID == 104 || appID == 105) // 104 : dodge, 105 : one to fifty return " 초"; else if(appID == 52 || appID == 53) // word flyingsaucer return " 점"; diff --git a/src/game/lib/util/time_util.js b/src/game/lib/util/time_util.js new file mode 100644 index 0000000..6d04e99 --- /dev/null +++ b/src/game/lib/util/time_util.js @@ -0,0 +1,78 @@ +function TimeUtil() { +} + + +TimeUtil.getFullHourFromMS = function(timeMS) { + return Math.floor(timeMS / TimeUtil.HOUR_MS); +} + +TimeUtil.getHourFromMS = function(timeMS) { + return TimeUtil.getFullHourFromMS(timeMS) % 24; +} + +TimeUtil.getTwoDigitHourFromMS = function(timeMS) { + var twoDigitHour = TimeUtil.getHourFromMS(timeMS); + return StringUtil.getNumberStartWithZero(twoDigitHour, 2); +} + + +TimeUtil.getFullMinuteFromMS = function(timeMS) { + return Math.floor(timeMS / TimeUtil.MINUTE_MS); +} + +TimeUtil.getMinuteFromMS = function(timeMS) { + return TimeUtil.getFullMinuteFromMS(timeMS) % 60; +} + +TimeUtil.getTwoDigitMinuteFromMS = function(timeMS) { + var twoDigitMinute = TimeUtil.getMinuteFromMS(timeMS); + return StringUtil.getNumberStartWithZero(twoDigitMinute, 2); +} + + +TimeUtil.getFullSecondFromMS = function(timeMS) { + return Math.floor(timeMS / TimeUtil.SECOND_MS); +} + +TimeUtil.getSecondFromMS = function(timeMS) { + return TimeUtil.getFullSecondFromMS(timeMS) % 60; +} + +TimeUtil.getTwoDigitSecondFromMS = function(timeMS) { + var twoDigitSecond = TimeUtil.getSecondFromMS(timeMS); + return StringUtil.getNumberStartWithZero(twoDigitSecond, 2); +} + + + + + +TimeUtil.getYYYYMMDD = function(date) { + // return date.toISOString().slice(0,10); + return TimeUtil.getFullYear(date) + "-" + + TimeUtil.getFullMonth(date) + "-" + + TimeUtil.getFullDate(date); +} + +TimeUtil.getHHMMSS = function(date) { + return TimeUtil.getFullHours(date) + ":" + + TimeUtil.getFullMinutes(date) + ":" + + TimeUtil.getFullSeconds(date); +} + +TimeUtil.printMonthDay = function(date) { + // var dateTime = new Date(date); + var a = date.split(" "); + var d = a[0].split("-"); + var t = "0:0:0".split(":"); + if(a.count > 0) + var t = a[1].split(":"); + var dateTime = new Date(d[0],(d[1]-1),d[2],t[0],t[1],t[2]); + return TimeUtil.getFullMonth(dateTime) + "월 " + TimeUtil.getFullDate(dateTime) + "일"; +} + + +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 diff --git a/src/game/typing/examination/game.js b/src/game/typing/examination/game.js index 52334b5..54c6a30 100644 --- a/src/game/typing/examination/game.js +++ b/src/game/typing/examination/game.js @@ -46,6 +46,18 @@ 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.stageTimer = new RealtimeStageTimer(Phaser.Timer.SECOND * 300); + this.stageTimer.setTimeUpdateEvent( + (function(timeLeftMS) { + this.textTimer.text = "남은 시간 : " + Math.floor(timeLeftMS); + }).bind(this) + ); + this.stageTimer.start(); + /* this.stageTimer = new StageTimer( TypingExamination.GAME_TIME_SEC, (function() { @@ -53,6 +65,7 @@ TypingExamination.prototype.create = function() { this.timeOver(); }).bind(this) ); + */ // bottom ui @@ -209,9 +222,9 @@ TypingExamination.prototype.makeTextContents = function() { this.inputTextContent.canvasInput.placeHolder(""); // inputTextContent.canvasInput._onkeydown = this.checkInputText; this.inputTextContent.canvasInput._onkeyup = (function() { - this.checkTypingContents(event); + this.onKeyUp(event); // warning - // : checkTypingContents is called onkeyup and onkeydown + // : onKeyUp is called onkeyup and onkeydown }).bind(this); this.loadExaminationContent(); @@ -265,7 +278,7 @@ TypingExamination.prototype.startGame = function() { this.showTypingExaminationContents(); this.showPlayingWordNumber(); - this.stageTimer.start(); + // this.stageTimer.start(); } TypingExamination.prototype.timeOver = function() { @@ -277,7 +290,7 @@ TypingExamination.prototype.gameOver = function() { var missionClearText = new MissionClearText(); this.stopAndGoResult(); - this.stageTimer.pause(); + // this.stageTimer.pause(); } TypingExamination.prototype.stopAndGoResult = function() { @@ -393,6 +406,7 @@ TypingExamination.prototype.completeLoadingWriting = function() { this.typingExaminationContents = typingTextMan.getContents(); // console.log(this.typingExaminationContents.length); // console.log(this.typingExaminationContents[this.typingExaminationContents.length - 1]); + var lastSentence = this.typingExaminationContents[this.typingExaminationContents.length - 1]; if(lastSentence[lastSentence.length - 1] !== TypingExamination.ENTER_INDICATOR) this.typingExaminationContents[this.typingExaminationContents.length - 1] += TypingExamination.ENTER_INDICATOR; @@ -427,7 +441,6 @@ TypingExamination.prototype.showTypingExaminationContents = function() { } else { // console.log(this.typingExaminationContents[doneIndex] + "/"); this.textTypingContentsDone[i].text = this.typingExaminationContents[doneIndex]; - // this.textDoneLineNumber[i].text = NumberUtil.getRecordText(Math.floor(this.typingRecordForLines[doneIndex])); var lineNumber = this.typingContentLength - doneIndex; this.textDoneLineNumber[i].text = NumberUtil.numberWithCommas(lineNumber) + " "; @@ -463,14 +476,18 @@ TypingExamination.prototype.resetTypingContent = function() { this.inputTextContent.canvasInput.value(''); } -TypingExamination.prototype.checkTypingContents = function(event) { +TypingExamination.prototype.onKeyUp = function(event) { if(this.isGameOver) return; + if(this.isTyping == false) { + // console.log(event); + this.setTimeTypingStart(); + } + //not trimmed contents var notTrimmedInputContent = this.inputTextContent.canvasInput.value(); var notTrimmedTypingContent = this.typingExaminationContents[this.typingIndex]; - this.showTypingContentHighlight(notTrimmedInputContent, notTrimmedTypingContent); // trimmed contents // var inputContent = inputText.replace(/ /g, TypingExamination.SPACE_INDICATOR); @@ -479,64 +496,65 @@ TypingExamination.prototype.checkTypingContents = function(event) { var trimmedTypingContent = this.typingExaminationContents[this.typingIndex].trim(); trimmedTypingContent = trimmedTypingContent.replace(TypingExamination.ENTER_INDICATOR, ""); - if(event.keyCode == Phaser.Keyboard.ENTER || - event.keyCode == Phaser.Keyboard.SPACEBAR) { - // console.log("### enter ###"); - // console.log("this.typingIndex : " + this.typingIndex); - // console.log("trimmedInputContent : [" + trimmedInputContent + "], length : " + trimmedInputContent.length); - // console.log("trimmedTypingContent : [" + trimmedTypingContent + "], length : " + trimmedTypingContent.length); + this.highlightTypingContent(notTrimmedInputContent, notTrimmedTypingContent); - if(trimmedInputContent === trimmedTypingContent) { - // console.log("input completed"); - this.calculateTypingRecord(notTrimmedTypingContent); - - // console.log("this.typingIndex : " + this.typingIndex); - // console.log("this.trimmedTypingContentLength : " + this.trimmedTypingContentLength); - if(this.typingIndex == this.typingContentLength - 1) { - this.isGameOver = true; - this.gameOver(); - return; - } - - this.playNextContent(); - return; - } - } - - if(this.isTyping == false) { - // console.log(event); - this.setTimeTypingStart(); - } + if(event.keyCode == Phaser.Keyboard.ENTER) + this.onKeyEnter(trimmedInputContent, trimmedTypingContent, notTrimmedTypingContent); + if(event.keyCode == Phaser.Keyboard.SPACEBAR) + this.onKeyEnter(trimmedInputContent, trimmedTypingContent, notTrimmedTypingContent); } -TypingExamination.prototype.showTypingContentHighlight = function(inputContent, typingContent) { - // console.log(inputContent + "="); +TypingExamination.prototype.onKeyEnter = function(trimmedInputContent, trimmedTypingContent, notTrimmedTypingContent) { + // console.log("### enter ###"); + // console.log("this.typingIndex : " + this.typingIndex); + // console.log("trimmedInputContent : [" + trimmedInputContent + "], length : " + trimmedInputContent.length); + // console.log("trimmedTypingContent : [" + trimmedTypingContent + "], length : " + trimmedTypingContent.length); + + if(trimmedInputContent === trimmedTypingContent) { + // console.log("input completed"); + this.calculateTypingRecord(notTrimmedTypingContent); + + // console.log("this.typingIndex : " + this.typingIndex); + // console.log("this.trimmedTypingContentLength : " + this.trimmedTypingContentLength); + if(this.typingIndex == this.typingContentLength - 1) { + this.isGameOver = true; + this.gameOver(); + return; + } + + this.playNextContent(); + return; + } +} + +TypingExamination.prototype.highlightTypingContent = function(notTrimmedInputContent, notTrimmedTypingContent) { + // console.log(notTrimmedInputContent + "="); // console.log(typingContent + "="); - if(typingContent == null) + if(notTrimmedTypingContent == null) return; - // var replaceSpaceIndicatorInputContent = inputContent.replace(/ /g, TypingExamination.SPACE_INDICATOR); - var typingContentLength = typingContent.length; + // var replaceSpaceIndicatorInputContent = notTrimmedInputContent.replace(/ /g, TypingExamination.SPACE_INDICATOR); + var typingContentLength = notTrimmedTypingContent.length; for(var i = 0; i < typingContentLength; i++) { - var typingChar = typingContent.charAt(i); - var inputChar = inputContent.charAt(i); + var typingChar = notTrimmedTypingContent.charAt(i); + var inputChar = notTrimmedInputContent.charAt(i); // console.log("typingChar : " + typingChar); // console.log("inputChar : " + inputChar); // when typingChar is the last letter if(isNaN(inputChar)) { // console.log("NaN : " + i); - this.setCorrectText(typingContent.substring(0, i + 1)); + this.setCorrectText(notTrimmedTypingContent.substring(0, i + 1)); } - if(typingChar != inputChar) { - // console.log("inputContent.charAt(" + i + ") : " + inputContent.charCodeAt(i).toString(16) + ", " + inputChar); - // console.log("typingContent.charAt(" + i + ") : " + typingContent.charCodeAt(i).toString(16) + ", " + typingChar); + if(typingChar !== inputChar) { + // console.log("notTrimmedInputContent.charAt(" + i + ") : " + notTrimmedInputContent.charCodeAt(i).toString(16) + ", " + inputChar); + // console.log("notTrimmedTypingContent.charAt(" + i + ") : " + notTrimmedTypingContent.charCodeAt(i).toString(16) + ", " + typingChar); - this.textNextLetterIndicator.text = typingContent.substring(0, i + 1); - this.setCorrectText(typingContent.substring(0, i)); + this.textNextLetterIndicator.text = notTrimmedTypingContent.substring(0, i + 1); + this.setCorrectText(notTrimmedTypingContent.substring(0, i)); return; } } diff --git a/src/web/client/typing_exam.html b/src/web/client/typing_exam.html index a48ed3e..5f34364 100644 --- a/src/web/client/typing_exam.html +++ b/src/web/client/typing_exam.html @@ -61,7 +61,7 @@ - + diff --git a/test/tdd.html b/test/tdd.html index 83fdfe5..05c11ff 100644 --- a/test/tdd.html +++ b/test/tdd.html @@ -31,6 +31,7 @@ + diff --git a/test/tdd.js b/test/tdd.js index a9b9534..a454884 100644 --- a/test/tdd.js +++ b/test/tdd.js @@ -1,3 +1,54 @@ +////////////////////////////////////////////////// +// TimeUtil + +QUnit.test( "TimeUtil", function( assert ) { + var SEC_MS = 1000; + var MIN_MS = 60 * SEC_MS; + var HR_MS = 60 * MIN_MS; + var DAY_MS = 24 * HR_MS; + + var testDay = 1 * DAY_MS; + var testHour = 23 * HR_MS; + var testMinute = 11 * MIN_MS; + var testSecond = 56 * SEC_MS; + var testMilliSecond = 123; + var testTimeMS = testDay + testHour + testMinute + testSecond + testMilliSecond; + + assert.equal(TimeUtil.getFullSecondFromMS(testTimeMS), 169916, "getFullSecondFromMS"); + assert.equal(TimeUtil.getSecondFromMS(testTimeMS), 56, "getSecondFromMS"); + assert.equal(TimeUtil.getTwoDigitSecondFromMS(testTimeMS), "56", "getTwoDigitSecondFromMS"); + + assert.equal(TimeUtil.getFullMinuteFromMS(testTimeMS), 2831, "getFullMinuteFromMS"); + assert.equal(TimeUtil.getMinuteFromMS(testTimeMS), 11, "getMinuteFromMS"); + assert.equal(TimeUtil.getTwoDigitMinuteFromMS(testTimeMS), "11", "getTwoDigitMinuteFromMS"); + + assert.equal(TimeUtil.getFullHourFromMS(testTimeMS), 47, "getFullHourFromMS"); + assert.equal(TimeUtil.getHourFromMS(testTimeMS), 23, "getHourFromMS"); + assert.equal(TimeUtil.getTwoDigitHourFromMS(testTimeMS), "23", "getTwoDigitHourFromMS"); + + + testDay = 0 * DAY_MS; + testHour = 9 * HR_MS; + testMinute = 5 * MIN_MS; + testSecond = 4 * SEC_MS; + testMilliSecond = 1; + testTimeMS = testDay + testHour + testMinute + testSecond + testMilliSecond; + + assert.equal(TimeUtil.getFullSecondFromMS(testTimeMS), 32704, "getFullSecondFromMS"); + assert.equal(TimeUtil.getSecondFromMS(testTimeMS), 4, "getSecondFromMS"); + assert.equal(TimeUtil.getTwoDigitSecondFromMS(testTimeMS), "04", "getTwoDigitSecondFromMS"); + + assert.equal(TimeUtil.getFullMinuteFromMS(testTimeMS), 545, "getFullMinuteFromMS"); + assert.equal(TimeUtil.getMinuteFromMS(testTimeMS), 5, "getMinuteFromMS"); + assert.equal(TimeUtil.getTwoDigitMinuteFromMS(testTimeMS), "05", "getTwoDigitMinuteFromMS"); + + assert.equal(TimeUtil.getFullHourFromMS(testTimeMS), 9, "getFullHourFromMS"); + assert.equal(TimeUtil.getHourFromMS(testTimeMS), 9, "getHourFromMS"); + assert.equal(TimeUtil.getTwoDigitHourFromMS(testTimeMS), "09", "getTwoDigitHourFromMS"); + +}); + + ////////////////////////////////////////////////// // app list DB