21.多武器平台——组合模式
新的游戏特色又出来了,游戏要更接近真实战争,有些游戏单位需要不止一种武器。比如以下这些情况:
l 坦克和要塞单位有一门火炮和一挺机关枪;
l 战斗机装上两挺机关枪;
l 工程兵同样可以使用机关枪战斗;
l 驱逐舰需要两门大炮,并且还在考虑是否需要添加鱼雷和机关枪。
好吧,你已经明白了,也就是有些游戏单位需要装上两种或两种以上的武器。
如果修改每一个这样的游戏单位类,工作量大不说,更重要的问题是他们的需求也不一样,有的是两种武器、有的可能是三种武器或者更多;那我们应该怎么办呢?
现在先回想一下,我们在设计模式中学到了什么?
l 多组合、少继承。这是设计模式最基本的原则之一,我们已经使用各种武器和行为组合出了不同的游戏单位。
l 多扩展,少修改。自从我们使用了设计模式以后,当需要新功能时,我们总是在扩展新的代码,而很少修改原有的代码。
使用组合模式
组合是一种代码组织方法,当然也是一种设计模式,即组合模式(Composite Pattern),他的定义是:将对象组合成树状结构来表现“整体/部分”层次结构,使用客户可以使用一致的方式来处理个别对象以及对象组合。
在我们的这个需求中,我们可以使用一个武器平台(Weapon Platform),在这个平台上,我们安装多种已存在的武器;然后,我们还需要将武器平台安装到各种游戏单位上;为了达到这个目的,武器平台也应该实现IWeapon接口才可以,也就是说武器平台也应该实现Attack()方法。
武器平台和各种武器的结构如下图:
思路已明晰,现在我们就创建武器平台的类(CWeaponPlatform),代码如下:
''武器平台类
Public Class CWeaponPlatform
Implements IWeapon
Property arrWeapon As New ArrayList
'武器平台至少有一种武器
Public Sub New(ByVal weapon As IWeapon)
arrWeapon.Add(weapon)
End Sub
'添加武器
Public Sub AddWeapon(ByVal weapon As IWeapon)
arrWeapon.Add(weapon)
End Sub
'平台开火了
Public Sub Attack(ByVal x As Integer, ByVal y As Integer) _
Implements IWeapon.Attack
Dim w As IWeapon
For Each w In arrWeapon
w.Attack(x, y)
Next
End Sub
End Class
(项目:CompositePattermDemo 文件:CWeaponPlatform.vb)
因为武器平台至少应该有一种武器,所以,在这个类的构造函数定义中我们需要带入一种武器类型;然后,我们可以使用AddWeapon()方法添加更多的武器,因为在游戏单位中可能安装两种一样的武器,所以,我们在添加武器时并没有判断武器在arrWeapon中是否已存在;最后是实现IWeapon接口中Attack()方法,请注意在此方法的代码中,当武器平台攻击时,实际上是其中的所有武器在执行攻击动作。
接下来的工作就是武器平台装上游戏单位,而不是某一种武器;当然,我们还是需要在游戏单位类中修改代码,因为这些单位的武器只能在本类中设定;但我们有了武器平台类,可以很方便地、不动声色地修改这些单位的武器。下面以坦克单位为例:
''坦克
Public Class CTank
Inherits CUnit
Public Sub New()
Dim wp As New CWeaponPlatform(New CCannonWeapon)
wp.AddWeapon(New CMachineGunWeapon)
myWeapon = wp
myBehavior = New CLandBehavior
mySpeed = 25
UnitId = EUnit.Tank
End Sub
End Class
(项目:CompositePattermDemo 文件:Units.vb)
最后,我们使用一辆M1坦克测试这些代码:
Module Module1
Sub Main()
Dim landUnitCreator As New CLandUnitCreator
Dim m1 As IUnit = landUnitCreator.CreateUnit(EUnit.Tank)
Console.WriteLine("M1坦克")
m1.Attack(100, 200)
Console.ReadLine()
End Sub
End Module
(项目:CompositePattermDemo 文件:Module1.vb)
代码运行的结果如下图:
隔壁的那帮家伙甚至不用修改任何代码,他们一定很奇怪你是怎么做到的?请吃饭就告诉他们你是使用了组合模式。哈哈。
小结本章,我们的例子很简单,在实际的开发应用中,我们还可以使用组合模式创建很复杂的树状结构,如多级菜单等。在使用组合模式时,我们只要注意一点,在组合的“树”状结构中,无论是“根”或者是任何一个节点,它们都会有相同或相似的操作,就像本章示例中的武器平台和平台上的各种武器,它们都可以攻击(Attack)目标。
关于战争游戏,已经开发的差不多了,从下一章开始,你又参加了另一个游戏的开发,它是角色扮演类型的,有很多角色和装备;而且,我们还听说这个游戏的剧本是三国时期为背景的,不知道又有什么新花样。
出自:http://www.caohuayu.com/books/B0003/B0003.aspx