Silverlight开发MMORPG游戏研讨(1):游戏布局
前言
最近一直在关注深蓝色右手的系列游戏教程,突然发现制作游戏原来并不是那么遥不可及。感谢深蓝色右手的工作和无私的共享精神,心中久已埋藏的开发自己的MMORPG游戏的梦想又重新被唤起,决定用silverlight打造一款自己想要的MMORPG游戏。尽管深蓝色右手在教程中已经写了很多核心算法和技术,同时公布了源码,但是有些细节的地方还需要自己来琢磨,研究。作者的目的很明确,就是用silverlight制作MMORPG游戏。所以针对这一目的,对深蓝色右手的教程和源码进行了拿来主义。
相信很多朋友跟作者一样读了深蓝色右手游戏引擎的源码,对其完全用C#实现并面向对象的编程佩服不已。完全重复深蓝色右手的内容就失去了学习的意义和乐趣,所以作者试图采用一些不同的方法去实现,当然核心的东西还是万变不离其踪的。在参考深蓝色右手的教程和源码的基础上,作者根据自己的目的和理解进行了改造,在后续文章中会着重阐述这些不同的东西,提出一些自己的见解和思路。
最让作者佩服的地方是深蓝色右手身兼developer and designer竟然游刃有余。作者是地地道道的developer出身,对制作和提取图片素材一窍不通,所以深蓝色右手的素材照单全收了,在演示中将会引用,希望不要见怪。
一切才刚刚开始,过程中相信会遇到各种各样的问题。有些现在已经可以预见,更多无法预知的困难可能还在前面。既然决心已下,又有象深蓝色右手这样的导师指引前进的道路,相信所有问题最终会一一解决的。在开发的过程中,作者将把一些值得分享的经验和问题在这里发布出来,一方面希望会对同道的朋友有所帮助,另一方面限于作者水平,难免有不到或错误的地方或者疑难的问题,希望高手朋友们可以不吝赐教。
合理的窗口尺寸
在浏览器打开一个silverlight应用程序,尤其是silverlight游戏,第一个主观印象可能是窗口尺寸。玩rpg游戏,玩家当然希望可视的空间大一些,视野开阔一点。由于silverlight是基于浏览器的(暂不考虑独立于浏览器运行和全屏模式),窗口尺寸受制于浏览器的可视窗口大小(去除菜单栏,工具栏,状态栏),同时也受制于显卡分辨率的设置,所以很难用一个固定的窗口尺寸来满足所有情况。
silverlight.net论坛有一个这方面的讨论,http://forums.silverlight.net/forums/t/114830.aspx,结论是目前最低的分辨率设置为1024 x 768。考虑到去除浏览器讨厌的各种栏占据的空间,作者决定尝试900 x 600作为silverlight游戏的窗口尺寸。代码如下:(index.html)
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="900" height="600">
<param .../>
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/>
</a>
</object>
<param .../>
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/>
</a>
</object>
不好说这个窗口尺寸最合理,如果读者有更好的方案,请提出来一起讨论。
Xaml混合C#编程
深蓝色右手的源码除了程序入口是个Xaml文件(并非用于布局),再看不到一行Xaml代码。这样一来似乎silverlight一半的长处给放弃了。
Xaml并非必不可少,但是用Xaml更加方便布局,简单直观,层次分明,便于理解,不用实在心有不忍。动态加载元素不太适合使用Xaml,对于静态的各种窗口和容器,Xaml十分方便。代码如下:(MainPage.xaml)
<UserControl x:Class="RpgEngine.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:entities="clr-namespace:RpgEngine.Entities"
mc:Ignorable="d" d:DesignWidth="900" d:DesignHeight="600">
<Canvas x:Name="gameWindow" Width="900" Height="600" >
<entities:GameMap Name="gameMap">
<entities:GameCoordinateSystem Name="gameCoordinateSystem" Background="Transparent">
</entities:GameCoordinateSystem>
</entities:GameMap>
</Canvas>
</UserControl>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:entities="clr-namespace:RpgEngine.Entities"
mc:Ignorable="d" d:DesignWidth="900" d:DesignHeight="600">
<Canvas x:Name="gameWindow" Width="900" Height="600" >
<entities:GameMap Name="gameMap">
<entities:GameCoordinateSystem Name="gameCoordinateSystem" Background="Transparent">
</entities:GameCoordinateSystem>
</entities:GameMap>
</Canvas>
</UserControl>
从上面的Xaml代码中可以很清楚的看出游戏布局的层次关系,一目了然。最下层gameWindow定义了游戏者的可视窗口,可以类比为IE的窗口。第二层gameMap定义了游戏的地图,可以类比为IE的文档视图。第三层(不称为最上层是因为上面还会有很多动态加载元素)定义了游戏中使用的坐标系。因为这三个层不会被反复动态卸载加载,所以比较适合用Xaml来表述。下一节将详细论述这几个层的具体用途以及相互之间的关系,还有各个类的构造及关系。
什么,和深蓝色右手的演示差不多?没错,这正是下一节要说明的:同一个现实世界,不同的主观认识和描述。适合自己的才是最好的。细心的朋友可能会发现些许的不一样,后面的文章会着重介绍和讨论,现在先卖个关子。
游戏核心算法全部来自深蓝色右手的源码,不同的部分将在后续的文章中详细阐述,所以源码就直接学习深蓝色右手的正宗原版吧。