GMS中如何让对象Create事件在变量赋值完成后执行
问题本质
GameMaker中调用instance_create系列函数生成实例时,实例的Create事件会在函数返回前立即执行,后续给实例属性赋值的代码会在Create事件执行完毕后才运行,因此Create事件内读取text/face/name属性时会拿到未定义的默认值,出现逻辑错误。
解决方案
以下三种方案都可以解决执行顺序问题,可根据自己使用的引擎版本选择:
- 方案1:使用带结构体传参的实例创建函数(GMS2.3及以上版本首选)
高版本GameMaker的instance_create_layer、instance_create_depth函数支持传入结构体参数,传入的变量会在Create事件运行前完成赋值,不需要修改原有Create事件代码,写法最简洁:// 注意将第二个参数替换为你项目中实际存放文本框的图层名 text_obj = instance_create_layer(0, 0, "UI_Layer", obj_character_text, { text: text, face: face, name: name }); - 方案2:拆分初始化逻辑到自定义事件(全版本兼容)
把依赖外部赋值变量的初始化逻辑从Create事件移到自定义用户事件中,等所有变量赋值完成后手动触发初始化:- 将原Create事件中的全部代码剪切到对象的User Event 0中,Create事件留空即可
- 调整实例创建代码:
text_obj = instance_create(0, 0, obj_character_text); text_obj.text = text; text_obj.face = face; text_obj.name = name; text_obj.event_user(0); // 所有变量赋值完成后,手动触发初始化逻辑 - 方案3:Create事件增加延迟初始化判断(不需要拆分事件)
如果不想拆分事件逻辑,可以在Create事件开头加判断,等所需变量赋值完成后再执行初始化:- 修改原Create事件代码:
// 检测必需变量是否存在,不存在则标记待初始化后直接退出事件 if (!variable_instance_exists(id, "text")) { pending_init = true; exit; } current_text_index = 0; current_text = string_char_at(text, current_text_index); alarm[0] = 5;- 调整实例创建代码,赋值完成后手动触发Create事件重跑:
text_obj = instance_create(0, 0, obj_character_text); text_obj.text = text; text_obj.face = face; text_obj.name = name; if (text_obj.pending_init) { text_obj.event_perform(ev_create, 0); }
内容的提问来源于stack exchange,提问作者Hexagon96
相关产品推荐
相关产品推荐

