Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

【TCP|雷鸣】水平高精度独立追踪导弹「潜影贝:听说你也会导弹?」 ... ...

2017-7-19 03:25| 发布者: 乙烯_中国| 查看: 472| 评论: 6|原作者: 雷鸣·翾鹗|来自: mcbbs

摘要: 前言产品介绍画圆选择路径多导弹独立追踪后记ooc前言 依旧不怎么会码帖x 其实雷鸣很早之前就有想做个导弹的想法,只可惜当年还是条咸鱼现在是世纪咸鱼王没有能力去做,后来看到别的dalao的导弹,哇这个导弹好厉害 ...
[index]
[#1]前言&产品介绍
[#2]画圆&选择路径
[#3]多导弹独立追踪
[#4]后记&ooc
[/index]




前言
      依旧不怎么会码帖x
      其实雷鸣很早之前就有想做个导弹的想法,只可惜当年还是条咸鱼现在是世纪咸鱼王没有能力去做,后来看到别的dalao的导弹,哇这个导弹好厉害啊!然后瞅了眼隔壁那堆穷举用的cb,于是还是默默懒癌,最后也不了了之了。然而最近看到一颗赛艇的黑科技之后这个想法突然又冒了出来,不过还是由于技术问题搁置了,知道前几天考地理,雷鸣瞎蒙完答案之后突然灵光一现,于是窗外飞过了一枚雷鸣导弹。这下子可以去嘲讽潜影贝啦!

      以上是废话

产品介绍
      作为一颗导弹,火力与精度都是及其重要的,而在mc中,后者的实现则成为了等待cber们征服的又一座巅峰。导弹的高精度不只只是击中目标,更重要的是导弹的飞行轨迹,有专家说,导弹的威力和它的飞行轨迹优美程度成正比,那么今天,这一款产品将会成为你的最佳选择√


      产品名:独立追踪高精度导弹
      使用环境:1.9+(本文教程使用1.11实体名)
      打击对象:同一水平面上任意目标
      速度:与电脑配置成正比
      精度:与电脑配置成正比
      火力:Max
      价格:一只女装ms

      效果展示:

[page]



画圆&选择路径

      实现追踪功能,首先我们需要选定一个目标,当目标选定之后,就要选择路径,该选择怎样的路径也不用我多说了,两点之间线段最短
我们来举个例子,有一天Steve拿上镐子准备去挖矿时,突然看到前面有一只苦力怕君,Steve立马拿出了钻石剑,这时问题来了。如下图,Steve站在M点位置,苦力怕君在O点位置,Steve有四条路径可以选择,分别是MAO,MBO,MCO,MDO,其中MA=MB=MC=MD,那么Steve该选择哪条路径才能最快到达O点呢?



      答案很简单,选择MCO路径,因为当Steve离ABCD四个点距离都相同时,决定路径长短的就是每个点到O的距离,显然,经过离O点最近的C点的路径即为最短路径。
      Steve:我打苦力怕君跟你做导弹有什么关系?
      鉴于Steve的疑问,我们就来分析一下导弹。导弹可以看做是可以向360°任意方向前进,即导弹的周围有无数个与之距离相等的点,那么问:导弹该往哪飞才能以最快速度击中目标。答案也一样:经过离目标最近的点的路径
原理分析完毕,那么接下来该做的事就是如何在mc中实现了。

如何生成无数个离导弹距离相同的点?
几何说:平面上到定点的距离等于定长的所有点组成的图形叫做圆.定点称为圆心,定长称为半径。
轨迹说:平面上一动点以一定点为中心,一定长为距离运动一周的轨迹称为圆周,简称圆。
集合说:到定点的距离等于定长的点的集合叫做圆。

      于是我们现在需要的,是一个由无数个实体组成的圆,当然在mc中无数个实体是不现实的,于是就要根据自身情况选择实体数量,实体越多精度越高,这里雷鸣使用了12个实体组成圆,即精度=360°/12=30°,命令如下。


      上述命令省略了实体的tag,稍后讲到时再补充。首先我们利用骑乘的药水云都在同一个坐标生成12个骑乘的药水云,然后execute它们生成系统中最重要的辅助maker船以及船乘坐的药水云。由于船在1.9改成了双人船,导致当船上有两名乘客时,乘客坐标会相对于船向前/后偏移,于是我们就会得到这样一组实体。(药水云换成盔甲架方便观察用的√)一颗赛艇相关教程请戳窝



      接着只需要像折扇一样把它展开来就好了,关于如何展开问题我也不好解释,于是自行戳吧→execute大法好!,命令如下。


      上述命令原理同pca帖子中execute与stats举的例子是一样的,只是最后执行的命令有所改变,以达到第1个船旋转1*30°,第二个2*30°,第n个n*30°的效果,从而使12个船地朝向均匀分布在360°上。


      这样我们就能得到一个由实体组成的导弹环,但是我们需要的不是船,也不是朝向,而是船上的后乘客药水云,我们逐步把实体隐形掉看看。


      最后一张图片的粒子效果为后乘客的坐标,这很清楚地告诉了我们,圆出来了。在这里每一个点需要三个实体来标记,其中船的作用是作为旋转中心,前乘客的作用是把后乘客挤出去,后乘客的作用则是起到最终的标记。当然这是一个使用以大量实体为代价简化命令的方法,如果想系统运行得更加顺畅,可以直接使用多条命令生成在一个圆上的若干实体。


如何选择最短路径?
      从上面的分析来看,只要能够在导弹环上找到并标记离目标最近的一只药水云,然后把导弹tp到标记的药水云上,循环这一过程即可。有一点值得注意,由于上面展开船tp的对象是船,所以在当前刻中,药水云仍处于原位置,要到下一刻才能到达指定位置变成环,所以我们需要在下一刻再执行标记药水云的命令,这也是为什么药水云的存在时间需要为2。此外,不同乘客的高度和船的相对高度也是各不相同的,比如盔甲架和船的高度相同,药水云比船略低,tp的时候需要作一定的高度调整,才能达到水平移动的效果,命令如下


      当然最后不要忘记把船都清除掉哦√

[page]



多导弹独立追踪

      上一页我们讲到了如何建立一个圆让目标反向搜索最佳路径,但可能有人把命令搬回去试了下,发现当他发出两颗导弹的时候它们都黏在一起了,这是因为在选择药水云标记的时候由于只选择一个最近的,会导致只有一个药水云被标记,从而两颗导弹撞到一起导致翻车事件。
      照惯例我们分析一下,一颗导弹时我们需要选择环中与目标最近的点,多颗导弹时我们需要选择每个环中离目标最近的点,转换到mc中,即为选中每一组实体环离目标最近的那个实体。

      问题分析完毕,接下来分析下思路,如果我们不能一次性找到每一组环离目标最近的那个实体的话,那么就一个个来找。假设有3颗导弹,即有三组环,给它们打上1~3的索引值,即第一组环所有实体分数设为1,第二组设为2,第三组为3。这样一来,我们可以先从分数为1的环中标记实体,然后全部减1,循环个三次,即可找出每一组的目标,命令如下。


      但很当导弹数量为n的时候,就需要循环n次,在导弹这种及时性很高的系统中,循环多次显然是不现实的,但这并不代表我们不能使用这种思路。接下来我们要做的,就是在一条命令中同时做到执行命令和修改计分板分数,stats和execute搭配使用可以做到。
    首先我们需要给导弹和环加上索引值,利用stats和execute配合,我们可以快速给n个实体加上1~n的索引值,命令如下。


      通过上述命令,就可以得到索引值为1~n的n个导弹及导弹环。接下来的一步必须在下一刻执行,原因上面说了就不再重复了,可以通过激活另一条cb链或者计分板啥的做到就不多做解释了,命令如下。


      这里来解释一下第三条命令。第一层execute为循环次数,当有n个导弹的时候,后面几层的命令将会执行n次。后面三次和上面一颗导弹的命令一样,而最终执行的命令改变了实体分数,则会导致在每次循环中第二层选择的实体不同,举个例子吧。
假设有2颗导弹,此时分数为A:1,B:2
/execute @e[tag=mark3] ~ ~ ~
  [当前符合条件的实体数为2,于是下面会执行2次]
    /execute @e[tag=mark3,c=1,score_stats=1,score_stats_min=1] ~ ~ ~
      [当前符合条件的实体数为1,A被选中,于是下面会执行1次]
        /execute @e[tag=mark1,c=1] ~ ~ ~
          [当前符合条件的实体数为1,A的目标被选中,于是下面会执行一次]
            /execute @e[tag=mark2,c=1,score_stats=1,score_stats_min=1] ~ ~ ~
              [当前符合条件的实体数为1,A路径被选中,于是下面会执行一次]
                /scoreboard players remove @e[tag=mark5,score_stats_min=1] stats 1

      此时分数大于1的共有26个(每个导弹和导弹环上的药水云),且最终命令由A路径执行,所以此时A路径SuccessCount为26,即分数为26,其余实体分数均减1。继续上述命令

    /execute @e[tag=mark3,c=1,score_stats=1,score_stats_min=1] ~ ~ ~
      [当前符合条件的实体数为1,B被选中,于是下面会执行1次]
        /execute @e[tag=mark1,c=1] ~ ~ ~
          [当前符合条件的实体数为1,B的目标被选中,于是下面会执行一次]
            /execute @e[tag=mark2,c=1,score_stats=1,score_stats_min=1] ~ ~ ~
              [当前符合条件的实体数为1,B路径被选中,于是下面会执行一次]
                /scoreboard players remove @e[tag=mark5,score_stats_min=1] stats 1

      此时分数大于1的共有14个(B导弹、B导弹环以及A路径),且最终命令由B路径执行,所以此时B路径SuccessCount为14,即分数为14,其余实体分数均减1。


      一条命令执行完毕,我们最终发现,分数不为0的实体仅有两个,就是A路径和B路径,当有n颗导弹的时候,该命令效果也是一样的,从而我们就达到了最初也是最终的目的了。最后有几点值得注意,首先如果是使用船辅助生成环的话就不能直接把导弹tp到路径上,因为船拥有碰撞箱且数量多会导致tp失败,解决方法是在路径的地方生成一个marker,把船清除后再tp。导弹生成的位置需要注意,如果是在玩家的坐标生成,而且你是用船的话,将会被船挤出去就需要将导弹实体移到上方或下方,担心被玩家看到有船在天上飞的话,可以配合资源包让船材质变成透明就好了,还有击中目标怎样处理以及没有目标怎样处理的问题,这个就看各人喜好了。另外如果有玩家想让导弹打击到不同水平面的目标的话,也是可以通过检测目标在导弹上方还是下方再做偏移处理也是没问题的√

[page]



后记
      第一次码这种教程,大概都会觉得雷鸣一堆废话吧,不过这样一边分析问题一边解决问题还带着瞎扯一堆东西的感觉还是不错的,于是有什么错误和解释不到位的地方以及建议啥的欢迎戳窝√
      玩具做好了,雷鸣也快要滚回学校复习了,明天就要考完期末考最后三科辣,求各种学霸学神附体嗷嗷!
      最后还是丢个ooc供大家吐槽吧,版本为1.11+,使用胡萝卜钓竿右键发射导弹,以及里面的tag与本教程的tag均不相同,请注意食用√






[groupid=1009]The Command's Power[/groupid]
发表评论

最新评论

引用 TakasakaKirino 2017-8-15 09:47
假装看得懂。。
引用 旋风的世界 2017-8-12 23:44
逛论坛惊险雷鸣哥,瞬间进来回复一下
引用 Richy 2017-8-10 11:23
真看不懂
引用 1332082102 2017-8-7 17:50
艾玛我看不懂
引用 SpaceBang 2017-7-22 22:10
展开收起似乎是坏的…?
引用 天迹灬战狂神 2017-7-19 08:32
艾玛这排版真是厉害了

查看全部评论(6)

相关分类

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 手机版本

GMT+8, 2017-8-18 01:39 , Processed in 0.196694 second(s), 8 queries , Memcache On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。

© 2010-2017 我的世界中文论坛 版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。

返回顶部