传说,面向对象的开发模式最初是因为程序员偷懒而不小心诞生的。发展至今,人们从最初的热忠于讨论某某语言是否足够面向对象到现在开始更广泛的关注面向对象的思想而不是具体内容。面向对象的思想其实并不深奥,它存在的目的只有一个:让程序开发更贴近我们的现实世界。

还记得猫、猫叫;狗、狗吃东西吗?无数的程序员都喜欢将此类似的情形设计当作面向对象最好的例子。是的,非常生动且形象;但实际运用中你是否能真正做到举一反三?

回述到游戏设计中,大家是否时常会感觉游戏世界与我们的真实世界如此贴近?游戏中的精灵好比我们人类,更广泛的,你可以将精灵看做游戏世界中任意的生命体。在现实世界里,“人”是我这样的家伙的统称,“人”可以站立,可以移动,可以战斗,可以受伤,可以死亡;在游戏世界里,“精灵(Sprite)”是所有生命体的统称,“精灵”同样可以站立(Stand),可以移动(MoveTo),可以战斗(Attack),可以受伤(Injured),可以死亡(Death)。当然,梦幻般的它们或许还能施法(Casting)甚至飞行(Fly)。能够移动,因此必须有速度(Speed)和方向(Direction);可以死亡,因此必须有它活着的证明(Life)……于是,一个非常非常贴近我们现实生活的游戏“精灵类”出现了:

每个“人”都生活在各自的“城市”里,“城市”有路,有桥,有山,有水……多种多样的地况形成了整个城市的立面结构;“精灵”存在于各自所处的“场景(Scene)”中,每个“场景”都拥有一张生动的背景地图(Map)展示着美丽的风景,精灵们就是在这样铺设着坐标系(Coordinates)的“场景”里自由自在的生活。只要高兴,它们随时都可以到不同的“场景”走亲访友或者探险旅游。因此,“场景”管理着它内部的所有对象如“精灵”、“魔法”等,作为承载游戏各元素的重要枢纽,它有着非凡的意义:

玩家是游戏世界中的“上帝”,他经营着游戏中所能掌控的一切;精灵去血了,升级了得报告“上帝”;雷达发现敌情了得通知“上帝”;场景切换了,要让“上帝”看见;GameOver了,“上帝”要知道。假如说“人”生活在城市里,而所有的人、城市又构成了整个地球,更广义的说就是整个世界,所以,“世界”就是我们“人”所生活的舞台。同样的,在游戏世界里的所有一切对象如“精灵”,“场景”,以及向“上帝”打报告的各种“面板”,它们之间要连通,要交互也同样需要这样一个平台。没错,它就是“游戏窗口(Window)”,类似于MainPage.xaml。游戏世界中所有对象如果需要和其他外部的对象进行交互,只需为自己添加委托事件,在“游戏窗口”中需要的地方触发这个事件即可实现。举个最最简单的例子,“精灵”在不断的移动,移动是“精灵”与生俱来的能力,因此它自己就可以轻松搞定:sprite.MoveTo(…)。但是,此时“上帝”想要通过“雷达地图面板”了解该“精灵”所处的准确位置,我们不能再通过sprite.TellRadar(….)了,因为“雷达地图面板”是“游戏世界”的财产而非某个“精灵”的内部资源。于是乎“精灵”想到了一个好办法,它决定每走一步都在地上做个自己所特有的记号,从而告诉“游戏世界”:我现在在这儿了。转换成编程语言就是定义“精灵”坐标变化事件及相应的委托:

public delegate void CoordinateEventHandler(Sprite sprite, DependencyPropertyChangedEventArgs e);

public event CoordinateEventHandler CoordinateChanged;

当“精灵”移动且坐标改变时触发(即做记号)

private static void ChangeCoordinateProperty(DependencyObject d, DependencyPropertyChangedEventArgs e) {

……

    if (sprite.CoordinateChanged != null) {

        sprite.CoordinateChanged(sprite, e);

}

……

}

最后,通过在“游戏窗口”中注册这个事件,一旦“精灵”坐标改变即通过“雷达地图面板”告诉“上帝”:

sprite.CoordinateChanged += (s, e) => {

    radar.TellGod(……);

};

由此得到,“游戏窗口”就是游戏中万物之间的交流平台,对象与对象之间的交互都在其内部完成:

        到此,大家是否已能理清“精灵”,“场景”,“游戏窗口”这3个“游戏世界”中最基础且必不可少的重要元素之间的关系了?亲爱的朋友们,请放飞思想,用现实世界的现象和原理去反向叙述机器所操控的“游戏世界”,你定会发现其实一切都是那么的轻松而惬意。是的,这就是面向对象思想给我们带来的福利:让程序开发更简单!

仿佛又废话了一节,保守估计又要开始有朋友给这个仍不知悔改并坚持以大无畏的精神忽悠读者的深蓝丢鸡蛋了。其实,我写的每篇文章都有它存在的原因或价值,承上启下是外因,更重要的是我发现就算再简单再好理解的代码都能让很多朋友望而生畏,其实并非不懂编程,我理解的是大家更多缺少的是属于自己的思维,那种勇于创新不害怕失败的自我潜能深挖掘的精神,这才是我最终想要传达的思想,同样也是这新一部系列教程所要阐述的Silverlight游戏设计理念。

在这样的思路的指引下,历时大半个月利用业余时间制作完成了这个Silverlight场景编辑器,可谓呕心沥血之作。但是,至从它出现后,更多的朋友反而会这样觉得:“深蓝的作品真是一部不如一部,哎,失败,失败中的失败。”真的是这样吗?俗话说内行人看门道,外行人看味道。懂行的一看就知道是个好宝贝,豪不惭愧的说,它可以制作你目前所玩过的一切2D游戏的图形框架,而它的核心算法仅有两个,而且还是我第一部教程第十节中早已提到的那两组公式;更重要的是,它的结构非常简单且代码量少,绝对的通俗易懂。

下一节,我将开源这个场景编辑器。紧接下去后面的章节,我会向世界展示这个Silverlight-2D游戏场景编辑器的伟大!还是不相信哪??嘿嘿,关注哦~

在线演示地址:http://silverfuture.cn

WPF/Silverlight
作者:深蓝色右手
出处:http://alamiye010.cnblogs.com/
教程目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。
posted on 2010-03-08 20:57  深蓝色右手  阅读(6270)  评论(10编辑  收藏  举报