代码改变世界

silverlight游戏设计(七)--项目组织

2010-12-24 16:30  姜 萌@cnblogs  阅读(1145)  评论(0编辑  收藏  举报

组织项目结构总揽

完成一个好的项目就像盖房子,光有一流的工人师傅还不够,还需要将他合理分工,这样才能确保工程的有序进行,各负各的职责。一起的一个项目大致是这样的结构:

image 

GameLibrary:作为整个游戏所需要的基础库和游戏引擎。当然实际中的会包括许多library。

GameBiz:游戏的逻辑,并作为游戏执行入口,它向UI注册事件,通过基础库和游戏引擎构建业务逻辑。引用GameLibrary等基础库和GameUI。

GameUI:只引用silverlight本身必须的库以及项目的自定义控件库

GameLoader:游戏的引导器或者叫做加载器,参见之前的文章:silverlight游戏设计(一)主程序加载器

GameLibrary

如果说一个游戏是人的身体,那么游戏的基础库和引擎就是五脏六腑,它驱动着整个身体的运转。这部分是游戏的底层核心,对于mmorpg webgame而言,至少要包括网络通讯,util/extensions,安全(比如加密解密)、资源包操作管理、各种精灵角色及精灵控制、场景等。

GameBiz

有了五脏六腑,还需要个充满智慧、逻辑性的大脑,要么岂不成了行尸走肉。这部分是一个具体的游戏逻辑的实现就相当于人的大脑,像下饮用GameLibrary,像上引用GameUI,作为游戏的入口点。

之前我们说到,webgame应该是有一个loader,在下载完所需的模块后动态的创建游戏主体,那么具体怎么联系到GameBiz呢?我们只需要约定一个接口,在将游戏运行的所必须的所有assembly加载到程序域中后调用下这个接口,将游戏的配置传递过去就ok。

var gameApp= asm.CreateInstance("GameBiz.GameApp") as GameApp;
gameApp.StartGame(gameConfig)

 

GameApp.StartGame所要做的就是根据配置初始化整个游戏,包括建立网络连接、初始的资源包解析等工作。

 

GameApp
public class GameApp
    {
        
public static readonly GameApp Instance;
        
static GameApp()
        {
            Instance 
= new GameApp();
        }
        
public void StartGame(GameConfig config)
        {
            
//……
        }
        
public UIElement GameMainUI
        {
            
get;
        }
        
public void AlterRootVisual()
        {
            AlterRootVisual(GameMainUI);
        }
        
public void AlterRootVisual(UIElement newRoot)
        {
            App.Current.RootVisual 
= newRoot;
        }
    }
    ……
}

 

 

让GameBiz关联UI

在初始化完我们的游戏核心和逻辑后就要呈现游戏界面了,很简单只需设置Application.RootVisual这个属性,在代码中调用:

App.Current.RootVisual = ……//你的游戏主窗口。
那么我们的UI怎么来呢,需要有一个视图容器对所有UI引用进行管理,比如这里我写一个GameUIContainer的单例(IoC或者单例引用依据个人偏好,这里为了方便用单例做示范)。

 

GameUIContainer
public class GameUIContainer
    {
        
public static readonly GameUIContainer Instance;
        
static GameUIContainer()
        {
            Instance 
= new GameUIContainer();
        }
        
/**
        * 游戏的主窗口,或是第一个显示在玩家眼前的界面
        * /
        MainFace GameMainFace
        {
            get;
            internal set;
        }
        ……
    }

 

 

好了,这样我们就能在GameBiz模块中通过这个视图容器来控制游戏的界面的显示。

ok,项目划分好了,美术&程序员们专心的去做GameUI这块,核心研发们去弄GameLibrary这块,负责游戏逻辑的同志去弄GameBiz,您的游戏项目开发正在有序进行……:-)