与之前的操作类似,新建一个子弹的实体数据类,命名为BulletData

    /// <summary>/// 子弹实体数据/// </summary>public class BulletData : EntityData{/// <summary>/// 发射位置/// </summary>public Vector2 ShootPostion { get; private set; }/// <summary>/// 飞行速度/// </summary>public float FlySpeed { get; private set; }public BulletData(int entityId, int typeId,Vector2 shootPositoin,float flySpeed) : base(entityId, typeId){ShootPostion = shootPositoin;FlySpeed = flySpeed;}}

编写对应的实体逻辑脚本

    /// <summary>/// 子弹实体脚本/// </summary>public class Bullet : Entity{/// <summary>/// 子弹实体数据/// </summary>private BulletData m_BulletData = null;protected override void OnShow(object userData){base.OnShow(userData);m_BulletData = (BulletData)userData;CachedTransform.SetLocalScaleX(1.8f);CachedTransform.position = m_BulletData.ShootPostion;}protected override void OnUpdate(float elapseSeconds, float realElapseSeconds){base.OnUpdate(elapseSeconds, realElapseSeconds);CachedTransform.Translate(Vector2.right * m_BulletData.FlySpeed * elapseSeconds, Space.World);//已达到最大飞行距离if (CachedTransform.position.x >= 9.1f){GameEntry.Entity.HideEntity(this);}}private void OnTriggerEnter2D(Collider2D collision){//隐藏管道与自身GameEntry.Sound.PlaySound(1);collision.gameObject.SetActive(false);GameEntry.Entity.HideEntity(this);}}

子弹在撞击到管道时会将自身与管道一同隐藏

到EntityExtension里封装一个显示子弹的方法

        /// <summary>/// 显示子弹实体/// </summary>public static void ShowBullet(this EntityComponent entityComponent, BulletData data){entityComponent.ShowEntity(typeof(Bullet), "Bird", data);}

接下来新建小鸟的实体数据类,命名为BirdData

    /// <summary>/// 小鸟实体数据/// </summary>public class BirdData : EntityData{/// <summary>/// 飞行力度/// </summary>public float FlyForce { get; private set; }public BirdData(int entityId, int typeId,float flyForce) : base(entityId, typeId){FlyForce = flyForce;}}

编写对应的实体逻辑脚本

    /// <summary>/// 小鸟实体脚本/// </summary>public class Bird : Entity{/// <summary>/// 小鸟实体数据/// </summary>private BirdData m_BirdData = null;/// <summary>/// 射击时间/// </summary>private float m_ShootTime = 10f;/// <summary>/// 射击计时器/// </summary>private float m_ShootTimer = 0f;private Rigidbody2D m_Rigidbody = null;protected override void OnShow(object userData){base.OnShow(userData);m_BirdData = (BirdData)userData;//修改缩放CachedTransform.localScale = Vector2.one * 2;if (m_Rigidbody == null){m_Rigidbody = GetComponent<Rigidbody2D>();}//重置射击冷却m_ShootTimer = 10f;}protected override void OnUpdate(float elapseSeconds, float realElapseSeconds){base.OnUpdate(elapseSeconds, realElapseSeconds);//上升控制if (Input.GetKeyDown(KeyCode.Space)){GameEntry.Sound.PlaySound(2);m_Rigidbody.velocity = new Vector2(0, m_BirdData.FlyForce);}//射击控制m_ShootTimer += elapseSeconds;if (m_ShootTimer >= m_ShootTime && Input.GetKeyDown(KeyCode.J)){m_ShootTimer = 0;GameEntry.Sound.PlaySound(3);GameEntry.Entity.ShowBullet(new BulletData(GameEntry.Entity.GenerateSerialId(), 4,CachedTransform.position + CachedTransform.right, 6));}}private void OnTriggerEnter2D(Collider2D collision){GameEntry.Sound.PlaySound(1);GameEntry.Entity.HideEntity(this);}}

