Spiga

《XNA游戏开发》在战机游戏中使用Decorator模式

2011-12-17 13:42 by 张剑, 875 visits, 收藏, 编辑

《XNA游戏开发》简介

《XNA游戏开发》Game1类的方法与字段

《XNA游戏开发》在战机游戏中使用Decorator模式

 

在之前的关于XNA的介绍中,我们主要讲解了XNA的一些基础,但是将我们在实现一些简单游戏时,众多对象的处理则是一个比较让人头痛的问题。

在这里,我们使用装饰模式来解决在现有对象基础上的扩展问题。

整个程序包括以下几个类文件:

Program XNA入口程序

Game1 完成基础数据加载、卸载,游戏进行时数据的更新、图型的绘制。

GameEngine 用来定义要扩展对象的职责,可以理解为一个装饰的标准。

Game 用来维护一个指向GameEngine的引用,可以理解为一个做装饰的工具。

Map 一个最基本的地图,也就是说我们要在这个地图上进行装饰。

Spirit 我方的飞机,继承自Game类,将来需要装载到Map上。

Bullet 我方子弹,同上。

Enemy 敌方飞机,同上。

EnemyBullet 敌方子弹,同上。

以下为各类之间的关系图:

需要注意的是,我们在Game的构造方法中,需要定义GameEngine的参数,以便于将来在装饰叠加时传值:

        private GameEngine ge;

public Game(GameEngine ge)
{
this.ge = ge;
}

//示列方法,在该方法中需要调用引用对象中的同方法。
public override void Update(KeyboardState input)
{
ge.Update(input);
}
//.......

那么,在继承Game这个装饰对象的类中,也需要去访问父类,也就是Game类的方法,以便得到对应的参数对象,和执行父类的方法:

    class Spirit:Game //继承父类
{
public Spirit(GameEngine ge)
: base(ge)
{

}

public override void LoadContent(ContentManager content)
{
base.LoadContent(content);
}
}


最后,在Game1中,就可以调用并完成最后的装饰工作:

 Game game;
        public Game1()
        {
            GameEngine ge = new Map();//基本的地图
            game = new Spirit(ge);//我方飞机加载到地图上
            game = new Bullet(game);//我方子弹加载到地图上
            game = new EnemyBullet(game);//敌方子弹加载到地图上
            game = new Enemy(game);//敌方飞机加载到地图上
        }

完成的效果图如下:

XNA游戏开发是业余爱好,不清楚在正真的XNA游戏开发种是如何来解决这种问题的。未来WP7中游戏的开发主要以XNA为主,大家可以研究一下,以下是提供的代码下载:

 

下载地址

标签: XNA, 设计模式
Add your comment

3 条回复

  1. #1楼 韦恩卑鄙 a-zhewg @waynebaby      2011-12-17 13:53
    我觉得lz 的问题不在Decorator模式的使用方式上 而是在于面向对象(或者说物件导向)最基本的“对象是什么,如何定义对象”上
     回复 引用 查看   
  2. #2楼[楼主] 张剑      2011-12-17 15:01
    @韦恩卑鄙 a-zhewg @waynebaby
    对,确实是如此。
     回复 引用 查看   
  3. #3楼 风海迷沙      2011-12-17 15:55
    一般来说游戏中的对象管理跟其他程序中面向对象的处理方法没什么太大区别,每个人实现的方法都不一样。
    使用面向对象,只是为了方便代码的管理而已。
    欢迎xna爱好者来http://xnaer.com
     回复 引用 查看