‫好吧, 我会的
‫所以我们这个视频的目标是实现我们的脑桥死亡｡
‫所以如果我被我们的塔击中几次, 你会看到我消失了, 因为我的坦克死了｡
‫如果我有足够的技巧, 如果我能摧毁其中一个, 你会看到它也消失了｡
‫所以我们要在这段视频中为这些卒实现死亡｡
‫你好, 欢迎回来｡
‫现在, 我们已经应用伤害的兵时, 他们被击中的弹丸｡
‫我们现在需要弄清楚我们如何处理死后的事情｡
‫这意味着我们需要某种函数来处理特定参与者的销毁｡
‫所以我们要创建一个句柄销毁函数｡
‫我们还需要一个演员死亡函数,
‫它可以让游戏模式处理当我们的世界中的演员死亡时会发生什么, 当一个特定的棋子的健康值达到零时, 我们将调用这个演员死亡函数｡
‫让我们来谈谈如何实施该系统的路线图｡
‫我们知道我们有一个投射物, 它调用了应用损害, 这导致了损害接受函数,
‫对健康组件中的委托广播做出响应｡
‫所以我们得想想接下来该怎么做｡
‫好吧, 我们的游戏模式可以有一个功能来处理当一个演员死亡｡
‫所以在受到的伤害中, 我们可以检查生命值是否为零｡
‫在这一点上, 我们可以调用游戏模式中的演员死亡函数, 从那里我们的兵可以处理它的破坏｡
‫所以最终将由游戏模式来调用死亡演员的句柄销毁函数｡
‫我们已经有了一个游戏计划, 现在让我们概述一下实施该计划的步骤｡
‫首先, 我们要创建一个句柄销毁函数我们要把它放在基本的兵类中来处理当我们的兵死亡时应该发生的功能.
‫我们也会在坦克和塔类中实现这个, 因为它们在死亡时都有自己独特的功能, 然后我们会创建一个actor
‫died函数, 并将其放在游戏模式类中, 这样我们就可以从那里调用handle
‫destruction了.
‫之后我们将在游戏模式下的actor dead函数中调用handle destruction, 然后当健康值为零时,
‫我们可以从健康值组件中调用actor dead｡
‫因此, 让我们从创建句柄销毁函数的第一步开始｡
‫现在我在Base Pond H中, 我想添加这个句柄销毁函数｡
‫现在我打算在游戏模式下调用它, 这意味着它需要是一个公共函数,
‫这样我就可以把这个函数放在这里的public部分.
‫它是空的, 我称之为手柄破坏｡
‫现在, 它不需要接受任何输入参数｡
‫它只负责销毁这枚棋子.
‫让我们在基本兵CP文件中实现这个函数, 我将把它放在构造函数下面.
‫我有一个销毁句柄, 我会把一个基本的兵类名放在函数名之前.
‫这就是当任何一个基于基本卒的卒死亡时会发生的事情.
‫所以我会在这里放置一个to do, 表示我们在句柄销毁函数中要做的事情｡
‫我想在这里处理所有的视觉和声音效果, 这些效果都与卒的死亡有关｡
‫所以我只讲视觉和声音效果, 我们就讲到这里,
‫当我们讲到这节课的特效和声音部分时, 一定要记住要实现这个｡
‫现在我们有了句柄销毁, 但我想在坦克和塔类中也放一个句柄销毁函数来处理当这些兵死亡时会发生什么｡
‫而最简单的破坏方式也许是对我们的塔｡
‫现在让我们进入H塔, 我们将在这里添加一个公共函数, 称为句柄销毁｡
‫我将使用void句柄destruction来实现它, 并在tick函数下构建CP.
‫这里是tick, 这里是handle destruction, 我将在函数名前加上一个塔, 就像这样｡
‫现在在塔的句柄销毁函数中, 我想调用超级版本, 这样就可以调用基础兵的句柄销毁函数,
‫当塔死亡时, 我们就可以得到那些视觉和声音效果｡
‫所以我会说超级句柄销毁, 以确保它被调用｡
‫在那之后, 我会摧毁这座塔｡
‫现在我们已经看到了它是如何工作的｡
‫我们只调用destroy函数, 它将处理塔的销毁｡
‫所以我可以保存这个并关闭塔和CP文件, 现在我可以在坦克类中放置一个句柄销毁函数｡
‫我将进入tank并在tick函数下声明一个公共函数, 名为handle destruction.
‫我将在Tank CP中, 在tic下面实现这个函数,
‫别忘了在函数名前加上tank.
‫现在, 就像在塔类中一样, 我们想把毁灭称为超级处理｡
‫这样我们就能获得视觉和声音效果｡
‫对于坦克, 我们要做一些不同的事情｡
‫我想把坦克藏起来而不是毁掉它｡
‫然后我们可以禁用它的TIC功能, 这样它就仍然存在于世界上, 我们仍然拥有它｡
‫所以我们仍然可以从摄像机上看到那个画面｡
‫只不过我们无法看到它或移动它｡
‫所以要隐藏坦克我们可以调用一个函数set actor hidden in game, 这将取一个布尔值｡
‫如果我们传递true, 那么我们将有效地隐藏坦克｡
‫现在我还想禁用滴答声, 这也有一个功能｡
‫这叫做设置演员控制点使能｡
‫为此我将传入false, 这将禁用tank的ticking｡
‫这就完成了句柄销毁函数｡
‫所以我们有了句柄销毁函数｡
‫我们的下一步是在游戏模式中创建一个演员死亡函数｡
‫让我们来实现它｡
‫我现在在tune tank游戏模式下, 我可以创建actor died函数,
‫现在我打算从health组件类调用actor died, 这意味着它也需要是一个公共函数.
‫因此, 我将添加一个public部分, 并创建actor died函数｡
‫现在这个是无效的, 我称之为演员死亡｡
‫这可以简单地采取一个演员指针称为死演员, 现在我们可以实现演员死在调坦克游戏模式.
‫所以我把它放在这里, 在名字前面加上一个tune tank游戏模式, 现在我们有了一个演员死亡函数｡
‫现在我想检查一下死去的演员是不是坦克, 也就是说我需要一个变量来代表坦克.
‫所以回到调坦克游戏模式｡
‫我将创建一个私有区域, 并添加一个tank变量, 然后对其进行正向声明.
‫这是一个A类型的tank指针, 我只需要调用这个tank, 我需要用tank的地址初始化它,
‫然后我就可以开始玩了.
‫现在我们已经看到开始play是一个受保护的函数, 我们将在游戏模式中保护它, 这样我们就可以覆盖, begin,
‫play.
‫我会说virtual void, 开始, play, override, 我可以在tune tank, 游戏模式下实现它｡
‫是的｡
‫所以这将是无效的开始播放, 我将使用调坦克, 游戏模式类名｡
‫我要做的第一件事就是调用super开始play｡
‫这样我们就可以得到父功能, 我可以得到玩家典当使用游戏静态｡
‫所以我首先要把游戏性统计学包括进来, 这是我们已经看到的kismet和游戏性统计学｡
‫在这里, 我可以把坦克和分配它的价值, 青年游戏静态｡
‫吉他手手掌｡
‫这需要一个世界上下文对象, 我们可以用它来表示,
‫我用零作为玩家索引因为坦克永远都是零.
‫现在我们知道了jet player-—返回一个A-—指针, tank是type A tank, 一个子类｡
‫我们已经看到了如果我们想把结果存储在一个tank指针中, 我们需要把它转换成一个tank类｡
‫首先, 我将包括水箱顶盖｡
‫所以我会把坦克H也包括进去然后我会把它投射到坦克上.
‫所以我会说cast to a tank我会把get player返回的值转换成.
‫所以我把它放在括号里｡
‫现在我们有一个指向玩家的指针——以A坦克指针的形式｡
‫现在我们有了坦克, 我们可以检查一下我们死去的演员是不是坦克｡
‫所以我们可以说, 如果死演员加倍等于坦克, 现在坦克可能是空的｡
‫这没关系, 因为如果Tank是null, dead actor指向tank本身,
‫那么if检查就会失败, 我们不会去访问一个null指针, 因为我们不会进入它的内部.
‫现在, 如果死去的演员实际上是坦克, 那么我想调用坦克句柄销毁函数｡
‫所以我们要叫坦克把手销毁｡
‫现在, 在调用句柄销毁函数之后,
‫我还想禁用坦克pod的输入, 这样我就可以得到坦克并调用坦克继承的内置函数, 称为禁用输入｡
‫现在禁用输入需要一个A播放器控制器｡
‫现在我们知道坦克类, 如果我们来到坦克H,
‫有一个玩家控制器ref变量, 它是一个指向玩家控制器的指针, 这就是为什么我开始认为ref这个变量的名字很糟糕.
‫因为它不是指涉, 所以是指标｡
‫我更愿意称它为坦克玩家控制器｡
‫所以, 我们为什么不把它重新命名呢？
‫这是开发人员经常做的事情, 当他们意识到他们给了一个变量, 一个坏名字｡
‫所以这段代码有一种方法可以很容易地做到这一点｡
‫我可以突出显示这个变量, 然后按F2键, 它会要求我重命名它｡
‫我把这个叫做坦克玩家控制器｡
‫现在看看这个
‫这里叫做坦克玩家控制器｡
‫如果我去坦克CP, 我会看到它在这里重命名｡
‫所以我不需要进去找它, 找到每个球员, 控制器, 裁判的实例｡
‫我可以搜索坦克玩家控制器, 看到它的变化无处不在, 它在这里使用｡
‫所以这是一个很好的重构技巧｡
‫所以无论如何, 回到这里在调坦克游戏模式, 我需要禁用输入的坦克, 这需要一个球员控制器｡
‫所以我首先要检查, 以确保坦克球员控制器是有效的, 如果坦克和我需要访问该球员控制器｡
‫但回想一下, 在tank中, 我们的玩家控制器变量是私有的｡
‫现在我们可以公开这个变量并将其公开, 或者我们可以为这个变量创建一个公共getter函数｡
‫我宁愿创建一个公共getter, 因为这是更好的编程实践｡
‫在公共部分, 我将为坦克玩家控制器创建一个公共getter.
‫现在它会返回一个A玩家控制器指针这个函数叫做get tank player.
‫控制器getter通常是变量的名字, get在前面,
‫它们通常也是cost函数, 因为这个函数不是用来改变这个类的任何东西的, 它只返回播放器控制器.
‫所以我们要返回坦克玩家控制器, 这就是它要做的｡
‫现在我们有了一个坦克玩家控制器的公共getter函数, 我们可以在游戏模式中访问玩家控制器｡
‫所以我们要说如果坦克有一个坦克玩家控制器, 并在这里进行函数调用｡
‫如果我们到达if语句的内部,
‫那么玩家控制器是有效的, 所以我们可以把这个调用移到这里的tank禁用输入, 我们将把tank玩家控制器传递到禁用输入｡
‫所以我们在这里也调用tank get player controller｡
‫现在, 当我们访问播放器控制器时, 我还想将播放器控制器设为show mouse
‫cursor布尔成员变量, 并将其设置为false｡
‫因此, 我们禁用输入, 同时确保不显示鼠标光标｡
‫这样就可以处理坦克死亡时的功能｡
‫现在, 如果死去的演员不是坦克, 我会检查它是否是塔类的一个实例｡
‫所以我要在这里添加一个else if｡
‫那么这个elseif的条件是什么呢？
‫我想看看死了的演员能不能被选到A塔, 也就是说我需要把塔类也包括进去.
‫所以包括塔｡
‫然后我将尝试投出｡
‫所以我会说cast, 它使用尖括号和圆括号｡
‫我们铸造的也是一座塔, 我们铸造的是死的｡
‫演员将尝试扮演死去的演员｡
‫现在我们实际上可以取这个类型转换的结果并赋值给它, 然后创建一个局部变量｡
‫在条件式中我们可以说一个塔指针我们可以调用这个被摧毁的塔并给它赋值从这个强制转换返回的值.
‫如果我们这么做了, 我们就能接触到这个被摧毁的演员, 也就是我们被扔到塔上的死去的演员｡
‫现在, 如果成功了, 我们就能进入到其他空间里｡
‫然后我们就可以把我们消灭了｡
‫塔和我们可以简单地称之为毁灭柄｡
‫所以现在我们在游戏模式中有一个演员死亡函数, 它调用了处理破坏,
‫也处理了一些坦克的死亡相关功能｡
‫这就是第二步｡
‫创建一个actor ded函数, 在创建的时候我们还调用了actor ded函数中的句柄销毁｡
‫所以我们的最后一步是在健康值为零时调用演员死亡｡
‫为了调用这个存在于游戏模式中的函数, 我们的健康组件需要一个变量来存储游戏模式的地址｡
‫让我们进入健康组件类｡
‫这是健康组件, 我将在底部添加一个私有变量｡
‫这将是A型调坦克游戏模式指针, 我们将称之为调坦克游戏模式.
‫现在我将向前声明它, 这样就不必在这里包含它的头文件, 然后我们需要访问游戏模式｡
‫现在我们转到健康组件CP, 如果我向上滚动, 我会在这里看到开始播放功能,
‫这是了解游戏模式的最佳位置｡
‫同样, 将它放在构造函数中也太早了｡
‫我们需要确保在尝试访问游戏模式之前, 该模式已经构建并存在｡
‫现在这里有一个关于游戏静态的函数, 叫做Get Game Mode, 它返回当前的游戏模式,
‫如果不能在客户端上检索到它, 它会返回null｡
‫现在在客户端与多人游戏编程, 我们不必担心｡
‫我们在唯一的一台机器上运行游戏, 所以让我们向下滚动, 我们将看到一个游戏模式库接受一个世界上下文对象｡
‫这只是世界中的一个对象, 我们已经看到了如何处理世界上下文对象｡
‫所以这存在于游戏静态中, 让我们把它包括在内｡
‫在健康组件中, CP将粘贴我们的包含游戏静态信息, 然后我们将在此处调用get game
‫mode并开始游戏｡
‫所以我们要说调整坦克, 游戏模式｡
‫并将其设置为您的值｡
‫游戏静态获取游戏模式和世界上下文对象｡
‫我将把它传递进去, 现在我们进入了博弈模式.
‫当然, 要得到游戏模式, 返回一个游戏模式基类, 我们试图把它保存在子类中,
‫一个tune tank游戏模式, 这意味着我们需要投出.
‫没错, 我是说...
‫所以我们需要说cast to a tune tanks游戏模式, 我们从get游戏模式中铸造结果｡
‫所以我把它放在括号里｡
‫而且我们使用的是调音坦克游戏模式｡
‫因此, 我将在顶部包含该头文件｡
‫所以我要说包括｡
‫调整坦克游戏模式｡
‫所以我们在健康组件中有游戏模式｡
‫我们已经准备好进入伤害状态, 看看我们的生命值是否为零｡
‫在这种情况下, 我们可以使用tune tank游戏模式指针来调用函数actor died,
‫传入死去的演员, 这将是你的挑战, 所以在health组件类中, 在damage
‫taken中, 你将检查health的值是达到了零还是低于零｡
‫如果真是那样的话, 那么就叫男主角使用游戏模式死掉吧｡
‫因为我们有一个指向游戏模式的指针, 所以不要忘记先检查一下这个指针是否不为空｡
‫一旦你叫演员死了, 你就需要换一个演员｡
‫你要把死去的演员传过去｡
‫因此, 暂停视频, 并在损坏功能中实现这一点｡
‫好吧, 我会的
‫所以我们已经从健康中减去了伤害｡
‫现在我们准备检查健康值是否已达到零｡
‫所以我会说如果健康指数小于或等于零, 如果是这样的话, 跟注是合适的.
‫现在演员死了, 因为我们需要检查一下游戏模式是否有效｡
‫我可以在这里放置一个广告, 如果检查和检查, 看看是否调整坦克游戏模式是有效的｡
‫如果它是null, 那么它将返回false, 我们不会进入if语句的内部｡
‫所以如果我们到达if语句里面, tune tank游戏模式是有效的并且健康值已经达到零｡
‫所以我们可以说调坦克, 游戏模式｡
‫而我们可以称之为男主角死了｡
‫这需要一个演员, 我们知道死去的演员将是受损的演员｡
‫所以我们要忽略受损演员｡
‫现在我们可以编译这个并看看那个｡
‫我们有一个成功的编译器｡
‫让我们回到编辑器｡
‫在编辑器里, 我们为什么不继续测试死亡呢？
‫让我们看看我能不能在自己被摧毁之前摧毁一些坦克｡
‫这将是一种挑战｡
‫有一个｡
‫我杀了一个, 我得到了第二个｡
‫我死了｡
‫所以你可以看到这个游戏是一个更有趣的现在我们已经添加了死亡和破坏我们的池塘｡
‫所以这是伟大的｡
‫好了, 我希望你们能给予自己一个大大的鼓励, 因为在这个视频中我们处理了死亡演员,
‫这涉及到游戏中这些职业之间的大量互动｡
‫现在死亡的实现方式是池塘简单地消失了, 这意味着我们还需要一些东西｡
‫我们需要赢输的条件｡
‫我们需要一种方法来告诉玩家他们是赢了还是输了｡
‫而且我们还需要那些特效｡
‫我们需要一些声音, 我们需要一些爆炸｡
‫这些事情很快就会发生｡
‫所以恭喜你
‫你已经走了很长的路, 只剩下几步路要走｡
‫下一个视频里见｡