UU看書

第二十五章 更加精確的目標選擇器 上

天才一秒記住【UU看書】地址:www.uukanshu.co

在Java113及以上版本或基岩版中,當你在輸入目標選擇器之後,指令提示往往會出現一個符號,這個符號就是『』。

為什麼呢?其實,一個目標選擇器實際上有兩個部分:

lt變數gt篩選引數

其中的變數即我們瞭解過的a、e之類的,而篩選引數則是透過各種特定的條件從已選擇的實體中細分出需要的實體。

那麼到底有多少種篩選引數呢?答:到目前為止(202283),Java版有21個篩選引數,基岩版有22個篩選引數。

這些引數如下:

座標

座標

x、y、z

距離(球形範圍)

distance(JE113及以上)

r、rm(BE和JE113以下)

立方體範圍

dx、dy、dz

旋轉角度

垂直旋轉角度

xrotation(JE113及以上)

rx、rxm(BE和JE113以下)

水平旋轉角度

yrotation(JE113及以上)

ry、rym(BE和JE113以下)

記分板

記分板分數

scores(JE113及以上和BE)

score(JE113以下)

標籤

tag

隊伍名(僅Java)

team

其他

數量

limit、sort(JE113及以上)

c(BE和JE113以下)

經驗等級

level(JE113及以上)

l、lm(BE和JE113以下)

遊戲模式

gamemode(JE113及以上)

m(BE和JE113以下)

名稱

name

實體型別

type

實體家族(僅基岩版)

family

物品

hasitem

實體資料標籤(僅Java版)

NBT

遊戲進度(僅Java版)

advancements

謂詞(僅Java版)

predicate

看起來好像很複雜的樣子?部分引數的確有點複雜,但大部分還是很簡單的。

我們先看看格式:

(注意,接下來的“”都不屬於格式的符號,屬於必填符號,“ltgt”符號仍是格式符號)

lt引數名gtlt引數值gt,lt引數名gtlt引數值gt,…

唉,你有沒有發現,這和JSON的格式有點像啊。

沒錯,和JSON一樣,目標選擇器的每個引數也是一個『鍵值對』。只不過需要注意以下三點:

①目標選擇器引數部分的最外層必須要用中括號包起來

②目標選擇器的每個引數,其引數名和引數值之間是用等於號分開,而不是用分號

③平臺特性,大部分英文半形符號會被強制改為中文全形符號

現在詳細的講講各種引數的使用方式。

——座標——

這個很熟悉吧,就是座標而已。“x”就是X座標,“y”就是Y座標,“z”就是Z座標。

那麼舉個栗子:

ex1,y60,z30

這個意思是設定基準點為(1,60,30)。什麼是基準點呢?我們在第七章中瞭解到指令具有三要素:指令執行者、指令執行的地點和引數。

其中,指令執行的地點也可以叫做指令執行的基準點,簡稱執行點。

所以說?

你是不是以為這三個用於確定位置的引數就是用來確定這個『指令執行的基準點』?當然不是確定這個基準點啦。實際上,除了這個基準點外,目標選擇器中還有一個特殊的基準點。這個基準點只有一個用處:用於給目標選擇器中的某些引數提供中心。而這個基準點,就是透過x、y、z三個引數確定的(如果沒有用這三個引數確定,那麼預設是採用指令執行的地點)。

那麼到底是哪些引數需要用到這個基準點呢?接下來你就知道了。

對了,在基岩版,x、y、z三個引數的值是可以使用相對座標的。比如:

ex1,y,z

這將會設定基準點在指令執行位置往東一格的地方。

——距離——

使用圓規畫圓,首先需要找到一個圓心,然後確定圓的半徑,最後旋轉360°就畫出了一個圓。

在Minecraft中,使用距離引數確定選擇實體的範圍,本質上就是在畫一個圓(實際上是個球)。這個圓的圓心就是上面那三個引數確定的基準點,圓的半徑則是需要使用r或是distance引數確定。

比如:

ax23,y65,z33,r10——Java113以下和基岩版

ax23,y65,z33,distance10——Java113及以上

這個目標選擇器的意思是:以座標23,65,33為基準點,範圍10格內的所有玩家

但如果我們要這範圍10格以外的玩家怎麼辦?這樣做:

ax23,y65,z33,rm10——Java113以下和基岩版

ax23,y65,z33,distance10——Java113及以上

這個目標選擇器的意思是:以座標23,65,33為基準點,範圍10格外的所有玩家

可惜起點並不能放圖,不然這用圖表示會更好。

我們可以總結出r和rm的作用:

r引數的作用是:選取所有距離基準點小於R格的實體

rm引數的作用是:選取所有距離基準點大於RM格的實體

更高階一點,你還可以r和rm一起用,比如:

ax23,y65,z33,r10,rm5——Java113以下和基岩版

ax23,y65,z33,distance510——Java113及以上

這樣子可以選取距離基準點大於5格但小於10格的玩家(相當於畫兩個圓組成一個圓環,然後選取圓環內部及邊緣的實體)。

你也可以:

ax23,y65,z33,r10,rm10——Java113以下和基岩版

ax23,y65,z33,distance10——Java113及以上

這樣子可以選取距離基準點10格的玩家(注意,只能是10格,多一點少一點都不行)。

需要注意的是,R必須大於等於RM,不然什麼也選不中。

r和rm畢竟是基岩版和Java113以下版本用的,在Java版113及以上版本使用的distance,又是怎麼用的呢?

其實上面講r和rm時,順帶列出來相同用法的distance,就已經告訴你distance的四種用法了。

如果你還不清楚,我們就將R和RM兩個引數值代入到distance,來告訴你distance到底怎麼用:

distanceR——選取所有距離基準點小於R格的實體

distanceRM——選取所有距離基準點大於RM格的實體。

distanceRMR——選取所有距離基準點大於RM格小於R格的實體。

distanceRRM——選取所有距離基準點RMR格的實體。

發現規律了沒有?那兩個點在數字左邊,就代表小於X格的實體;在右邊,即大於X格的實體;在兩個數值中間,就代表距離在這兩個值中間的實體;沒有那兩個點,只有一個數值,那麼就只代表距離X格的實體。

(立方體範圍)

使用fill確定的立方體範圍很好理解,而目標選擇器的立方體範圍

因為它並不是讓你找兩個點

而是,以基準點分別向三個方向延伸多少格構成的立方體!

(Mojang本來這麼做是為了相對座標,只不過這就導致使用絕對座標時很頭疼)

舉個最簡單的例子:

ax0,y0,z0,dx10,dy10,dz10

這個目標選擇器的意思是:

選取從0,0,0到10,10,10構成的立方體內的所有玩家。

更深一層的意思是:

以基準點0,0,0向正X軸延伸10格,正Y軸延伸10格,正Z軸延伸10格所構成的立方體內的所有玩家。

但一般來說,基準點可不會是這麼簡單的三個數值。所以我們使用dx、dy、dz時,必須要掌握一個技術:將fill構成立方體的兩點座標轉化為目標選擇器的基準點和延伸格數。

將fill構成立方體的兩個座標記為:

A₁x₁,y₁,z₁

A₂x₂,y₂,z₂

設定A₁為基準點,即:

xx₁,yy₁,zz₁

A₂A₁,得:

A₃x₂x₁,y₂y₁,z₂z₁

這個結果就是dx、dy、dz的值了:

xx₁,yy₁,zz₁,dxx₂x₁,dyy₂y₁,dzz₂z₁

舉個例子:

A₁(287,65,122)

