天天看點

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