如何在子弹击中敌人时移除敌人并更新得分
发布时间 - 2026-01-02 00:00:00 点击率:次本教程详解如何在processing游戏中实现子弹与敌人的碰撞检测、敌人销毁及得分更新,通过状态标记法安全移除对象,避免遍历集合时的并发修改问题。
在基于Processing的2D射击游戏中,实现“子弹击中即消灭敌人并加分”是核心交互逻辑。但直接在checkCollision()中删除Enemy对象极易引发运行时错误(如ConcurrentModificationException)
,尤其当敌人存储在ArrayList
✅ 正确实现步骤
1. 为 Enemy 类添加存活状态字段
class Enemy {
int x, y;
float size; // 推荐用 size 表示半径或直径,比直接用 x/y 更语义清晰
boolean alive = true; // 关键:默认存活
Enemy(int x, int y, float size) {
this.x = x;
this.y = y;
this.size = size;
}
}2. 修正 Bullet.checkCollision():仅标记,不删除
void checkCollision(Enemy e) {
float distance = dist(bulletX, bulletY, e.x, e.y);
// ✅ 修正:使用 e.size 作为碰撞半径(假设 size 是直径,则半径为 size/2)
if (distance < e.size / 2) {
e.alive = false; // 标记为死亡,不在此处移除!
score++; // 同步增加玩家得分(需确保 score 是 Bullet 实例变量或全局变量)
}
}⚠️ 注意:原代码中 distance3. 在主游戏循环中统一清理与渲染
// 假设 enemies 是 ArrayList,bullets 是 ArrayList void draw() { // 更新并检查所有子弹与所有敌人碰撞 for (Bullet b : bullets) { b.update(); for (Enemy e : enemies) { b.checkCollision(e); // 此处只标记 e.alive = false } } // 渲染:只画存活的敌人和子弹 for (Enemy e : enemies) { if (e.alive) { image(EnemyImg, e.x, e.y); } } for (Bullet b : bullets) { b.show(); } // 【关键】清理死亡敌人(倒序遍历,避免索引错位) for (int i = enemies.size() - 1; i >= 0; i--) { if (!enemies.get(i).alive) { enemies.remove(i); // 安全移除 } } // 可选:清理飞出屏幕的子弹 for (int i = bullets.size() - 1; i >= 0; i--) { if (bullets.get(i).offScreen()) { bullets.remove(i); } } } ? 进阶建议
- 性能优化:若敌人数量多,可引入空间分区(如四叉树)减少每帧碰撞检测次数。
- 视觉反馈:在 e.alive = false 后播放爆炸动画或音效,再延迟移除(需额外计时器)。
- 得分同步:若 score 是全局变量,建议封装为 GameStats 类管理,提升可维护性。
通过“标记-清除”两阶段设计,你既能保证逻辑清晰、线程安全(单线程下无竞态),又能避免因误删对象导致的崩溃。这是游戏开发中处理动态对象生命周期的经典范式。
# 游戏开发
# 射击游戏
# 封装
# 全局变量
# 循环
# 线程
# 并发
# 对象
# 性能优化
# 遍历
# 移除
# 飞出
# 进阶
# 这是
# 中统
# 加分
# 游戏中
# 计时器
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
Laravel如何使用Telescope进行调试?(安装和使用教程)
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Laravel如何处理CORS跨域请求?(配置示例)
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
如何在阿里云高效完成企业建站全流程?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
详解Huffman编码算法之Java实现
Laravel Docker环境搭建教程_Laravel Sail使用指南
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
如何确保FTP站点访问权限与数据传输安全?
phpredis提高消息队列的实时性方法(推荐)
利用python获取某年中每个月的第一天和最后一天
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何在腾讯云服务器快速搭建个人网站?
JS实现鼠标移上去显示图片或微信二维码
如何快速查询网址的建站时间与历史轨迹?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
php485函数参数是什么意思_php485各参数详细说明【介绍】
javascript日期怎么处理_如何格式化输出
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
nodejs redis 发布订阅机制封装实现方法及实例代码
Laravel如何实现多对多模型关联?(Eloquent教程)
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
如何快速打造个性化非模板自助建站?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
如何在阿里云ECS服务器部署织梦CMS网站?
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
如何在景安云服务器上绑定域名并配置虚拟主机?
Laravel怎么判断请求类型_Laravel Request isMethod用法
如何在建站主机中优化服务器配置?
Laravel Session怎么存储_Laravel Session驱动配置详解
进行网站优化必须要坚持的四大原则
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
jquery插件bootstrapValidator表单验证详解
如何为不同团队 ID 动态生成多个独立按钮
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
,交易猫的商品怎么发布到网站上去?
Laravel distinct去重查询_Laravel Eloquent去重方法

