技术开发 频道

Windows游戏专家:Silverlight3开发基础

  三、处理扑克控件的zIndex属性

  在开发纸牌游戏的过程中,另一个有趣但非常重要的问题是每张扑克牌的zIndex属性值的特征。我们知道,默认情况下,父控件中所有子控件都具有相同的zIndex属性值,即0。但是,由于Silverlight的设计特点,具有相同的zIndex属性值的各子控件在屏幕上呈现时仍表现出不同层的效果(如果位置相重叠,则稍后呈现的子控件看上去出现在较前呈现的子控件的顶部)。

  另一方面,当我们拖动扑克时一种合乎逻辑的拖动外观应当是,被拖放扑克位于所有其它扑克的上部。因此,我们必须人为地干预被拖扑克控件的zIndex属性值。此外,考虑到我们的游戏中总共有52张扑克和zIndex属性值的有效范围,我们可以采取这样的措施:每次对被拖动的扑克的zIndex属性的值加1—从而使其看上去一定位于所有其他扑克的上面。如果被拖动的扑克可以投放到目标位置,那么这个新的zIndex属性值不再变动;否则,我们需要再次更改当前拖动扑克的zIndex属性值,从而使其恢复拖放前的zIndex属性值—使其与其他扑克控件的相对层位置保持不改变。

  类似于上面,我们仍然给出用于控制扑克的zIndex属性值的主要方法。

public class Canvas : Panel

  {

  
public static readonly DependencyProperty ZIndexProperty;

  
public static int GetZIndex(UIElement element);

  
public static void SetZIndex(UIElement element, int value);

  
//others omitted…

  }

  显然,取得zIndex属性值使用GetZIndex方法,而设置zIndex属性值使用SetZIndex方法。对于扑克的zIndex属性值问题,我们不再作过多的解释。

  四、探讨Silverlight 3的鼠标双击支持

  在纸牌游戏中,双击鼠标左键(以下简称“双击鼠标”)的使用非常频繁。例如,当在左上部过渡区或下部有一张正面的扑克,而此时在目标扑克片堆叠中恰好有一个与之相匹配的扑克。此时,通过双击当前扑克,我们可以将其更迅速地移动到目标扑克片堆叠中。

  众所周知,目前Silverlight已提供对于单击鼠标的充分支持。但是,它却没有提供直接的双击鼠标支持,虽然我们可以通过间接的方法来做到这一点。为此,许多博客文章中争相展示各自的解决方案。在这个游戏中,我使用的是由迈克斯诺提供的解决方案。他的实现原理很容易理解:每当收到一次鼠标左键单击事件都要启动一个计时器DispatcherTimer。如果在双击的时间间隔内另一次鼠标单击事件被截获,那么说明发生了鼠标双击事件。这个时间间隔通常设置为200毫秒左右。200毫秒过后停止并禁用相应的定时器,直到收到下一次单击鼠标事件。

  【注意】虽然许多高手都建议使用200毫秒双击解决方案,但是在本纸牌游戏中并没有获得令人满意的效果。此外,本人已经测试过另外两个数字—300和400,但效果仍然不理想—有时你可能需要双击鼠标左键三次才能够获得双击效果。根据我的经验,在玩这款游戏时,如果你觉得双击有时会出问题,您可以更改为拖动的方式。

0
相关文章