五、方块Blocks
我怕不更新会被骂,所以更了。
坐标系
小伙纸,求一下 ∑ i = 0 ∞ i 2 \sum_{i=0}^\infty i^2 ∑i=0∞i2(bushi
是的,你没猜错,我们要涉及到史上最NB超级无敌掌门狗——数学中的坐标系
首先要知道,我们现在的世界是三维的,三维:长、宽、高(
x
,
y
,
z
x,y,z
x,y,z)
形象点讲,你的左边和右边是
x
x
x轴,上面和下面是
y
y
y轴,前面和后面是
z
z
z轴
方块
方块……没啥好讲的,这次讲的是创建、更改、移动一个方块
为什么没有创建和移动两个方法呢?
更改方块
最基本的一种了
1.1.引入
给定
(
X
,
Y
,
Z
)
(X,Y,Z)
(X,Y,Z)的,设我们要在
(
X
,
Y
,
Z
)
(X,Y,Z)
(X,Y,Z)的地方添加一个草方块,如何实现?
1.2.找到给定的x,y,z坐标的方块
方块,到处都有,它是在主世界吗?它是在下界,抑或是末地?
所以,我们首先需要知道这种方块在哪个世界。
//如果你不修改世界名,世界名默认是world
World world = Bukkit.getWorld("world");
它的坐标已经给定了,既然确定了大地方和小地方,那么就可以找到方块了。
//在world中找到坐标为(x,y,z)的方块
Block block = world.getBlockAt(x,y,z);
这样,block
就是坐标(
x
,
y
,
z
x,y,z
x,y,z)的坐标
当然了,找到block基本都是通过玩家的坐标所找到的。
1.3.找到玩家身下的方块
Player player = (Player)sender;
再找到玩家的坐标:player.getLocation()
Block block = player.getLocation();
1.1~1.3是基本功,不然找不到方块你还怎么更改方块?
1.4.更改方块的类型
例如,现在有一个
b
l
o
c
k
block
block存储了一个方块(假设TA是草方块吧)我需要把他改变成一个钻需块(钻需!)那么只需:
//setType:更改方块类型
//Material:Material类里面存储了所有的东西,TA是强大又无敌的
block.setType(Material.DIAMOND_BLOCK);
上面那个栗子就是创建一个方块,你可能会疑惑为什么更改方块的类型就是创建一个方块?
其实,世界中到处都是方块,空气也是方块(空气方块)不过是透明的了,将空气方块改成钻石方块,可以看做是添加一个方块,移动一个方块!
那么!它!就是!更改就是创建和移动的思想!(重要的dingyi说yi遍!)
1.5.移动方块
设
b
l
o
c
k
block
block存储了一种方块(遍地都是的草方块中的一个钻需块吧),并给定了
b
l
o
c
k
block
block的
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)坐标,现在想让这个方块向它的右边方移动一格。
如果你看过一些手画的动画,会发现每一帧都是一幅画
这个原理也是如此,想想呗,想不出来再看。
很简单(对于我而言啦)。
动画看似是连贯的,譬如
既然知道它的坐标,那么正前方就是
(
x
+
1
,
y
,
z
)
(x+1,y,z)
(x+1,y,z),这样就获取了它正前方的坐标。
向正前方移动一个,根据更改就是创建和移动的思想,右边无非就是个钻需块,只需更改它的类型
但是这样又有问题:它原本的坐标还是个钻需块,要把它变成草方块!
//block2就是正前方的方块,(x,y,z)已经给出,(x+1,y,z)就是右方的坐标
Block block2 = world.getBlockAt(x+1,y,z);
/*
根据思想:
向右移动就是将它前面的方块改成钻石块
即block2需要改成钻石块
*/
block2.setType(Material.DIAMOND_BLOCK);
/*
那block还没有改类型,会被看成是两个钻石块连在一起
要把它隐瞒起来
即block需要改成草方块
*/
block.setType(Material.GRASS_BLOCK);
再来,如果我们嵌个for循环,那么会被看成一个钻需块一直向TA的正前方滚动。
这时候需要注意一下:
这时候的
b
l
o
c
k
block
block是在不断发生变化的,
如果把上面框起来加个for,那么
b
l
o
c
k
block
block所在位置虽然改成了草方块,
但是当
b
l
o
c
k
2
block2
block2迈向第二步的时候,这时候
b
l
o
c
k
2
block2
block2的坐标是
(
x
+
2
,
y
,
z
)
(x+2,y,z)
(x+2,y,z)
依照我们刚刚所讲的,
b
l
o
c
k
2
block2
block2的后面需要改为草方块,即
(
x
+
1
,
y
,
z
)
(x+1,y,z)
(x+1,y,z)的地方是需要改的,
但是,并没有成功,只是
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)的地方在改变TA的类型
于是乎,我们需要将
b
l
o
c
k
block
block赋值于
(
x
+
1
,
y
,
z
)
(x+1,y,z)
(x+1,y,z),
那么这个对象是谁呢,对的!
b
l
o
c
k
2
block2
block2,或者说是
(
x
+
1
,
y
,
z
)
(x+1,y,z)
(x+1,y,z)的地方的方块
这相当于 b l o c k block block是跟在 b l o c k 2 block2 block2后面捡石子的人, b l o c k 2 block2 block2每次迈向一步都在扔石子,那我们是需要把这颗石子捡起来,但 b l o c k block block如果一直不动,永远不在 b l o c k 2 block2 block2的身后紧紧跟着,只在 ( x , y , z ) (x,y,z) (x,y,z)的地方永远捡TA的石子,那么,这个捡石子的人永远是失败的。
//向前走50步
Block block = world.getBlockAt(x,y,z), block2;
block.setType(Material.DIAMOND_BLOCK);
for(int i=1;i<=50;i++) {
block2 = world.getBlockAt(x+i,y,z);
block2.setType(Material.DIAMOND_BLOCK);
//block,捡石子的人,TA需要跟在block2的后面捡石子,于是乎,block本身需要改变TA的位置
block.setType(Material.GRASS_BLOCK);
block = world.getBlockAt(x+i,y,z);
}
效果图:
有个缺陷,它是在一瞬间完成的,如果是一秒一个那就能看到实际效果了
后期如果把定时器讲完那么就能开发出一个非常NB的插件了(点赞更下期!)
源代码