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
相关产品推荐
相关产品推荐

