如何在Construct 2导出的HTML5游戏中编辑嵌套变量(如player.hp)
如何在Construct 2导出的HTML5游戏中操作全局与嵌套实例变量
我最近用Construct 2做了个游戏,导出成HTML5包后,想通过外部脚本来读取或者修改游戏里的变量。导出后的文件里data.js存着游戏的代码和变量数据,Scirra的Yann提供了一段代码让我能搞定全局变量,但碰到player.hp、player.money这种属于实例的嵌套变量时就卡壳了。
已实现的全局变量操作代码
先给大家看看这段能操作全局变量的代码,它能帮你读取和设置全局变量:
function getGlobalObject(name) { var runtime = document.getElementById('c2canvas').c2runtime; for (var p in runtime) { if(Object.prototype.hasOwnProperty.call(runtime,p)) { var prop = runtime[p]; if(prop === undefined) continue; if(prop === null) continue; if(typeof prop !== 'object') continue; if(prop.length === undefined) continue; for(var i = 0; i < prop.length; i++) { if(prop[i].parent !== undefined && prop[i].data !== undefined && prop[i].sheet !== undefined && prop[i].name !== undefined) { // 这应该就是全局变量数组了 if(prop[i].name === name) { // 找到目标变量! return prop[i]; } } else { // 不是全局变量数组就不用继续循环了 break; } } } } return null; } function setGlobalVar(name,value) { var g = getGlobalObject(name); if(g === null) return; g.data = value; } function getGlobalVar(name) { var g = getGlobalObject(name); if(g === null) return 0; return g.data; } // 使用示例:设置全局变量myGlobal的值为4 setGlobalVar('myGlobal',4);
这段代码的核心是找到Construct 2运行时里的全局变量数组,然后通过变量名定位到目标对象,再修改它的data属性。
解决嵌套实例变量(如player.hp)的方法
要操作像player.hp这种属于某个实例的变量,我们需要先找到对应的实例对象,再定位到它的变量。Construct 2的运行时里,每个实例都属于对应的对象类型,我们可以通过对象类型名找到实例列表,再从中获取目标实例,最后修改它的变量。
下面是我整理的用于读取和修改实例变量的函数:
// 获取指定对象类型的第一个实例(如果有多个实例,你可能需要调整逻辑找目标) function getInstance(objectTypeName) { var runtime = document.getElementById('c2canvas').c2runtime; // 遍历运行时里的对象类型 for (var key in runtime.types) { if (runtime.types.hasOwnProperty(key)) { var type = runtime.types[key]; if (type.name === objectTypeName) { // 返回该类型的第一个实例(如果有多个,可根据需求筛选) return type.instances[0]; } } } return null; } // 设置实例变量 function setInstanceVar(objectTypeName, varName, value) { var instance = getInstance(objectTypeName); if (!instance) return; // 实例的变量存在于instance.vars对象中 instance.vars[varName] = value; } // 获取实例变量 function getInstanceVar(objectTypeName, varName) { var instance = getInstance(objectTypeName); if (!instance) return 0; return instance.vars[varName] || 0; } // 使用示例:设置player实例的hp为100,money为500 setInstanceVar('player', 'hp', 100); setInstanceVar('player', 'money', 500); // 使用示例:读取player的hp值 var playerHp = getInstanceVar('player', 'hp'); console.log(playerHp);
注意事项
- 如果你的游戏里有多个同类型的实例(比如多个player),
getInstance函数目前只返回第一个,你需要根据实例的其他属性(比如UID)来筛选目标实例,比如遍历type.instances数组,找到instance.uid === 目标UID的对象。 - 确保对象类型名(比如
player)和变量名(比如hp)和你在Construct 2里设置的完全一致,大小写也要匹配。
内容的提问来源于stack exchange,提问作者Kitty




