本系列所有代码都是使用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# 游戏开发:面向对象在游戏中的实例(一)相关推荐

  1. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  2. 游戏开发小结——在unity3d中开发类塞尔达游戏的反冲效果

    游戏开发小结--在unity3d中开发类塞尔达游戏的反冲效果 在 2D ARPG 中为角色创建反冲效果 我们将在Unity中实现这个效果.首先,我们将进行演示场景的设置.我们将创建一个控制器(cont ...

  3. 游戏开发小结——在Unity中构建主菜单。

    游戏开发小结--在Unity中构建主菜单. 本文将重点介绍主菜单外观的基本创建. 本文中的按钮(button)实际上是不起作用的,按钮(button)将在接下来的文章中介绍. 在创建菜单时,一致性非常 ...

  4. flex 联机游戏开发 - 四国军棋游戏:(三) 核心类

    通过前面的练习 flex 联机游戏开发 - 四国军棋游戏:(二)棋盘棋子 我们已经成功地用不到200行的代码绘制出了一个漂亮的棋盘,现在,我们开始进入游戏的核心类设计阶段.四国军棋的游戏逻辑还是比较复 ...

  5. flex 联机游戏开发 - 四国军棋游戏:(三) 核心类设计

    通过前面的练习 flex 联机游戏开发 - 四国军棋游戏:(二)棋盘棋子 我们已经成功地用不到200行的代码绘制出了一个漂亮的棋盘,现在,我们开始进入游戏的核心类设计阶段.四国军棋的游戏逻辑还是比较复 ...

  6. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)

    ---------------------------------------------------------------------------------------------------- ...

  7. 基于cocos2d-x的快速的游戏开发--回合制游戏

    2019独角兽企业重金招聘Python工程师标准>>> #基于cocos2d-x的快速的游戏开发--回合制游戏 开发时间:3天 开发工具:cocos2d-x和cocostudio 开 ...

  8. 微信小游戏开发教程-2D游戏原理讲解

    微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...

  9. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  10. H5游戏开发包括哪些游戏类型

    H5在微信还没有诞生的时候,就已经在各大手机应用方面展露头角.最早的H5小游戏,例如4399公司开发的,开始了新一轮的热潮.随着微信的推出,很多H5游戏开始嵌入到微信公众号.微信群.朋友圈. H5因其 ...

最新文章

  1. 使用二维高斯函数模糊图片
  2. win7访问windows server 2003服务器出现未知的用户名或者错误的密码(转载)
  3. 配置nginx,支持php的pathinfo路径模式
  4. java调用其他程序吗_java本地方法如何调用其他程序函数,方法详解
  5. linux学习入门标准教程(2)
  6. JFinal EhCachePlugin的学习笔记
  7. 欧几里得算法、扩展欧几里得算法、求逆元、中国剩余定理、扩展中国剩余定理
  8. python调用perl_从Python调用Perl脚本不断返回值
  9. 1024 科学计数法 (20 分) C语言
  10. vivado 下载程序出错:ERROR: [Labtools 27-3165] End of startup status: LOW
  11. Linux菜鸟教程(一 :JDK安装和java环境的配置)
  12. erp5,一套基于python和gpl协议,功能和界面完全模仿sap r3的大型开源制造业erp系统
  13. B站三季度财报解读丨从0到2.67亿月活,B站生态亮眼的密钥何在?
  14. octobercms mysql_如何在Ubuntu 16.04 LTS上安装OctoberCMS
  15. 关于monitor模式
  16. 【MM采购定价】怎么样实现创建采购订单的时候,采购价格不可以更改?
  17. 喜欢游戏学计算机,我喜欢电脑游戏小学作文
  18. Google 释出开源软件漏洞扫描工具 OSV-Scanner​
  19. python将str写入csv_【python3】中str转成bytes类型后用csv.writerow()写入csv文件仍然出错...
  20. 数据库复习笔记-第1章绪论

热门文章

  1. error while loading shared libraries: libatomic.so.1
  2. 排序算法之——插入排序
  3. 大道至简阅读笔记01
  4. 偶尔用得上的MySQL操作
  5. maven打包pom.xml备忘
  6. yii2_getDb()自动切换数据库
  7. 计算机学院许斌副院长,马鞍山职业技术学院院长姚国成、马鞍山市卫校校长许斌一行来访我院...
  8. ubantu实现linux命令的实验_C语言实现linux命令---ls
  9. php 生成wsdl工具,php中使用zendstudio 12为soapserver生成wsdl文件
  10. Vue.config.productionTip = false