GameMaker中GUI仅对最新放置的塔生效问题求助
塔防游戏GUI仅对最新放置塔生效的问题修复
问题根源
你的代码存在两个核心问题:
- 调用
instance_destroy(o_Tower1Upgrade)时,会销毁所有该类型的实例,而非当前塔对应的GUI。当多个塔存在时,旧塔的Step事件会把新塔的GUI销毁,只有最后执行Step事件的最新塔能保留自己的GUI。 - 每帧Step事件都执行
instance_create_layer,会重复创建大量GUI实例,既浪费性能,又会导致逻辑混乱。
修复步骤
1. 给GUI实例添加所属塔标识
在o_Tower1Upgrade的Create事件中添加变量:
owner = noone; // 记录所属的塔实例ID
同样给o_tower1upgradebutton1的Create事件添加相同代码,确保按钮也能绑定所属塔。
2. 修改塔的Step事件代码
调整GUI的创建和销毁逻辑,只操作当前塔对应的实例:
if placed != false { image_alpha = 1; if collision_circle(x,y,200,oEnemy,false,true) && instance_exists(oEnemy) { target = instance_nearest(x,y,oEnemy); direction = point_direction(target.x < x ? x-18 : x+18, y, target.x, target.y); if alarm[0] == -1 { alarm[0] = 60; } } // 优化鼠标检测,避免每帧重复赋值 var _mouse_over = position_meeting(mouse_x, mouse_y, self); if mouse_check_button(mb_any) { GuiOpen = _mouse_over; } // 查找当前塔对应的GUI var _my_gui = noone; with(o_Tower1Upgrade) { if owner == other.id { _my_gui = id; break; } } if GuiOpen { if _my_gui == noone { // 仅当GUI不存在时创建 _my_gui = instance_create_layer(x,y-65,"Instances2",o_Tower1Upgrade); _my_gui.owner = id; // 绑定所属塔 // 创建升级按钮时同样绑定owner var _my_btn = instance_create_layer(/* 按钮位置参数 */,"Instances2",o_tower1upgradebutton1); _my_btn.owner = id; } } else { if _my_gui != noone { instance_destroy(_my_gui); // 只销毁当前塔的GUI // 销毁对应升级按钮 with(o_tower1upgradebutton1) { if owner == other.id { instance_destroy(id); break; } } } } } else { x = mouse_x; y = mouse_y; image_alpha = 0.5; }
3. 额外优化建议
- 把鼠标检测改成
mouse_check_button_pressed或mouse_check_button_released,避免按住鼠标时每帧触发状态切换。 - 可以将GUI的创建/销毁逻辑封装成脚本,减少重复代码。
内容的提问来源于stack exchange,提问作者persom
相关产品推荐
相关产品推荐

