与之前的操作类似,新建一个子弹的实体数据类,命名为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. 本地 无法启动 SQL Server 错误代码126
  2. linux c++开发问题汇总
  3. Android消息处理系统——Looper、Handler、Thread(转载)
  4. oracle: 安装客户端
  5. 十进制转换成二进制列表
  6. Spark中组件Mllib的学习40之梯度提升树(GBT)用于回归
  7. 3、PV、UIP、UV指的是什么
  8. kubernetes 实战 使用 nfs 作为动态 storageClass 存储
  9. JUnit5 @RepeatedTest注解示例
  10. [CF438E] 小朋友和二叉树
  11. Linux Netfilter conntrack对zone的支持
  12. Laravel 教程 - 实战 果酱社区 开源电商 API 系统
  13. 链表:21. 合并两个有序链表
  14. 【每日一题】递增序列中绝对值最小的数
  15. win10安装super-url出现编码错误解决方法
  16. uni-app分分钟解决苹果X以上型号黑线条兼容问题
  17. 英文简历技能证书撰写技巧汇总
  18. mod_security简要安装设置指南
  19. VM Tools 安装
  20. Cinema 4D R20 Essential Training: VFX Cinema 4D R20基本训练:视觉特效 Lynda课程中文字幕

热门文章

  1. Python 函数 sort(),sorted() 之区别及 key=lambda x:x[] 之理解
  2. PTA 7-14 电话聊天狂人(25 分)map的应用
  3. html设置字体facename,CRichEdit控件操作使用
  4. 2783: 魔法药水【二分】
  5. java中文括号转英文
  6. rails项目本地运行
  7. 顺丰丰桥接口开发-java(订单取消接口)
  8. 青海25项措施发展中藏医药 省领导任联席会议召集人
  9. 【调剂】东北石油大学计算机科学与技术专业接收调剂
  10. 计算机编程跟英语关系大吗,编程与英语的关系