擎墨閣文學 2008-5-1 11:58
扑克牌类游戏DIY之一:整体布局的设计 (5)
[table=98%][tr][td]有了上面的代码,这个游戏已经可以表演了,但人不加入游戏不是没意义了吗?游戏者的操作上要讲求一个简易性,毕竟是游戏吗。牌类游戏大多是一鼠通天下的,所以操作上主要是处理鼠标事件。使用控件数组后,对所有牌的鼠标事件都可在一个过程中处理,因为当你点击某张牌时,系统会返回一个Index参数,根据这个参数可传递给智能过程计算,也可传给动画过程移动牌。[/td][/tr][/table][table=98%][tr][td]下面是一个示例,它实现了让被单击牌弹起一小段距离(如:图4),表示被选中。mcoSelectPK是一个保存每一方选中扑克的集合数组,集合mcoSelectPK(1)代表真人游戏者选中的牌。mlnPlayer1Y变量保存的是游戏者手中牌的Y轴座标,座标使用默认的“缇”作单位。[/td][/tr][tr][td][align=center][img]http://www.ccw.com.cn/htm/center/topic/02_5_28_2d.jpg[/img][/align][/td][/tr][/table][table=98%][tr][td]Private Sub pk_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)[/td][/tr][/table][table=98%][tr][td]If PK(Index).Tag = "0" Then Exit Sub '牌背面向上时,点击无效[/td][/tr][/table][table=98%][tr][td]If Button = 1 And (PK(Index).Left = mlnPlayer1Y Or PK(Index).Left = mlnPlayer1Y) Then[/td][/tr][/table][table=98%][tr][td]If mcoSelectPK(1).Count > 0 Then '当已有牌被选中时,需检查所点击牌是否已被选中[/td][/tr][/table][table=98%][tr][td]For i = 1 To mcoSelectPK(1).Count[/td][/tr][/table][table=98%][tr][td]If mcoSelectPK(1)(i) Is PK(Index) Then '判断两个引用是否是同一个控件[/td][/tr][/table][table=98%][tr][td]PK(Index).Top = mlnPlayer1Y '如已在选中集合中,则应该恢复原位[/td][/tr][/table][table=98%][tr][td]mcoSelectPK(1).Remove Cstr(Index) '从集合中删除 [/td][/tr][/table][table=98%][tr][td]Exit Sub '既已发现就不用再找了,直接退出整个过程[/td][/tr][/table][table=98%][tr][td]End If[/td][/tr][/table][table=98%][tr][td]Next[/td][/tr][/table][table=98%][tr][td]End If[/td][/tr][/table][table=98%][tr][td]PK(Index).Top = mlnPlayer1Y - 200 '若尚未被选中,则向上移动200缇,表示选中[/td][/tr][/table][table=98%][tr][td]mcoSelectPK(1).Add PK(Index),Cstr(Index) '把弹起的牌加入选中集合[/td][/tr][/table][table=98%][tr][td]End If[/td][/tr][/table][table=98%][tr][td]End Sub[/td][/tr][/table][table=98%][tr][td]前面的过程对所有牌的MouseDown事件都响应,游戏者当然不能动别人的牌,所以还要加上一些限制。如:只将允许操作牌的Enabled属性设为True,其余均为False;或根据牌所在的位置判别是否响应该事件,因为不同集合的牌都是有定位规律的,而以上事件产生时,系统提供的所单击牌的位置参数,正好发挥作用。[/td][/tr][/table][table=98%][tr][td]交互性中还应加入右键的处理,如右键的智能选牌:当右击某张牌时,所有同牌点的牌一起弹起。这就需编写一个在手中牌集合中按所单击牌的牌点,查找相同牌的过程。如果游戏做得复杂一点,还应建立窗体或某些控件的右键菜单,方法更简单,只需在对象的MouseUp事件中放入“PopupMenu 菜单名”语句就行了。[/td][/tr][/table]