From 147da1b443e6c1a79c931c857acfd8d7820e29c3 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sun, 17 Mar 2019 18:00:00 +0800 Subject: [PATCH] resetGame & core.init --- _server/editor.js | 2 +- _server/functions.comment.js | 5 +- libs/control.js | 113 ++++--------------- libs/core.js | 204 ++++++++++++++--------------------- libs/data.js | 4 - libs/events.js | 7 +- libs/items.js | 29 +++++ project/functions.js | 67 +++++++----- 8 files changed, 176 insertions(+), 255 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index e88f264d..bd1524f3 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -90,7 +90,7 @@ editor.prototype.init = function (callback) { editor.file = editor_file; editor_mode = editor_mode(editor); editor.mode = editor_mode; - core.resetStatus(core.firstData.hero, null, core.firstData.floorId, null, core.initStatus.maps); + core.resetGame(core.firstData.hero, null, core.firstData.floorId, core.initStatus.maps); core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function () { afterCoreReset(); }, true); diff --git a/_server/functions.comment.js b/_server/functions.comment.js index 8e961da5..bf25ed95 100644 --- a/_server/functions.comment.js +++ b/_server/functions.comment.js @@ -4,14 +4,13 @@ var functions_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_type": "object", "_data": { "events": { - "_type": "object", "_data": { - "initGame": { + "resetGame": { "_leaf": true, "_type": "textarea", "_lint": true, - "_data": "游戏开始前的一些初始化操作" + "_data": "重置整个游戏" }, "setInitData": { "_leaf": true, diff --git a/libs/control.js b/libs/control.js index 4490b3db..570f9946 100644 --- a/libs/control.js +++ b/libs/control.js @@ -25,6 +25,8 @@ control.prototype._init = function () { this.registerAnimationFrame("_checkConsoleOpened", true, this._animationFrame_checkConsoleOpened); } +// ------ requestAnimationFrame 相关 ------ // + ////// 注册一个 animationFrame ////// // name:名称,可用来作为注销使用;needPlaying:是否只在游戏运行时才执行(在标题界面不执行) // func:要执行的函数,或插件中的函数名;可接受timestamp(从页面加载完毕到当前所经过的时间)作为参数 @@ -286,9 +288,19 @@ control.prototype._animationFrame_checkConsoleOpened = function (timestamp) { if (core.consoleOpened()) core.setFlag('__consoleOpened__', true); } +// ------ 标题界面的处理 ------ // ////// 显示游戏开始界面 ////// control.prototype.showStartAnimate = function (noAnimate, callback) { + this._showStartAnimate_resetDom(); + if (core.flags.startUsingCanvas || noAnimate) + return this._showStartAnimate_finished(core.flags.startUsingCanvas, callback); + core.hide(core.dom.startTop, 20, function () { + core.control._showStartAnimate_finished(false, callback); + }); +} + +control.prototype._showStartAnimate_resetDom = function () { core.dom.startPanel.style.opacity=1; core.dom.startPanel.style.display="block"; core.dom.startTop.style.opacity=1; @@ -300,59 +312,21 @@ control.prototype.showStartAnimate = function (noAnimate, callback) { core.clearStatus(); core.clearMap('all'); core.deleteAllCanvas(); - core.dom.musicBtn.style.display = 'block'; - // 重置音量 core.events.setVolume(1, 0); - - if (core.flags.startUsingCanvas) { - core.dom.startTop.style.display = 'none'; - core.dom.startButtonGroup.style.display = 'block'; - core.events.startGame(''); - if (core.isset(callback)) callback(); - return; - } - - if(noAnimate) { - core.dom.startTop.style.display = 'none'; - // core.playGame(); - core.dom.startButtonGroup.style.display = 'block'; - if (core.isset(callback)) callback(); - } - else { - var opacityVal = 1; - var startAnimate = window.setInterval(function () { - opacityVal -= 0.03; - if (opacityVal < 0) { - clearInterval(startAnimate); - core.dom.startTop.style.display = 'none'; - // core.playGame(); - core.dom.startButtonGroup.style.display = 'block'; - if (core.isset(callback)) callback(); - } - core.dom.startTop.style.opacity = opacityVal; - }, 20); - } - } -control.prototype._showStartAnimate_resetDom = function () { - +control.prototype._showStartAnimate_finished = function (start, callback) { + core.dom.startTop.style.display = 'none'; + core.dom.startButtonGroup.style.display = 'block'; + if (start) core.startGame(); + if (callback) callback(); } ////// 隐藏游戏开始界面 ////// control.prototype.hideStartAnimate = function (callback) { - var opacityVal = 1; - var startAnimate = window.setInterval(function () { - opacityVal -= 0.03; - if (opacityVal < 0) { - clearInterval(startAnimate); - core.dom.startPanel.style.display = 'none'; - if (core.isset(callback)) callback(); - } - core.dom.startPanel.style.opacity = opacityVal; - }, 20); + core.hide(core.dom.startPanel, 20, callback); } ////// 游戏是否已经开始 ////// @@ -381,31 +355,9 @@ control.prototype.clearStatus = function() { core.clearStatusBar(); core.deleteAllCanvas(); core.status.played = false; - core.events.setHeroIcon('hero.png', true); } -////// 重置游戏状态和初始数据 ////// -control.prototype.resetStatus = function(hero, hard, floorId, route, maps, values) { - - var totalTime = core.animateFrame.totalTime; - - // 清除游戏数据 - core.clearStatus(); - - // 初始化status - core.status = core.clone(core.initStatus); - core.status.played = true; - // 初始化maps - core.status.floorId = floorId; - core.status.maps = core.clone(maps); - // 初始化怪物 - core.material.enemys = core.enemys.getEnemys(); - core.material.items = core.items.getItems(); - // 初始化人物属性 - core.status.hero = core.clone(hero); - // 初始化人物图标 - core.events.setHeroIcon(core.getFlag('heroIcon', 'hero.png'), true); - // 统计数据 +control.prototype._initStatistics = function (totalTime) { if (!core.isset(core.status.hero.statistics)) core.status.hero.statistics = { 'totalTime': totalTime, @@ -420,29 +372,6 @@ control.prototype.resetStatus = function(hero, hard, floorId, route, maps, value 'moveDirectly': 0, 'ignoreSteps': 0, } - core.status.hero.statistics.totalTime = core.animateFrame.totalTime = - Math.max(core.status.hero.statistics.totalTime, core.animateFrame.totalTime); - core.status.hero.statistics.start = null; - - core.status.hard = hard; - // 初始化路线 - if (core.isset(route)) - core.status.route = route; - - if (core.isset(values)) - core.values = core.clone(values); - else core.values = core.clone(core.data.values); - - core.flags = core.clone(core.data.flags); - var systemFlags = core.getFlag("globalFlags", {}); - for (var key in systemFlags) - core.flags[key] = systemFlags[key]; - - core.events.initGame(); - core.resize(); - this.updateGlobalAttribute(Object.keys(core.status.globalAttribute)); - this.triggerStatusBar(core.getFlag('hideStatusBar', false)?'hide':'show', core.getFlag("showToolbox")); - core.dom.musicBtn.style.display = 'none'; } @@ -2466,8 +2395,8 @@ control.prototype.saveData = function() { ////// 从本地读档 ////// control.prototype.loadData = function (data, callback) { - core.resetStatus(data.hero, data.hard, data.floorId, core.decodeRoute(data.route), core.maps.loadMap(data.maps), - data.values); + core.resetGame(data.hero, data.hard, data.floorId, core.maps.loadMap(data.maps), data.values); + core.status.route = core.decodeRoute(data.route); // load shop times for (var shop in core.status.shops) { diff --git a/libs/core.js b/libs/core.js index 06a30eea..c64b7c71 100644 --- a/libs/core.js +++ b/libs/core.js @@ -216,48 +216,58 @@ function core() { ////// 初始化 ////// core.prototype.init = function (coreData, callback) { this._forwardFuncs(); - - for (var key in coreData) { + for (var key in coreData) core[key] = coreData[key]; - } + this._init_flags(); + this._init_platform(); + this._init_others(); + + core.loader._load(function () { + core._afterLoadResources(callback); + }); +} + +core.prototype._init_flags = function () { core.flags = core.clone(core.data.flags); core.values = core.clone(core.data.values); - core.firstData = core.data.getFirstData(); + core.firstData = core.clone(core.data.firstData); - if (!core.flags.enableExperience) - core.flags.enableLevelUp = false; - if (!core.flags.enableLevelUp) - core.flags.levelUpLeftMode = false; - - if (core.firstData.shops) { - core.firstData.shops.forEach(function (t) { - core.initStatus.shops[t.id] = t; - }) - } - - core.maps._setFloorSize(); + if (!core.flags.enableExperience) core.flags.enableLevelUp = false; + if (!core.flags.enableLevelUp) core.flags.levelUpLeftMode = false; + if (core.flags.equipboxButton) core.flags.equipment = true; + core.flags.displayEnemyDamage = core.getLocalStorage('enemyDamage', core.flags.displayEnemyDamage); + core.flags.displayCritical = core.getLocalStorage('critical', core.flags.displayCritical); + core.flags.displayExtraDamage = core.getLocalStorage('extraDamage', core.flags.displayExtraDamage); core.dom.versionLabel.innerHTML = core.firstData.version; core.dom.logoLabel.innerHTML = core.firstData.title; document.title = core.firstData.title + " - HTML5魔塔"; document.getElementById("startLogo").innerHTML = core.firstData.title; - core.material.items = core.items.getItems(); + (core.firstData.shops||[]).forEach(function (t) { core.initStatus.shops[t.id] = t; }); + core.maps._setFloorSize(); + // 初始化地图 + core.initStatus.maps = core.maps.initMaps(core.floorIds); + // 初始化怪物、道具等 core.material.enemys = core.enemys.getEnemys(); + core.material.items = core.items.getItems(); + core.items._resetItems(); core.material.icons = core.icons.getIcons(); +} +core.prototype._init_platform = function () { core.platform.isOnline = location.protocol.indexOf("http") == 0; - if (core.platform.isOnline) { - window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext; - try { - core.musicStatus.audioContext = new window.AudioContext(); - core.musicStatus.gainNode = core.musicStatus.audioContext.createGain(); - core.musicStatus.gainNode.connect(core.musicStatus.audioContext.destination); - } catch (e) { - console.log("该浏览器不支持AudioContext"); - core.musicStatus.audioContext = null; - } + if (!core.platform.isOnline) alert("请勿直接打开html文件!使用启动服务或者APP进行离线游戏。"); + window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext; + try { + core.musicStatus.audioContext = new window.AudioContext(); + core.musicStatus.gainNode = core.musicStatus.audioContext.createGain(); + core.musicStatus.gainNode.connect(core.musicStatus.audioContext.destination); + } catch (e) { + console.log("该浏览器不支持AudioContext"); + core.musicStatus.audioContext = null; } - + core.musicStatus.bgmStatus = core.getLocalStorage('bgmStatus', true); + core.musicStatus.soundStatus = core.getLocalStorage('soundStatus', true); ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"].forEach(function (t) { if (navigator.userAgent.indexOf(t) >= 0) { if (t == 'iPhone' || t == 'iPad' || t == 'iPod') core.platform.isIOS = true; @@ -265,21 +275,32 @@ core.prototype.init = function (coreData, callback) { core.platform.isPC = false; } }); - - try { - core.platform.supportCopy = document.queryCommandSupported("copy"); - } - catch (e) { - core.platform.supportCopy = false; - } - + core.platform.supportCopy = document.queryCommandSupported || document.queryCommandSupported("copy"); var chrome = /Chrome\/(\d+)\./i.exec(navigator.userAgent); - if (chrome && parseInt(chrome[1]) >= 50) - core.platform.isChrome = true; + if (chrome && parseInt(chrome[1]) >= 50) core.platform.isChrome = true; core.platform.isSafari = /Safari/i.test(navigator.userAgent) && !/Chrome/i.test(navigator.userAgent); core.platform.isQQ = /QQ/i.test(navigator.userAgent); core.platform.isWeChat = /MicroMessenger/i.test(navigator.userAgent); + this._init_checkLocalForage(); + core.platform.extendKeyboard = core.getLocalStorage("extendKeyboard", false); + if (window.FileReader) { + core.platform.fileReader = new FileReader(); + core.platform.fileReader.onload = function () { + core.readFileContent(core.platform.fileReader.result); + }; + core.platform.fileReader.onerror = function () { + if (core.platform.errorCallback) + core.platform.errorCallback(); + } + } +} + +core.prototype._init_checkLocalForage = function () { core.platform.useLocalForage = core.getLocalStorage('useLocalForage', !core.platform.isIOS); + var _error = function (e) { + main.log(e); + core.platform.useLocalForage = false; + }; if (core.platform.useLocalForage) { try { core.setLocalForage("__test__", lzw_encode("__test__"), function () { @@ -291,106 +312,43 @@ core.prototype.init = function (coreData, callback) { core.platform.useLocalForage = false; } else { - console.log("localForage supported!") + console.log("localForage supported!"); core.removeLocalForage("__test__"); } } - catch (e) { - main.log(e); - core.platform.useLocalForage = false; - } - }, function (e) { - main.log(e); - core.platform.useLocalForage = false; - }) + catch (e) {_error(e);} + }, _error) } - catch (e) { - main.log(e); - core.platform.useLocalForage = false; - } - }, function (e) { - main.log(e); - core.platform.useLocalForage = false; - }) - } - catch (e) { - main.log(e); - core.platform.useLocalForage = false; + catch (e) {_error(e);} + }, _error) } + catch (e) {_error(e);} } +} - core.platform.extendKeyboard = core.getLocalStorage("extendKeyboard", false); - - if (window.FileReader) { - core.platform.fileReader = new FileReader(); - core.platform.fileReader.onload = function () { - core.readFileContent(core.platform.fileReader.result); - }; - core.platform.fileReader.onerror = function () { - if (core.platform.errorCallback) - core.platform.errorCallback(); - } - } - - // 先从存储中读取BGM状态 - core.musicStatus.bgmStatus = core.getLocalStorage('bgmStatus', true); - if (!core.platform.isPC && (navigator.connection || {}).type != 'wifi') - core.musicStatus.bgmStatus = false; - core.musicStatus.soundStatus = core.getLocalStorage('soundStatus', true); - - // switchs - core.flags.displayEnemyDamage = core.getLocalStorage('enemyDamage', core.flags.displayEnemyDamage); - core.flags.displayCritical = core.getLocalStorage('critical', core.flags.displayCritical); - core.flags.displayExtraDamage = core.getLocalStorage('extraDamage', core.flags.displayExtraDamage); - +core.prototype._init_others = function () { + // 一些额外的东西 core.material.groundCanvas = document.createElement('canvas').getContext('2d'); core.material.groundCanvas.canvas.width = core.material.groundCanvas.canvas.height = 32; core.material.groundPattern = core.material.groundCanvas.createPattern(core.material.groundCanvas.canvas, 'repeat'); - - core.animateFrame.weather.fog = new Image(); - core.animateFrame.weather.fog.onerror = function () { - core.animateFrame.weather.fog = null; - } - core.animateFrame.weather.fog.src = "project/images/fog.png"; - - core.material.images.keyboard = new Image(); - core.material.images.keyboard.onerror = function () { - core.material.images.keyboard = null; - } - core.material.images.keyboard.src = "project/images/keyboard.png"; - core.bigmap.tempCanvas = document.createElement('canvas').getContext('2d'); - - ////// 记录所有的存档编号!!! ////// + core.loadImage('fog', function (name, img) { core.animateFrame.weather.fog = img; }); + core.loadImage('keyboard', function (name, img) {core.material.images.keyboard = img; }); + // 记录存档编号 core.saves.saveIndex = core.getLocalStorage('saveIndex', 1); - core.control.getSaveIndexes(function (indexes) { - core.saves.ids = indexes; - }); + core.control.getSaveIndexes(function (indexes) { core.saves.ids = indexes; }); +} - core.loader._load(function () { - // 设置勇士高度 - core.material.icons.hero.height = core.material.images.hero.height / 4; - // 行走图 - core.control.updateHeroIcon(); +core.prototype._afterLoadResources = function (callback) { + core.control._setRequestAnimationFrame(); - core.initStatus.maps = core.maps.initMaps(core.floorIds); - core.control._setRequestAnimationFrame(); + core.plugin = new function () {}; + core.plugin.__init__ = functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.plugins.plugin; + core.plugin.__init__(); + core._forwardFunc("plugin"); - if (main.mode == 'play') - core.events.initGame(); - - if (functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.plugins) { - core.plugin = new function () {}; - core.plugin.__init__ = functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.plugins.plugin; - core.plugin.__init__(); - core._forwardFunc("plugin"); - } - - core.showStartAnimate(); - - if (callback) callback(); - - }); + core.showStartAnimate(); + if (callback) callback(); } core.prototype._forwardFuncs = function () { diff --git a/libs/data.js b/libs/data.js index e833cf37..684e71cb 100644 --- a/libs/data.js +++ b/libs/data.js @@ -9,8 +9,4 @@ data.prototype._init = function () { this.values = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.values; this.flags = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.flags; //delete(data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d); -} - -data.prototype.getFirstData = function () { - return core.clone(this.firstData); } \ No newline at end of file diff --git a/libs/events.js b/libs/events.js index 13915ac9..31ad3d27 100644 --- a/libs/events.js +++ b/libs/events.js @@ -15,14 +15,15 @@ events.prototype._init = function () { // ------ 初始化,开始和结束 ------ // /// 初始化游戏 -events.prototype.initGame = function () { - return this.eventdata.initGame(); +events.prototype.resetGame = function (hero, hard, floorId, maps, values) { + return this.eventdata.resetGame(hero, hard, floorId, maps, values); } ////// 游戏开始事件 ////// events.prototype.startGame = function (hard, seed, route, callback) { main.dom.levelChooseButtons.style.display = 'none'; main.dom.startButtonGroup.style.display = 'none'; + hard = hard || ""; if (main.mode != 'play') return; @@ -40,7 +41,7 @@ events.prototype.startGame = function (hard, seed, route, callback) { events.prototype._startGame_start = function (hard, seed, route, callback) { console.log('开始游戏'); - core.resetStatus(core.firstData.hero, hard, null, null, core.initStatus.maps); + core.resetGame(core.firstData.hero, hard, null, core.initStatus.maps); var nowLoc = core.clone(core.getHeroLoc()); core.setHeroLoc('x', -1); core.setHeroLoc('y', -1); diff --git a/libs/items.js b/libs/items.js index 097ff627..ace9bb3b 100644 --- a/libs/items.js +++ b/libs/items.js @@ -21,6 +21,35 @@ items.prototype.getItems = function () { return core.clone(this.items); } +items.prototype._resetItems = function () { + // 只有运行时才能执行此函数! + if (main.mode != 'play') return; + + // 根据flag来对道具进行修改 + if (core.flags.bigKeyIsBox) { + core.material.items.bigKey.cls = 'items'; + core.material.items.bigKey.name = '钥匙盒'; + } + if (core.flags.pickaxeFourDirections) + core.material.items.pickaxe.text = "可以破坏勇士四周的墙"; + if (core.flags.bombFourDirections) + core.material.items.bomb.text = "可以炸掉勇士四周的怪物"; + if (core.flags.snowFourDirections) + core.material.items.bomb.text = "可以将四周的熔岩变成平地"; + if (core.flags.equipment) { + core.material.items.sword1.cls = 'equips'; + core.material.items.sword2.cls = 'equips'; + core.material.items.sword3.cls = 'equips'; + core.material.items.sword4.cls = 'equips'; + core.material.items.sword5.cls = 'equips'; + core.material.items.shield1.cls = 'equips'; + core.material.items.shield2.cls = 'equips'; + core.material.items.shield3.cls = 'equips'; + core.material.items.shield4.cls = 'equips'; + core.material.items.shield5.cls = 'equips'; + } +} + ////// “即捡即用类”道具的使用效果 ////// items.prototype.getItemEffect = function (itemId, itemNum) { var itemCls = core.material.items[itemId].cls; diff --git a/project/functions.js b/project/functions.js index 18d5cc6d..514993d1 100644 --- a/project/functions.js +++ b/project/functions.js @@ -1,36 +1,45 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { "events": { - "initGame": function() { - // 游戏开始前的一些初始化操作 + "resetGame": function (hero, hard, floorId, maps, values) { + // 重置整个游戏;此函数将在游戏开始时,或者每次读档时最先被调用 + // hero:勇士信息;hard:难度;floorId:当前楼层ID;maps:地图信息;values:全局数值信息 - // 根据flag来对道具进行修改 - if (core.flags.bigKeyIsBox) - core.material.items.bigKey = {'cls': 'items', 'name': '钥匙盒'}; - // 面前的墙?四周的墙? - if (core.flags.pickaxeFourDirections) - core.material.items.pickaxe.text = "可以破坏勇士四周的墙"; - if (core.flags.bombFourDirections) - core.material.items.bomb.text = "可以炸掉勇士四周的怪物"; - if (core.flags.snowFourDirections) - core.material.items.bomb.text = "可以将四周的熔岩变成平地"; - // 是否启用装备栏 - if (core.flags.equipboxButton) { - core.statusBar.image.fly.src = core.statusBar.icons.equipbox.src; - core.flags.equipment = true; - } - if (core.flags.equipment) { - core.material.items.sword1.cls = 'equips'; - core.material.items.sword2.cls = 'equips'; - core.material.items.sword3.cls = 'equips'; - core.material.items.sword4.cls = 'equips'; - core.material.items.sword5.cls = 'equips'; - core.material.items.shield1.cls = 'equips'; - core.material.items.shield2.cls = 'equips'; - core.material.items.shield3.cls = 'equips'; - core.material.items.shield4.cls = 'equips'; - core.material.items.shield5.cls = 'equips'; - } + // 清除游戏数据 + core.clearStatus(); + // 初始化status + core.status = core.clone(core.initStatus); + core.status.played = true; + // 初始化人物,图标,统计信息 + core.status.hero = core.clone(hero); + core.events.setHeroIcon(core.getFlag('heroIcon', 'hero.png'), true); + core.control._initStatistics(core.animateFrame.totalTime); + core.status.hero.statistics.totalTime = core.animateFrame.totalTime = + Math.max(core.status.hero.statistics.totalTime, core.animateFrame.totalTime); + core.status.hero.statistics.start = null; + // 初始难度 + core.status.hard = hard || ""; + // 初始化地图 + core.status.floorId = floorId; + core.status.maps = core.clone(maps); + // 初始化怪物和道具 + core.material.enemys = core.enemys.getEnemys(); + core.material.items = core.items.getItems(); + core.items._resetItems(); + // 初始化全局数值和全局开关 + core.values = core.clone(core.data.values); + for (var key in values || {}) + core.values[key] = values[key]; + core.flags = core.clone(core.data.flags); + var globalFlags = core.getFlag("globalFlags", {}); + for (var key in globalFlags) + core.flags[key] = globalFlags[key]; + // 初始化界面,状态栏等 + core.resize(); + core.updateGlobalAttribute(Object.keys(core.status.globalAttribute)); + core.triggerStatusBar(core.hasFlag('hideStatusBar') ? 'hide' : 'show', core.hasFlag('showToolbox')); + // 隐藏右下角的音乐按钮 + core.dom.musicBtn.style.display = 'none'; }, "setInitData": function () { // 不同难度分别设置初始属性