本章内容源自于:Smoking Barrels
目前我们可以控制飞船四处移动了,但是不能射击。我们想要射击敌人。这确实是一件比较复杂的事情。首先我们需要一个子弹模型。这里我已经做好了一个你可以下载使用它。把这个模型跟飞船模型放到一起。不要忘记把blender格式文件转换成j3o格式文件。
开火射击
首先在模型组件中添加子弹模型的名字:
现在我们需要给输入控制系统添加控制子弹功能。在输入控制系统中添加如下代码:
继续添加如下代码初始化子弹:
我们给射击事件绑定了空格和鼠标左键两个触发按钮。然后我们需要创建一个ActionListener响应事件(注意不是AnalogListener)。将下列代码也添加到输入控制系统中:
actionListener中的逻辑很清晰:在距离飞船3.5单位的上方位置创建一个子弹。运行程序后,你会看到你射出去的子弹不动,屏幕中的子弹很生硬。
让子弹飞
我们怎样做才可以让子弹动起来?至少我们需要一个速度组件。代码如下:
然后我们在输入控制系统的ActionListener中给子弹添加速度组件:
我们的子弹将在2秒后攻击敌人。但是我们的子弹仍然不会动。我们应该怎么做呢?我想你已经猜到了,我们要创建一个子弹系统:
把子弹系统注册到主类中:
想想目前子弹会发生什么事情?如果子弹没有击中任何目标,那么子弹将在游戏中永远都不会消失!同时我们没有编写子弹击中物体相关逻辑的代码。所以我们下一步该怎么做?如果你是个新兵蛋子,一定会在子弹系统中添加一些方法处理离开屏幕的子弹。但是使用实体系统会有更优雅的方法解决这个问题。这是第二种实体系统的设计模式:实体回收系统。实体回收系统用于回收我们想移除的任何实体。也就是说,这种系统不但可以用于回收子弹,但凡具有回收组件标记的实体都会被回收掉。它是我最喜欢的设计模式。
实体回收系统
那么我们怎样回收已经攻击过入侵者的子弹呢?我们需要回收组件:
回收组件携带有移除倒计时信息,用于显示实体还有多久被移除。如果想要子弹离开屏幕后被回收,我们需要在创建子弹时添加回收组件:
子弹将存在2秒钟。接下来我们要写一个实体回收系统,当回收组件中的时钟到了就执行移除实体方法:
你可以看到,回收系统不仅仅可以移除子弹,入侵者、星际战舰都可以通过添加一个回收组件进行定时移除。