天天看点

Silverlight C# 游戏开发:面向对象在游戏中的实例(一)

本系列所有代码都是使用Microsoft Visual Studio 2008开发,为基于Silverlight的游戏开发技术,如果您看完之后觉得不错,回复顶一下,万分感激:)

今天我还是会提供一个Silverlight实例,但是在那之前,我们先研究一下面向对象的基础,世间万物都有各种各样的特性,还有属性,这些特别的特性组成了特别的物体,然而,一个物体和一个物体之间有相似之处,经过提炼,我们发现,很多共性不止是部分,而是大部分,比如我们举一个例子:

public class 角色

{

public string 名字;

public int HP;

public int MaxHP;

public int MP;

public int MaxMP;

}

public class 怪物 : 角色

public int 性格;

public int 智商;

public int 仇恨范围;

public class 聪明的怪物 : 怪物

public List<技能> 技能列表;

public class Boss级怪物 : 聪明的怪物

public List<物品> 物品列表;

很容易看出不同的角色之间有特别的特性,构成了一个全新的可以扩展的类别,比如在游戏中,图片类是地图块类的基类,那么一些只针对于地图块的操作就变得很容易执行,只需要写在地图块里即可,比如对于Silverlight而言,可以在地图块载入成功以后去调用一些需要的处理方法。

现在我们搞一个实例来一起看看面向对象在游戏中是怎么处理的具体逻辑。

为了方便,就不用Coding一个界面,咱们直接使用BLEND,创建四个StackPanel,然后里面塞上图片和一个ListBox,用来更加直观的验收结果。

<a target="_blank" href="http://blog.51cto.com/attachment/201111/160933293.jpg"></a>

然后,为了方便起见,咱们也写的简单一点,不创建过多内容了。

我们达到的效果,是有四个怪物,一个比一个强,第一个比较普通只是挨打,第二个会反击,第三个挨打会反击两次,第四个不单会反击两次还会有一定的几率闪避掉玩家攻击。

咱们一步一步来,请参见如下代码:

怪物类第一步

public abstract class Role

public Role()

public int Damage;

public int Defense;

public virtual void UnderAttack(Role attacker)

public class Monster1 : Role

public Monster1()

HP = 100;

MaxHP = 100;

Damage = 20;

Defense = 5;

public class Monster2 : Monster1

public Monster2()

HP = 200;

MaxHP = 200;

Damage = 40;

Defense = 10;

public class Monster3 : Monster2

public Monster3()

HP = 300;

MaxHP = 300;

Damage = 60;

Defense = 12;

public class Monster4 : Monster3

public Monster4()

HP = 400;

MaxHP = 400;

Damage = 80;

Defense = 15;

怪物1-4都是从角色类中继承,获得了统一的属性,管理起来也非常的容易,对于任何继承类而言,他们都会统一调用基类的Attack方法,而下一步就是如何实现我们的目标,在这之前,我们先要搞定一个主角出来,并且将一些功能增加进来,否则不太直观。

<a target="_blank" href="http://blog.51cto.com/attachment/201111/160945770.jpg"></a>

先用BLEND完成上面的界面,其实就是复制拖动,非常简单,需要为对象命名,入上图所示,我们的类需要重新修改一下,首先能显示出来内容,并且界面上,为了更加方便提示,我们增加一些小内容:

可以显示出来怪物类

public Role(ListBox propertList)

propertList.Items.Add(_TB_HP);

propertList.Items.Add(_TB_MaxHP);

propertList.Items.Add(_TB_Damage);

propertList.Items.Add(_TB_Defense);

TextBlock _TB_HP = new TextBlock();

TextBlock _TB_MaxHP = new TextBlock();

TextBlock _TB_Damage = new TextBlock();

TextBlock _TB_Defense = new TextBlock();

private int _HP;

public int HP

set { _TB_HP.Text = "剩余血量 = " + value; }

get { return _HP; }

private int _MaxHP;

public int MaxHP

set { _TB_MaxHP.Text = "最大血量 = " + value; }

get { return _MaxHP; }

private int _Damage;

public int Damage

set { _TB_Damage.Text = "伤害数值 = " + value; }

get { return _Damage; }

private int _Defense;

public int Defense

set { _TB_Defense.Text = "防御数值 = " + value; }

get { return _Defense; }

this.HP -= attacker.Damage - this.Defense;

if (this.HP &lt;= 0)

this.HP = 0;

public class Player : Role

public Player(ListBox propertList)

:base(propertList)

HP = 1000;

MaxHP = 1000;

public Monster1(ListBox propertList)

public Monster2(ListBox propertList)

public Monster3(ListBox propertList)

public Monster4(ListBox propertList)

代码有点长,但是并不复杂,相信你也很容易就能弄明白,然后分别在Blend和MainPage里增加一些小的内容:

<a target="_blank" href="http://blog.51cto.com/attachment/201111/160958597.jpg"></a>

<a target="_blank" href="http://blog.51cto.com/attachment/201111/161224374.jpg"></a>

上面写错一个地方,别见怪,哈哈,运行结果如下:

<a target="_blank" href="http://blog.51cto.com/attachment/201111/161236134.jpg"></a>

有点意思了吧,那么下一步我们就分开写一些逻辑,在c#中,调用基类虚函数使用override作为关键字,从下图中可以见到简单的操作: 

代码

public override void UnderAttack(Role attacker)

base.UnderAttack(attacker);

if (this.HP &gt; 0)

MainPage.MessageOutRect.Items.Insert(0, this.ToString() + " 反击");

attacker.UnderAttack(this);//会反击了啊

attacker.UnderAttack(this);//我打你第二次

//增加时间因素,让随机更加不确定

Random random = new Random((int)DateTime.Now.Ticks);

if (random.Next() % 2 == 0)//等同于一半的几率,为了更加直观

else

MainPage.MessageOutRect.Items.Insert(0, this.ToString()+" 闪避了你的攻击");

<a target="_blank" href="http://blog.51cto.com/attachment/201111/161312198.jpg"></a>

本文转自nowpaper 51CTO博客,原文链接:http://blog.51cto.com/nowpaper/712581