Welcome

首页 / 软件开发 / C# / C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十四)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十四)2010-02-23 博客园 深蓝色右手C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十四) Be careful!前方怪物出没

游戏的精灵框架到此为止算告一段落,让我们一同来体验它带来的神奇效应。

一个安静的黄昏,主角悠闲的甩着它帅气的毛发独跑于林阴大道。怎知天色已晚即将进入月亮的领地,嘿嘿,我们的故事就从这里开始:Be careful,前方怪物出没!

实在不忍心让主角空有一身武艺而无处施展,本节为了不再让它孤单,我将向游戏中加入可爱的妖精妹妹与之为伴:

好象在哪见过呢?对,就是她了,可爱吧(QXGameEngine中的怪物,^_^||难怪这眼熟)。

妖精怪物属于精灵类型,因此要让它在游戏中出现,我们只需创建QXSpirit的实例;这里首先我添加一个刷怪方法InitMonster,接着循环添加怪物精灵实例及参数:

QXSpirit[] Monster;

/// <summary>

/// 初始化怪物(刷怪)

/// </summary>

/// <param name="num">怪物数量</param>

private void InitMonster(int num) {

Monster = new QXSpirit[num];

Random random = new Random(); //测试用,随机数坐标

for (int i = 0; i < num; i++) {

if (Carrier.FindName("Magicer" + i.ToString()) == null) {

Monster[i] = new QXSpirit();

Monster[i].Name = "Magicer" + i.ToString();

Carrier.RegisterName(Monster[i].Name, Monster[i]);

Monster[i].Equipment[0] = 100;

Monster[i].Equipment[1] = 0;

……

Monster[i].X = 2000 - random.Next(1000);

Monster[i].Y = 1500 - random.Next(1000);

……

Carrier.Children.Add(Monster[i]);

}

}

}

代码太多我就不一一罗列了,下面我提取部分重要的参数进行讲解。首先我定义一个Random类型随机函数用于随机数值的产生,接着判断每一个有名字的精灵是否存在,如果不存在则加入到游戏中。这里为精灵注册名字的目的是为了以后方便管理,例如精灵死掉了,我们需要找到它的实例并将之移除,而惟有通过它的名字或ID之类的方能将之捕获;同时,在定时刷怪的机制下,我们得首先判断某精灵是否还存在,如果存在则不可能再多刷一个,就好比网络游戏中大家是否都有过蹲点等刷BOSS暴装备的经历,一个萝卜一个坑,同一点上刷出两个双胞胎BOSS,这是很匪夷所思的事。那么定义完怪物的名字后,我们接着还需要定义它的身体图片代号,本例中它的代号为100(为了与主角类精灵用的身体图片区别,我以0-99代表主角类身体(衣服)代号范围,100-N代表怪物(NPC)类身体代号范围),最后通过前面的random来定义它们的初始坐标:以(2000,1500)为中心边长为1000的正方形范围内的随机位置。

就这么完啦?对,简单吧,还是那句老话,拓展性优良的架构是经得起全方位的考验滴。嘿嘿,刷它30个怪(InitMonster(30))测试一下: