Silverlight游戏设计:(三)一切起源于这个真实的世界2011-08-12 博客园 深蓝色右手一直以来,我不断的在思考着如何能让Silverlight在游戏制作方面更简单。《圣经》说:上帝创造了 世界;“游戏”无论在何等年代,都被视为生物在一定程度上模拟真实世界而进行的特定活动。基于爱因 斯坦的时空理论,存在于世界中的万物其根本结构为3维空间 + 1维时间,于是乎脑海中浮现出了一个很 棒的游戏基类:GameBase。“物体”,用以形容世界中的一切对象,作为客观存在,我们无法实例化它:public abstract class GameBase。所有的“物体”都具备3维空间特性,简单的说即X、Y、Z:
/// <summary>
/// 获取或设置X、Y坐标
/// </summary>
public virtual Point Coordinate {
get { return new Point(Canvas.GetLeft(this), Canvas.GetTop (this)); }
set { Canvas.SetLeft(this, value.X); Canvas.SetTop(this, value.Y); }
}
/// <summary>
/// 获取或设置Z层次深度
/// </summary>
public int Z {
get { return Canvas.GetZIndex(this); }
set { Canvas.SetZIndex(this, value); }
}
将Coordinate定义为Point类型为了方便被Storyboard动画所兼容,并且作为一个virtual虚属性,子 类可以根据自身特定需求选择是否重写。另外,我们还必须赋予“物体”一个用以容纳其他部件的外在“躯体”,以至我们能在视觉上看到它 :GameBase : CanvasCanvas是非常不错的选择。相较于Image,它拥有同样出色的Background属性用于“躯体”图片的呈现 ;而对比Grid,同样作为继承自Panel的容器控件,它能轻松布局所包容的一切对象于身体的任何角落。 总的评价:超薄、轻量,简约而不简单。最后,我们还得赋予“物体”一个能获取外部图片进行“皮肤”包装的渠道,又见GetImage方法:
/// <summary>
/// 获取指定路径的图片
/// </summary>
protected virtual BitmapImage GetImage(string uri) {
return new BitmapImage((new Uri(string.Format(@"../Images/ {0}", uri), UriKind.Relative))){
CreateOptions = BitmapCreateOptions.None
};
}
该方法指定了图片为时时下载即呈现的获取方式。当然,作为virtual虚方法,任何“物体”的子类同 样可以根据自身需要进行重写。举个简单的例子,我希望精灵在还未下载完56张所有帧序列图片前仅用一 张图例来做呈现,那么我可以通过在精灵控件中重写GetImage方法,利用WebClient或其他的什么方式去 实现相关的逻辑行为,只要把握好图片资源从下载到呈现这整个流程,实现起来还是比较简单的。接下来,我将向游戏中引入最最重要的“一维时间”。在我们的真实世界里,“物体”从广义上讲可以划分为“动态物体”和“静态物体”。唯有“动态物 体”才会主动与时间进行交互,而“静态物体”则在无任何外部介入的前提下永恒不变。回述到游戏世界 ,游戏中最具代表性的“动态物体”莫过于家喻户晓的精灵(Sprite),它以各种形态广泛的存在于所有 游戏中:

(素材来源:卡嘎亚 精灵)