You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Construct 2导出的HTML5游戏中编辑嵌套变量(如player.hp)

如何在Construct 2导出的HTML5游戏中操作全局与嵌套实例变量

我最近用Construct 2做了个游戏,导出成HTML5包后,想通过外部脚本来读取或者修改游戏里的变量。导出后的文件里data.js存着游戏的代码和变量数据,Scirra的Yann提供了一段代码让我能搞定全局变量,但碰到player.hpplayer.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

火山引擎 最新活动