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

GMS2(GML)敌人碰撞生命值异常清零问题求助

GMS2 GML碰撞减血直接清零的问题修复

问题原因

GMS2的碰撞事件会在碰撞持续的每一个游戏帧都触发一次,并非仅触发一次。当玩家与敌人保持接触时,每帧都会执行global.lifes -= 1,短时间内就会把3点生命值直接扣至0,触发房间重启。

解决方法

以下是几种实用的修复方案,任选其一即可:

方案1:添加无敌状态(最常用)

这是防止连续扣血的标准做法,给玩家设置一段碰撞后的无敌时间:

  • 在玩家对象的Create事件中初始化变量:
    // Create event
    global.lifes = 3;
    invincible = false;
    invincibility_timer = 0;
    
  • 修改碰撞事件代码,仅在非无敌状态下扣血并开启无敌:
    // Collision with enemy event
    if (!invincible) {
        global.lifes -= 1;
        invincible = true;
        invincibility_timer = room_speed * 2; // 持续2秒无敌,可自行调整时长
    }
    
  • 在玩家对象的Step事件中添加计时器逻辑,到时间后关闭无敌:
    // Step event
    if (invincible) {
        invincibility_timer -= 1;
        if (invincibility_timer <= 0) {
            invincible = false;
        }
    }
    

方案2:临时禁用碰撞判定

碰撞扣血后,暂时关闭玩家或敌人的碰撞,避免重复触发:

  • 碰撞事件示例(以禁用敌人碰撞为例):
    // Collision with enemy event
    global.lifes -= 1;
    instance_deactivate_object(other); // 暂时隐藏敌人并禁用其碰撞
    alarm[0] = room_speed * 3; // 3秒后恢复敌人
    
  • 在敌人对象的Alarm 0事件中恢复激活:
    // Alarm 0 event
    instance_activate_object(self);
    

方案3:改用Step事件单次碰撞检测

放弃碰撞事件,在Step事件中手动检测碰撞,配合标志位确保仅扣血一次:

  • 在玩家对象的Create事件初始化标志位:
    // Create event
    global.lifes = 3;
    hit_flag = false;
    
  • 在Step事件中添加检测逻辑:
    // Step event
    var is_colliding = place_meeting(x, y, obj_enemy); // 替换为你的敌人对象名
    if (is_colliding && !hit_flag) {
        global.lifes -= 1;
        hit_flag = true;
    }
    // 离开碰撞后重置标志位
    if (!is_colliding) {
        hit_flag = false;
    }
    

内容的提问来源于stack exchange,提问作者T14Seara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:45:45