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,用來更加直觀的驗收結果。
?
然后,為了方便起見,咱們也寫的簡單一點,不創建過多內容了。
我們達到的效果,是有四個怪物,一個比一個強,第一個比較普通只是挨打,第二個會反擊,第三個挨打會反擊兩次,第四個不單會反擊兩次還會有一定的幾率閃避掉玩家***。
咱們一步一步來,請參見如下代碼:
怪物類第一步public abstract class Role
{
public Role()
{
}
public int HP;
public int MaxHP;
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方法,而下一步就是如何實現我們的目標,在這之前,我們先要搞定一個主角出來,并且將一些功能增加進來,否則不太直觀。
?
先用BLEND完成上面的界面,其實就是復制拖動,非常簡單,需要為對象命名,入上圖所示,我們的類需要重新修改一下,首先能顯示出來內容,并且界面上,為了更加方便提示,我們增加一些小內容:
可以顯示出來怪物類public abstract class Role
{
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; }
}
public virtual void UnderAttack(Role attacker)
{
this.HP -= attacker.Damage - this.Defense;
if (this.HP <= 0)
this.HP = 0;
}
}
public class Player : Role
{
public Player(ListBox propertList)
:base(propertList)
{
HP = 1000;
MaxHP = 1000;
Damage = 80;
Defense = 10;
}
}
public class Monster1 : Role
{
public Monster1(ListBox propertList)
:base(propertList)
{
HP = 100;
MaxHP = 100;
Damage = 20;
Defense = 5;
}
}
public class Monster2 : Monster1
{
public Monster2(ListBox propertList)
:base(propertList)
{
HP = 200;
MaxHP = 200;
Damage = 40;
Defense = 10;
}
}
public class Monster3 : Monster2
{
public Monster3(ListBox propertList)
:base(propertList)
{
HP = 300;
MaxHP = 300;
Damage = 60;
Defense = 12;
}
}
public class Monster4 : Monster3
{
public Monster4(ListBox propertList)
:base(propertList)
{
HP = 400;
MaxHP = 400;
Damage = 80;
Defense = 15;
}
}
代碼有點長,但是并不復雜,相信你也很容易就能弄明白,然后分別在Blend和MainPage里增加一些小的內容:
?
?
上面寫錯一個地方,別見怪,哈哈,運行結果如下:
?
有點意思了吧,那么下一步我們就分開寫一些邏輯,在c#中,調用基類虛函數使用override作為關鍵字,從下圖中可以見到簡單的操作:?
?
代碼public class Player : Role
{
public Player(ListBox propertList)
:base(propertList)
{
HP = 1000;
MaxHP = 1000;
Damage = 80;
Defense = 10;
}
}
public class Monster1 : Role
{
public Monster1(ListBox propertList)
:base(propertList)
{
HP = 100;
MaxHP = 100;
Damage = 20;
Defense = 5;
}
}
public class Monster2 : Monster1
{
public Monster2(ListBox propertList)
:base(propertList)
{
HP = 200;
MaxHP = 200;
Damage = 40;
Defense = 10;
}
public override void UnderAttack(Role attacker)
{
base.UnderAttack(attacker);
if (this.HP > 0)
MainPage.MessageOutRect.Items.Insert(0, this.ToString() + " 反擊");
attacker.UnderAttack(this);//會反擊了啊
}
}
public class Monster3 : Monster2
{
public Monster3(ListBox propertList)
:base(propertList)
{
HP = 300;
MaxHP = 300;
Damage = 60;
Defense = 12;
}
public override void UnderAttack(Role attacker)
{
base.UnderAttack(attacker);
attacker.UnderAttack(this);//我打你第二次
}
}
public class Monster4 : Monster3
{
public Monster4(ListBox propertList)
:base(propertList)
{
HP = 400;
MaxHP = 400;
Damage = 80;
Defense = 15;
}
//增加時間因素,讓隨機更加不確定
Random random = new Random((int)DateTime.Now.Ticks);
public override void UnderAttack(Role attacker)
{
if (random.Next() % 2 == 0)//等同于一半的幾率,為了更加直觀
{
base.UnderAttack(attacker);
}
else
{
MainPage.MessageOutRect.Items.Insert(0, this.ToString()+" 閃避了你的***");
}
}
}
這次的代碼的更長,所以,我們還是看看最終的效果,然后下載代碼進行運行吧:)代碼在這里下載!
?
?
轉載于:https://blog.51cto.com/nowpaper/712581
總結
以上是生活随笔為你收集整理的Silverlight C# 游戏开发:面向对象在游戏中的实例(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 珍爱app如何屏蔽一个人
- 下一篇: 明日之后背靠背怎么解锁