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() + " 闪避了你的攻击 " );
}
}
}

这次的代码的更长,所以,我们还是看看最终的效果,然后下载代码进行运行吧:)代码在这里下载!

 


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


相关文章
|
3月前
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
84 0
|
5月前
|
存储 缓存 C#
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
|
7月前
|
程序员 C# Python
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码(2)
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码(2)
|
7月前
|
存储 程序员 C#
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码
|
7月前
|
存储 C# 开发工具
22.C# 中使用变量记录玩家创建的角色名:实现与游戏角色的互动
22.C# 中使用变量记录玩家创建的角色名:实现与游戏角色的互动
65 0
|
7月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
156 2
|
7月前
|
存储 开发框架 安全
C# .NET面试系列二:面向对象
<h2>面向对象 #### 1. 什么是构造函数? 构造函数(Constructor)是一种特殊类型的方法,它在创建类的实例(对象)时被调用,用于初始化对象的状态。构造函数的名称必须与包含它的类的名称相同,并且没有返回类型。 主要特点和用途包括: 初始化对象: ```c# 构造函数主要用于初始化类的实例。当使用 new 关键字创建类的对象时,构造函数会被调用,确保对象在使用之前处于一个合适的状态。 ``` 与类同名: ``` 构造函数的名称必须与包含它的类的名称完全相同。 ``` 没有返回类型: ```c# 构造函数没有返回类型,甚至不能声明 void。它的目的是初始化对象
92 0
|
7月前
|
存储 开发框架 .NET
【C#】认识C# (为了游戏开发 O(≧口≦)O)
【1月更文挑战第26天】【C#】认识C# (为了游戏开发 O(≧口≦)O)
|
25天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
31 3