我竟然用它搞懂了王者荣耀的技能释放机制!【C#委托】
目录
什么是委托?
如何定义和使用委托?
1、声明委托类型
2、实例化委托对象
3、调用委托方法
Hello!大家好!我是努力赚钱买生发水的灰小猿。
“欢迎来到王者荣耀之C#专场”
最近在用C#的委托做开发时,发现委托这个东西实在在深奥,不了解的小伙伴觉得它没有卵用,然而了解的小伙伴却觉得它大有用途,所以今天大灰狼就借助王者荣耀的英雄技能释放机制和大家聊一聊C#中委托的神秘含义...
“干货还有三秒到达战场!”
什么是委托?
委托是C#中的一种构造,比如在C++中有函数指针的概念,允许在运行时选择要调用的函数。虽然C#没有指针,但是C#中委托的作用却和指针类似,在C#中通过使用Delegate类(即委托类),委托实例可以封装属于可调用实例的方法。然后通过委托可以间接的调用一个方法,在委托中包含对方法的引用,使用委托可以在程序运行时动态的设定要调用的方法,所以执行或调用一个委托时,将执行该委托所引用的方法。
在这里要注意一点:“委托类型不是真正的类,它和类存在明显的差异,类可以包含数据,而委托类型包含的只是指向方法的返回类型和参数列表。并且委托类Delegate是密封的,不能从Delegate类中派生委托类型,也不可能从中派生自定义类。”
委托具有以下的特点:
- 委托类似于C/C++函数指针,但它的安全的
- 委托允许将方法作为参数进行传递
- 委托可用于定义回调方法
- 委托可以将多个方法关联在一起,即可以对一个事件调用多个方法
- 委托所指向的方法不需要与委托签名精确匹配
如何定义和使用委托?
定义和使用委托有三个步骤,
声明委托类型→实例化委托对象→调用委托方法
1、声明委托类型
声明委托类型的目的是告诉编译器这种类型代表了哪种类型的方法。
声明委托的语法是:
[修饰符]delegate 返回类型 委托类型名 (参数列表);
修饰符为:public、private、protected等
返回类型为:string、double、int等
在声明一个委托类型时,每个委托类型都描述参数的个数和类型,以及它可以引用的方法的返回类型,每当需要一组新的参数类型或返回类型时都必须声明一个新的委托类型。
比如在王者峡谷中每一个英雄都有至少三个技能,那么在我们点击一技能的时候,到底是释放哪个英雄的技能呢?这里就很好的用到了委托,
如下面代码声明了一个委托类型Skill_one_Delegate,用这个委托来表示所有英雄的一技能释放,该委托类型可以引用无参数并返回void的方法。
//定义一个释放一技能的委托类型
public delegate void Skill_one_Delegate();
重点来了!
在这里要注意的一点:在一般情况下,委托类型必须与后面引用的方法具有相同的签名,即委托类型的参数个数、数据类型和顺序以及返回值必须与后面引用的方法一致,否则可能会出现错误!
2、实例化委托对象
在我们声明了委托类型之后,必须创建一个它的实例,即创建委托对象并使之与特定的方法相关联。
也可以说我们是为上面定义的一技能的委托进行实例化并创建特定的方法,在这里我们就可以将每个英雄的一技能作为一个该委托的特定方法。
定义委托对象的语法格式如下:
委托类型名 委托对象名 = new 委托类型名(与之相关联的方法);
如下面我们实例化Skill_one_Delegate委托类型的一个委托对象sOne:
public Skill_one_Delegate sOne; //定义委托对象
另外,委托对象还需要实例化调用的方法,我们为了直观方便起见,通常将这些方法放了一个类中(也可以将这些方法放在程序的Program类中)
现在我们就可以将每个英雄的一技能作为一个方法,将它们全都存放在代表所有英雄一技能的类Skill_one中,如下,我们暂且定义后裔、亚瑟、猴子的一技能在Skill_one类中:
//定义一技能释放类
class Skill_one
{//后裔一技能public static void DuoChongJianShi(){Console.WriteLine("多重箭矢");}//亚瑟一技能public static void ShiYueZhiDun(){Console.WriteLine("誓约之盾");}//猴子一技能public static void HuShenZhouFa(){Console.WriteLine("护身咒法");}}
当然在真正的游戏中技能的释放不可能是这样输出的,真正的技能释放一定是有一个指向目标的参数的。
3、调用委托方法
在创建委托对象之后,我们通常将委托对象传递给将调用该委托的其他代码,通过委托对象的名称调用委托对象。其使用语法格式如下:
委托对象名(实参列表);
什么意思呢?大灰狼在这里解释一下,因为每一个委托类型都有与其对应的特定的委托方法嘛,所以我们实例化委托类型之后,当然要实现该委托对应的方法,所以我们可以将要调用的方法传递给委托对象,然后直接用委托对象名加括号就可以启用该方法了,emmm...有些绕了。
还拿英雄技能释放来讲,
在刚才我们定义了后裔、亚瑟、猴子三个英雄的一技能作为Skill_one这个委托的特定方法,然而这个委托Skill_one指的就是所有英雄的一技能,现在我们将这个委托类型用sOne这个委托对象来进行实例化,那么应该如何释放技能呢?
我们知道王者荣耀中每一个英雄都有技能一、技能二、技能三、血量、伤害等属性,在这里我们就可以将这些属性定义成委托类型,在释放某个英雄的某个技能时,我们只需要调用该英雄的这一个委托中对应的这个英雄的技能即可,
所以我们现在就定义一个英雄类Hera,在这个类中我们暂且只定义一个一技能的委托,而这个Hera类当然是所有英雄都有的了。
我们现在以释放的后裔的一技能“多重箭矢”为例,那么我们首先应该使用后裔来实例化英雄Hera这个类,
//定义后裔接收英雄类
Hera houyi = new Hera();
然后我们是要释放一技能,那么就调用英雄类中释放一技能的委托,同时在王者荣耀中每个英雄都具有一技能,也就是说在Skill_one这个类中存放了很多个英雄的一技能的方法,那么我们到底调用哪个方法?当然是后裔的DuoChongJianShi()方法了,
所以我们就将Skill_one类中后裔的DuoChongJianShi()方法传递给调用了一技能委托的后裔:
//使用委托方法接收一技能类中该英雄对应的技能houyi.sOne = Skill_one.DuoChongJianShi;
现在我们完成了后裔一技能的实例化操作,最后就是该技能的释放了,按照委托调用的方法,因为我们已将后裔的一技能传递给后裔的一技能委托,所以我们可以直接调用该委托对象即可:
houyi.sOne(); //释放后裔一技能
结果如下:
最后将完整代码附上,实现分别“释放”后裔、亚瑟、猴子的一技能。
定义一技能释放类:
//定义一技能释放类class Skill_one{//后裔一技能public static void DuoChongJianShi(){Console.WriteLine("多重箭矢");}//亚瑟一技能public static void ShiYueZhiDun(){Console.WriteLine("誓约之盾");}//猴子一技能public static void HuShenZhouFa(){Console.WriteLine("护身咒法");}}
定义释放一技能的委托和英雄类:
//定义一个释放技能的委托public delegate void Skill_one_Delegate();//定义英雄类class Hera{//在英雄类中实例化委托public Skill_one_Delegate sOne;}
主类实现英雄一技能的释放:
class Program{static void Main(string[] args){//定义后裔接收英雄类Hera houyi = new Hera();//使用委托方法接收一技能类中该英雄对应的技能houyi.sOne = Skill_one.DuoChongJianShi;//定义亚瑟接收英雄类Hera yase = new Hera();//使用委托方法接收一技能类中该英雄对应的技能yase.sOne = Skill_one.ShiYueZhiDun;//定义猴子接收英雄类Hera houzi = new Hera();//使用委托方法接收一技能类中该英雄对应的技能houzi.sOne = Skill_one.HuShenZhouFa; houyi.sOne(); //释放后裔一技能yase.sOne(); //释放亚瑟一技能houzi.sOne(); //释放猴子一技能}}
“释放”结果如下:
好啦,保护我方输出!Victory!!!
觉得不错记得点赞关注大灰狼哟!
同时有喜欢Python的小伙伴也可以关注我的微信公众号“灰狼洞主”后台回复“Python笔记”获取Python入门到精通笔记分享和Python常用函数方法速查手册哟!
大灰狼期待与你一同进步!
我竟然用它搞懂了王者荣耀的技能释放机制!【C#委托】相关推荐
- 王者荣耀暃技能是什么
王者荣耀暃技能是什么,游戏也是即将上线新英雄暃,那么这位玉城的大王子又有什么技能呢,相信还有些小伙伴不清楚.所以下面就为大家带来了暃的技能效果介绍! 王者荣耀暃技能是什么 王者荣耀暃技能是什么 暃技能 ...
- LeetCode|从王者荣耀的技能施放理解调度算法
今天是 Kevin 的算法之路的第 74 天.和大家分享<王者荣耀>技能施放的最佳方案,看完之后你将可以完成 LeetCode 的第 621 题<任务调度器> 引 想必被标题 ...
- 60行Python代码搞定,王者荣耀雷达图!
点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货第一时间推给你!!! 现有以下表格,我需要画成第二张图中的雷达图(类似fifa足球.王者荣耀里面 ...
- 王者荣耀游戏时间计算机制,王者荣耀兵线的移动速度和各项属性是否会随着游戏时间加长而增长...
王者荣耀兵线的移动速度和各项属性是否会随着游戏时间加长而增长,这是在夫子的进阶试炼中有这样一道题目,曾难倒了不少玩家.下面给大家带来的就是王者荣耀兵线机制详细解析,一起来看看游戏中兵线的具体机制吧! ...
- 王者服务器维护段位掉了,王者荣耀更新掉段机制是什么 S22赛季段位继承规则介绍...
王者荣耀这款游戏马上就要开启s22赛季了,段位继承一直都是玩家们的关心的东西,不少玩家们都想知道自己新赛季的起点在哪里,感兴趣的话可以来看看40407小编的攻略哦! S22赛季段位继承规则介绍 王者荣 ...
- 王者荣耀游戏时间计算机制,王者荣耀:荣耀战力计算机制解析,如何提高到金牌乃至国服...
原标题:王者荣耀:荣耀战力计算机制解析,如何提高到金牌乃至国服 每个英雄都对应有一个荣耀战力,战力分越高一定程度上代表着你对该英雄的理解越好,当分数高到一定程度上时,会获得荣耀称号,由低到高分为县级. ...
- 一篇文章搞懂架构师的核心技能
" 这是架构师系列的第一篇:核心技能,希望这个系列能完全揭示架构师这个职位:我先从核心技能开始,后续还有架构师之路,架构实战等架构师系列文章. 本文作者 陈睿 优知学院创始人,前携程定制旅游 ...
- 一文搞懂 Flink 网络流控与反压机制
看完本文,你能get到以下知识 Flink 流处理为什么需要网络流控? Flink V1.5 版之前网络流控介绍 Flink V1.5 版之前的反压策略存在的问题 Credit的反压策略实现原理,Cr ...
- android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...
最新文章
- Linux系统资源管理 之 硬件信息
- 一封建议信,不知道这样写可以吗?
- leetcode 319. Bulb Switcher | 319. 灯泡开关
- php-fpm 的参数,php-fpm启动参数配置详解
- Spark源码分析之Master资源调度算法原理
- python提取文本中的数字_EXCEL中提取汉字、字母、数字如此简单
- C++语言运算符重载
- Spring Rdbms操作(二)——SqlFunction 获取表数据条数
- NSString 转为gbk
- 初识delphi-spring-framework
- webrtc 共享屏幕延时测试
- Hibernate HHH000179警告和narrow proxy
- 白话大数据 | 元宇宙来了,但是你了解元数据吗?
- 正则表达式的基本原理
- 搜索推荐广告三者异同
- 承包一座山能做什么_您为什么没有得到最好的承包商,又能做些什么(第2部分)...
- python:24点游戏
- “由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断“的解决方案
- G711(G711a+g711u)编码原理及代码
- stc 串口收发 c语言,STC12C5A60S2 串口中断接收程序