You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:22:50