A₂(300,69,24

就可以得出:

x287,y65,z122,dx13,dy4,dz98

這樣子,以後我們就不用刻意去記到底要延伸多少格了(除了x、y、z並沒有指定的情況下,這時候就要以相對座標的思維去思考了)。

對了,在Java版,判定實體是否在範圍內是按照碰撞箱是否有重疊判斷,在基岩版則是按照腳部座標判斷。

——記分板分數——

——記分板標籤——

——隊伍名稱——

上面幾格都是關於“記分板”(scoreboard)的,這個會在第四十九章中講到。

——數量——

這個很有意思。Java113及以上版本是limit和sort,基岩版和Java113以下版本是隻有一個c。

由於limit和sort相比於c是大徑相庭,所以我們先從limit和sort開始。

使用e,我們可以選擇所有實體,但我們該怎麼選擇10只實體呢?

elimit10

就可以了。

但如果要選中最靠近目標選擇器基準點的實體該怎麼辦?

這時候我們就需要使用sort,調整選取模式。

在Java113及以上版本中,a和e這兩個目標選擇器變數的預設選取模式是按照實體生成時間由長到短排列,即越老排越前面,對應sort的選取模式即:arbitrary。

我們要選中最靠近基準點的實體,只需要使用nearest模式即可:

elimit1,sortnearest

這樣子就可以選取最靠近基準點的實體。但請注意,在基岩版和Java113以下版本中,a和e這兩個目標選擇器變數是按照實體與目標選擇器基準點的距離從小到大排列的,也就是nearest模式,並不是按照實體生成時間排列。

sort一共有四種模式:

nearest——由近到遠

furthest——由遠到近

random——隨機

arbitrary——按生成時間由老到新

其中,對於arbitrary模式來講,『c』這個引數基本上無法模仿。

那麼c引數該如何使用呢?

先彆著急,因為還有一個知識點沒講:

其實,當使用p和r變數時,limit或c預設為1,更改limit或c會增加選擇最近(p預設排列模式為nearest)或隨機(r預設為random模式)目標的數量。當使用a或e變數時,此方式會限制目標數量。如果是s呢?那還用說嗎?你有10個嗎?Minecraft可沒有分身術。

注意一點,limit不能寫負數,但c可以。

c引數為正整數時,在除r變數外會選取最靠近基準點的C個目標;為負整數時,在除r變數外會選取最遠離基準點的C個目標。比如:

ac5

ac5

前者會選取最近的5名玩家,後者會選取最遠的5名玩家。

但如果要隨機排序呢?那麼就得用r(隨機排序)變數了。

c引數還有一個小知識,如果所有目標都一樣遠(你這不是鑽牛角尖嗎),在負整數的情況下將會選取生成時間越晚的實體,正整數情況下將會選取生成時間越早的實體。

——經驗等級——

這個用來選取經驗等級的引數,兩個版本又不相同了。Java113及以上版本是level,基岩版和低於Java113的版本是l和lm。

等等,你有沒有發現,這和那個rm、r、distance不超級像的嗎?

沒錯,基本上你怎麼用距離的,選取經驗等級就怎麼用。比如選取經驗等級小於等於5的玩家:

al5——Java113以下和基岩版

alevel5——Java113及以上

又比如選取經驗等級大於等於5的玩家:

alm5——Java113以下和基岩版

alevel5——Java113及以上

又比如選取經驗等級在5到10級之間(含5和10級)的玩家:

al10,lm5——Java113以下和基岩版

alevel510——Java113及以上

又比如選取經驗等級正正好好為5級的玩家:

al5,lm5——Java113以下和基岩版

alevel5——Java113及以上

懂了吧?不懂就對照r、rm、distance多看幾遍。

本章就到此結束。

如遇章節錯誤,請點選報錯(無需登陸)

新書推薦

網遊之創無限 三國之我是個小兵 鋒腰搖擺人,足壇以我為模板 在異世界黑化 獨臂籃球王 籃球:獲得球星招牌技能,從喬丹開始 我真的是個內線