运行起来,虽然主角飞机和敌机都在互相发射子弹,但是子弹打中了就和没打中效果是一样的。。

这一章我们就来处理子弹和飞机的碰撞问题。

我们所有的操作都是基于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 = ; 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 = ; 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 = ; 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 += ;
console.log("当前分数:" + this._Score);
} }, this)

然后运行,就可以看到子弹击中飞机,会被回收,然后触发HitEvent事件。

Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)的更多相关文章

  1. Egret学习笔记 (Egret打飞机-5.实现子弹对象)

    上一章把飞机添加到屏幕上,但是飞机要发射子弹对吧?那么这一章我们就来实现一下发射子弹,并实现一个简单的子弹对象池 先来捋一捋思路 1.创建一个子弹对象 2.然后添加一个bitmap,显示子弹贴图 3. ...

  2. Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)

    经过前面几章的准备,我们差不多已经具备了一个基本的框架,这一章我们就开始添砖加瓦了. 敌机定时发射一个子弹,子弹的方向是从上到下,但是发射子弹的代码应该放在哪儿呢? 从面向对象编程的思想来说,子弹是敌 ...

  3. Egret学习笔记 (Egret打飞机-7.实现敌机工厂)

    在游戏过程之,敌机是源源不断的冲屏幕上方往下飞,如果我们每一架敌机都直接new的话,在飞机很多的情况下,也许有性能问题. 就像前面子弹对象池一样,我们也要实现一个飞机对象池,也就是标题说的敌机工厂(之 ...

  4. Egret学习笔记 (Egret打飞机-6.实现敌机飞起来)

    有了子弹,总得有敌人来打吧,不然游戏有啥意思呢?今天我们来实现敌机从屏幕上边往下飞 参考微信打飞机游戏里面,敌机分为3种 1是特小飞机,2是小飞机,还有一种就是大飞机 面向对象编程提倡抽象,实现代码复 ...

  5. Egret学习笔记 (Egret打飞机-1.大致思路)

    大致看了一遍Egret的官方文档,就开始打算使用Egret来开发一个打飞机游戏. 首先来捋一捋思路,先来看一看一个打飞机游戏的图片 基本上一个打飞机游戏分为 开始游戏   ----------进入游戏 ...

  6. Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)

    今天继续写点击了开始之后,添加一个飞机到场景中,然后这个飞机的尾巴还在冒火的那种感觉 先拆解一下步骤 1.首先完成飞机容器的图片加载 2.然后把容器添加到场景中 3.然后实现动画 -首先,我们新建一个 ...

  7. Egret学习笔记 (Egret打飞机-3.实现背景循环滚动)

    游戏背景里面的猪脚飞机看起来是一直在向前飞,但是实际上只是一个视觉差而已. 猪脚是出于不动的状态,背景从上到下滚动,然后让玩家觉得飞机在不停的往前飞.(当然这只是其中一种实现思路) 差不多就是这样,然 ...

  8. Egret学习笔记 (Egret打飞机-2.开始游戏)

    打开 Egret Wing,新建一个Egret游戏项目,然后删掉默认生成的createGameScene方法里面的东西 然后新建一个BeginScene.ts的文件,作为我们的游戏的第一个场景 cla ...

  9. Egret学习笔记.1 (写在前面的废话)

    我记得之前谁说过,大部分程序员入行,都是因为小的时候的游戏机啊,各种电子设备啊....觉得有意思,才入的行 . 至少我本人是因为之前上高中那会儿,喜欢玩手机.那会儿还是MTK,塞班的时代,喜欢拿着手机 ...

随机推荐

  1. rsync - 远程同步工具

    一直没有对这个命令太有深入的理解 简介 rsync 即 remote sync,一个远程与本地文件同步工具.rsync 使用的算法能够最小化所需复制的数据,因为它只移动那些修改了的文件. rsync ...

  2. Django 发送邮件

    问题: 对于一些错误信息或用户注册账号的时候,需要给用户发送邮件进行验证. 以用户注册发邮件为例子,用户向后端提起注册,后端收到用户邮箱,对邮箱格式进行验证,然后发送邮件,邮件内容中包括邮件标题.邮件 ...

  3. python_6_字符串

    什么是字符串? --一般用户输入数据和一堆有意义或者没有意义的文字符号组合 对字符串有哪些操作? --字符串本身不能修改,可以切片,可以读取 -- .capitalize()              ...

  4. JDK 中的设计模式应用实例

      在 JDK(Java Development Kit)类库中,开发人员使用了大量设计模式,正因为如此,我们可以在不修改 JDK 源码的前提下开发出自己的应用软件.研究 JDK 类库中的模式实例也不 ...

  5. 一个Android上的以滑动揭示的方式显示并切换图片的View

    SlideView是一个Android上的以滑动揭示的方式显示并切换图片的View,以视觉对比的方式把一套相似的图片展示出来. 示例 翻页图片揭示效果: 特性 设置一组(List<ImageIn ...

  6. 【转】新手该如何学python怎么学好python?

    1)学好python的第一步,就是马上到www.python.org网站上下载一个python版本.我建议初学者,不要下载具有IDE功能的集成开发环境,比如Eclipse插件等. 2) 下载完毕后,就 ...

  7. Git 2.0 更改 push default

    近期更新了git,项目push时会提示这样的信息: warning: push.default 尚未设置,它的默认值在 Git 2.0 已从 'matching' 变更为 'simple'.若要不再显 ...

  8. Notepad++ 运行java(转)

    Notepad++ 运行java java, 2013/05/04, 9 replies, 6,007 views 文章目录 Notepad++ for java 安装必须的程序 配置NppExec ...

  9. Bug等级判断标准

    测试的问题大致可分为以下几个类型:致命问题严重问题一般问题轻微问题 判断标准如下1.致命问题:造成系统崩溃.死机.死循环,导致数据库数据丢失,与数据库连接错误,主要功能丧失,基本模块缺失等问题.如:代 ...

  10. NOI2001 食物链

    食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种 ...