1.概述和场景管理

一.概述

我研究的比较深入的引擎有《Professional XNA Game Programming》(以后简称《ProfessionalXNA》)中介绍的引擎,http://www.innovativegames.net/blog/2009/10/18/innovation-engine-roadmap-2009-2010/上的引擎教程,这个教程在讲到编辑器时停了好长时间,与2009年10月又开始连载,好像作者重新进行了构思,并给出了路线图,使用Farseer Physics实现2D物理引擎,JigLibX实现3D物理引擎。本引擎主要参考了TXnaEngine,http://txnage.codeplex.com/,截止到2009年11月,最新版本是0.5.3。稍微研究过的是QuickStart Engine (3D Game Engine for XNA),http://quickstartengine.codeplex.com/,Ox Game Engine for XNA,http://oxgameengine.codeplex.com/,XEN,http://xen.codeplex.com/。

对引擎的架构来说,我觉得成熟的开源引擎Ogre,http://ogre3d.cn/wiki/非常值得参考,虽然它并不是用XNA编写的,TxnaEngine引擎的基本框架与Ogre的非常相像。

至于不开源的商业引擎,可以有试用版下载的是visual3d,http://www.visual3d.net/和NeoAxisEngine,http://www.neoaxisgroup.com/,这也是我想实现的最终目标。

NeoAxisEngine截图

NeoAxisEngine场景编辑器

二.场景管理

一个游戏通常有多个屏幕,首先要解决的问题就是如何管理这些屏幕。一个很好的例子就是XNA官方网站上的场景管理,http://creators.xna.com/en-US/samples/gamestatemanagement,具体的教程可见例子的注释或者《XNA 3.0 Game Programming Recipes》(以后简称《XNARecipes》)中的3.6 创建2D菜单界面,我的引擎就是参考这个例子的。

核心思想就是先创建一个代表屏幕的Scene类(在官网的例子中叫做GameScreen类),这个类包含所有场景中绘制的对象等,再创建一个SceneManager类(在官网的例子中叫做ScreenManager类)管理Scene的集合,实现添加、移除屏幕等功能,而SceneManager类从DrawableGameComponent继承,这样在引擎主类中就可以自动调用SceneManager类的Draw(),Update()等方法了,使用DrawableGameComponent的方法可参考《XNARecipes》中的1.7 使用GameComponents

下面是SceneManagement命名空间中的Scene类的代码:

namespace StunEngine.SceneManagement
{
    /// <summary>
    /// 表示屏幕所处状态的枚举
    /// </summary>
    public enum ScreenState
    {
        TransitionOn,
        Active,
        TransitionOff,
        Hidden,
    }
    
    /// <summary>
    /// 这是SceneNode得数据包含容器。一个Scene是根据绘制时间分组的对象的集合
    /// Scene对象是自我包含的,这样属于这个场景的SceneNodes不会和其他场景中的nodes发生交互
    /// 一个游戏可以包含一个或多个scene,但只有一个是激活的,只绘制属于它的nodes。 
    /// </summary>
    public abstract class Scene
    {
        成员变量和构造函数

        属性

        虚拟方法


        公有方法        
    }
}

其中叫做uiManager的类管理所有2D控件,下面会讲到。其他东西注释中已经写得很清楚了。

然后是SceneManager类的代码:

namespace StunEngine.SceneManagement
{
    /// <summary>
    /// SceneManager负责管理一个scene集合,创建,添加,初始化scene对象。
    /// 它还负责更新和绘制当前scene
    /// </summary>
    public sealed class SceneManager : DrawableGameComponent
    {
        构造函数和成员变量

        属性        

        DrawableGameComponent重载方法

        公有方法
    }
}

最后只要在引擎主类中添加SceneManager类就可以了:

namespace StunEngine
{
    /// <summary>
    /// 引擎主类
    /// </summary>
    public class StunXnaGE : Microsoft.Xna.Framework.Game
    {
        构造函数和成员变量

        属性

2006 - 2024,推荐分辨率1024*768以上,推荐浏览器Chrome、Edge等现代浏览器,截止2021年12月5日的访问次数:1872万9823 站长邮箱

沪ICP备18037240号-1

沪公网安备 31011002002865号