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

C# WinForm开发2D游戏如何用循环检测子弹与敌人Bounds相交碰撞

WinForm 2D游戏碰撞检测循环改造方案

核心实现思路

将分散定义的单个子弹、单个敌人对象统一存入强类型集合,通过双层循环替代硬编码的多条件判断,既可以避免重复写25条判断逻辑,还能直接获取具体是哪发子弹命中了哪个敌人,后续扩容子弹/敌人数量时只需要往集合中新增对象即可,无需修改核心检测逻辑。

代码实现

步骤1:构造子弹、敌人集合

// 将分散的子弹、敌人对象存入数组,也可以用List<T>动态扩容
var bullets = new[] { bulletOne, bulletTwo, bulletThree, bulletFour, bulletFive };
var enemies = new[] { enemyOne, enemyTwo, enemyThree, enemyFour, enemyFive };

步骤2:碰撞检测逻辑(支持记录命中对应关系)

// 可选:存储「命中子弹-被命中敌人」的对应关系
List<(object Bullet, object Enemy)> hitRecords = new List<(object, object)>();
// 如果有自定义的Bullet、Enemy类,可以替换上面的object为对应的强类型

foreach (var enemy in enemies)
{
    foreach (var bullet in bullets)
    {
        // 这里可以额外加判断:只检测处于激活状态的子弹
        // if (!bullet.IsActive) continue;
        
        if (bullet.Bounds.IntersectsWith(enemy.Bounds))
        {
            // 记录命中对应关系
            hitRecords.Add((bullet, enemy));
            // 执行敌人被命中后的逻辑
            enemy.Left = rnd.Next(1300, 1400);
            // 可选:子弹命中后标记为失效
            // bullet.IsActive = false;
            // 可选:同个敌人只要被1发子弹命中就跳出,不再检测其余子弹
            break;
        }
    }
}

极简写法(不需要记录命中对应关系时可用)

如果不需要知道具体哪发子弹命中,只需要判断敌人是否被任意子弹命中,可以用LINQ简化:

foreach (var enemy in enemies)
{
    if (bullets.Any(bullet => bullet.Bounds.IntersectsWith(enemy.Bounds)))
    {
        enemy.Left = rnd.Next(1300, 1400);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:03:05