Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)
运行起来,虽然主角飞机和敌机都在互相发射子弹,但是子弹打中了就和没打中效果是一样的。。
这一章我们就来处理子弹和飞机的碰撞问题。
我们所有的操作都是基于Main这个容器来做的。所以我就把这个处理放到Main里面,监听Main的ENTER_FRAME事件
this.addEventListener(egret.Event.ENTER_FRAME, (e) => { //判断子弹是否和飞机碰撞 let isHit = this._bullets.IsHit(this._Hero) // console.log("Hit:" + isHit) //判断Enemy是否和主角碰撞 }, this)
这里面就两个操作,一个是判断主角子弹是否击中敌机,敌机子弹是否击中主角,因为是判断子弹是否打中飞机,那么我们就在子弹的工厂类BulletFactory.ts里面做这个检测操作
public IsHit(e: egret.DisplayObjectContainer): boolean { let arr = EnemyFactory.Init().GetIsUsePlane(); //1.从敌机对象池中取出已经在使用的飞机 let isHit = false; let hitevent = new HitEvent(HitEvent.EventString); for (var i = 0; i < this._bullet.length; i++) { if (this._bullet[i].IsUse == true) { //2.循环遍历子弹对象池,使用IsUse状态为true的子弹 if (this._bullet[i].btype == IdentityType.ENEMY) { //3.判断子弹类型,如果是敌机发射的,那么就和主角进行碰撞检测 isHit = GameUtils.hitTest(e, this._bullet[i]) hitevent.htype = HitType.ENEMY_TO_HERO; } if (this._bullet[i].btype == IdentityType.HERO) { //4.如果是主角发射的。那么就和第一步的取出来的数组进行碰撞检测 for (var j = 0; j < arr.length; j++) { if (arr[j].IsUse) { isHit = GameUtils.hitTest(arr[j], this._bullet[i]) hitevent.enemy = arr[j]; hitevent.htype = HitType.HERO_TO_ENEMY; } } } if (isHit) { //如果碰撞检测为true,那么触发HitEvent事件,并传递检测结果,并手动调用子弹的回收方法 this.dispatchEvent(hitevent); this._bullet[i].Recycle(); } } } return isHit; }
从敌机对象池中取出已经使用的敌机对象
public GetIsUsePlane(): EnemyPlane[] { let planes = []; for (var i = 0; i < this._enemys.length; i++) { if (!this._enemys[i].IsUse) { planes.push(this._enemys[i]) } } return planes; }
然后监听HitEvent来对击中的事件做操作。
判断事件类型,知道是谁被击中了,然后对应做出不同的处理,如果主角被击中,那么可以做扣除HP值等操作,敌机被击中,可以做主角加分,把敌机抹除掉等操作
this._bullets.addEventListener(HitEvent.EventString, (e: HitEvent) => { console.log("子弹碰撞事件触发:" + e.htype) if (e.htype == HitType.ENEMY_TO_HERO) { //Hero被击中 } if (e.htype == HitType.HERO_TO_ENEMY) { //Enemy被击中 e.enemy.Recycle(); this._Score += 1; console.log("当前分数:" + this._Score); } }, this)
然后运行,就可以看到子弹击中飞机,会被回收,然后触发HitEvent事件。
分类:
Egret学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端