同样需要到EntityExtension里封装一个显示小鸟的方法

        /// <summary>/// 显示小鸟实体/// </summary>public static void ShowBird(this EntityComponent entityComponent, BirdData data){entityComponent.ShowEntity(typeof(Bird), "Bird", data);}

在ProcedureMain类的OnEnter方法中,调用显示小鸟的方法

protected override void OnEnter(IFsm<IProcedureManager> procedureOwner){base.OnEnter(procedureOwner);GameEntry.Entity.ShowBg(new BgData(GameEntry.Entity.GenerateSerialId(), 1, 1f, 0));GameEntry.Entity.ShowBird(new BirdData(GameEntry.Entity.GenerateSerialId(), 3, 5f));//设置初始管道产生时间m_PipeSpawnTime = Random.Range(3f, 5f);}

现在可以运行测试一下

子弹碰到管道后会导致管道消失,小鸟碰到管道后自己也会消失

这时候会发现一个问题,在射击后如果小鸟很快就死亡,那么子弹还会继续发射,我们需要让子弹在小鸟消失的时候也跟着一起消息,这时候就需要使用自定义事件了

在Event文件夹下新建一个BirdDeadEventArgs,继承GameEventArgs

     /// <summary>/// 小鸟死亡事件/// </summary>public class BirdDeadEventArgs : GameEventArgs{public static readonly int EventId = typeof(BirdDeadEventArgs).GetHashCode();public override int Id{get{return EventId;}}public override void Clear(){}}

打开Bird脚本,在小鸟死亡的时候派发这个事件

 private void OnTriggerEnter2D(Collider2D collision){GameEntry.Sound.PlaySound(1);GameEntry.Entity.HideEntity(this);//派发小鸟死亡事件GameEntry.Event.Fire(this, ReferencePool.Acquire<BirdDeadEventArgs>());}

然后打开Bullet脚本,监听小鸟死亡事件并处理

    /// <summary>/// 子弹实体脚本/// </summary>public class Bullet : Entity{/// <summary>/// 子弹实体数据/// </summary>private BulletData m_BulletData = null;protected override void OnShow(object userData){base.OnShow(userData);m_BulletData = (BulletData)userData;CachedTransform.SetLocalScaleX(1.8f);CachedTransform.position = m_BulletData.ShootPostion;//监听小鸟死亡事件GameEntry.Event.Subscribe(BirdDeadEventArgs.EventId, OnBirdDead);}protected override void OnUpdate(float elapseSeconds, float realElapseSeconds){base.OnUpdate(elapseSeconds, realElapseSeconds);CachedTransform.Translate(Vector2.right * m_BulletData.FlySpeed * elapseSeconds, Space.World);//已达到最大飞行距离if (CachedTransform.position.x >= 9.1f){GameEntry.Entity.HideEntity(this);}}protected override void OnHide(object userData){base.OnHide(userData);//取消监听小鸟死亡事件GameEntry.Event.Unsubscribe(BirdDeadEventArgs.EventId, OnBirdDead);}private void OnBirdDead(object sender, GameEventArgs e){//小鸟死亡后立即隐藏自身GameEntry.Entity.HideEntity(this);}private void OnTriggerEnter2D(Collider2D collision){//隐藏管道与自身GameEntry.Sound.PlaySound(1);collision.gameObject.SetActive(false);GameEntry.Entity.HideEntity(this);}}

这样我们在小鸟死亡的时候如果子弹还在飞行的话就会发现子弹也和小鸟一起消失了

UGF游戏框架实例开发教程—FlappyBird(七)子弹发射与小鸟飞行功能的实现相关推荐

  1. WPF UI框架界面开发教程(七)

    Button加入等待动画,先运行软件看下效果 建立BusyFrameAnimation类,在类中创建Button中依赖属性IsBusyProperty public class BusyFrameAn ...

  2. 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立

    原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...

  3. 《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2

    <ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 原文:<ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 摘要:在第 ...

  4. 像素鸟 游戏开发教程 FlappyBird Game development tutorial

    像素鸟 游戏开发 教程 FlappyBird Game development tutorial 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...

  5. 《ArcGIS Engine+C#实例开发教程》第三讲 MapControl与PageLayoutControl同步

    <ArcGIS Engine+C#实例开发教程>第三讲 MapControl与PageLayoutControl同步 原文:<ArcGIS Engine+C#实例开发教程>第三 ...

  6. html5游戏制作入门系列教程(七)

    我们继续这一系列文章,使用HTML5的canvas组件进行游戏开发.我们将要更新完善我们的第4课html5游戏制作入门系列教程(四)的游戏实例,并增加了火球,敌人和碰撞检测等功能模块.所以,现在我们的 ...

  7. 【CSON原创】HTML5游戏框架cnGameJS开发实录(外部输入模块篇)

    返回目录 1.为什么我们需要外部输入模块? 在游戏中我们常常用到类似这样的操作:鼠标点击某位置,玩家对象移动到该位置,或者按鼠标方向键,玩家向不同方向移动,等等.这些操作无一不用与外部输入设备打交道. ...

  8. iOS 11开发教程(七)编写第一个iOS11代码Hello,World

    iOS 11开发教程(七)编写第一个iOS11代码Hello,World 代码就是用来实现某一特定的功能,而用计算机语言编写的命令序列的集合.现在就来通过代码在文本框中实现显示"Hello, ...

  9. Unity网络多玩家游戏开发教程第1章Unity自带网络功能

    Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件,专门提供了对网络功能的支持.但是,大部分开发者第一次接触到的还是Unity自带的网络功能,也就是大家经常说 ...

最新文章

  1. golang 字节切片 数组 字符串 互转
  2. saxreader读取服务器xml文件,使用SAXReader从xml文件读取元素
  3. OpenJDK install
  4. 用ZooKeeper做为注册中心搭建基于Spring Cloud实现服务注册与发现
  5. Matrix工作室第六届纳新AI组考核题(B卷)
  6. acer电脑设置u盘启动方法
  7. 12句让人心疼的话 哪一句说到你心里了?
  8. C++11新特性之auto关键字的使用
  9. JavaScript中的 in 操作符
  10. C++之List保存类内存问题
  11. 递归系列——数组和对象的相关递归
  12. python3 input函数
  13. 安卓资源字串中加全角空格、半角空格、换行、@%等特殊字符
  14. python哈希类型_python 入门之 – hash(十七)
  15. 云课堂在登陆时显示服务器错误,我的云课堂不能登陆怎么解决
  16. 小米5SPLUS Android9.0,小米5S Plus线刷MIUI9的教程_小米5SPlus MIUI9系统刷机包
  17. 手机抓包 fiddler 配置
  18. Java随机生成中文姓名工具
  19. 敏捷模式下携程的接口自动化平台演变
  20. Ubuntu 16.04 安装摄像头驱动usb_cam

热门文章

  1. 遇到问题–python–pytest: error: unrecognized arguments: --cov-report=html
  2. 7-14 电话聊天狂人 (25分)
  3. 用笔记本改装智能家居服务器,一年之后,改装4G版小米笔记本电脑的可行性
  4. jpinyin 将城市名汉字转化为拼音
  5. Spring依赖注入IOC(给字段赋值)和Spring测试
  6. Node.js中的egg入门、egg路由、egg控制器、egg服务、egg中间件
  7. 艾宾浩斯记忆曲线(遗忘曲线)
  8. mysql忽略中英文括号_MySQL查询删除方括号之间的文本?
  9. 浪客云黑-自助收录网站源码
  10. 2021四川高考成绩等位分查询,2021年四川高考位次排名查询,四川高考位次所对应的学校...