# 粒子效果及音效播放

# 粒子效果

客户端正常配置时,若对草方块上使用骨粉,草方块上会长出草丛,同时还会生成绿色的颗粒动画. 这样的动画效果就是Minecraft中的粒子效果.

# 播放粒子效果

如果想在某一个Location对象所对应的位置播放粒子效果,对于不同的Minecraft版本有不同的方案:

# PlayEffect

可以利用World类的PlayEffect方法:
对于Effect,BukkitAPI在后续的更改中,其中的枚举几乎都或多或少有些许改动。开发时应小心。

Location loc = 某一Location对象;
loc.getWorld.playEffect(loc, Effect.HAPPY_VILLAGER, 1); //播放的是绿色的闪光星星⭐效果

PlayEffect方法在较早的BukkitAPI版本中即被加入. 在使用这一方法时需要与Effect打交道.
Effect是效果枚举. 值得注意的是,这其中既包含动效(Effect.Type.VISUAL),也包含声效(Effect.Type.SOUND).

作为一个老旧的API,在实际开发当中,这一方法并不常用. 其中的常见枚举(例如这里使用的HAPPY_VILLAGER)在新的API中被标记废除.

# spawnParticle

在新版的API中加入了spawnParticle方法. 目前开发插件常用这一方法来播放粒子效果.

新版的BukkitAPI有意将SoundVisual这两个概念分隔开,对于粒子效果,在使用spawnParticle方法时,取Effect而代之的是Particle枚举.

spawnParticle的用法较多,在此略去大篇幅对各个方法与参数的介绍,可以查阅JavaDoc,其中有十分简单易懂的注释.
BukkitAPI后续更新中,枚举或多或少都有变动,应当注意!

# 播放所需的形状

开发实例: 在玩家脚底播放一圈半径为1的粒子效果

分析

  1. 几何角度考虑

以玩家脚底处为原点,建立平面直角坐标系. 如下图所示:

绿色部分为粒子效果

由圆的定义知,所绘制的粒子为到原点的点集.

  1. 实现 播放想要的形状就是逐次的在所需播放的坐标处播放粒子效果.

这里将不解释什么是弧度制,而是做强制要求,只要算角度都必须用这样的方法变为弧度制,有兴趣可以在网上查阅

Location loc = p.getLocation().clone();
for(int t=0;t<360;t++){ //这里的t表示旋转角,从0到360度遍历一遍就是转了一圈
    double r = Math.toRadians(t); //角度制变弧度制
    //在这里,我们使用三角函数依次计算出了对应点的坐标.
    //建议作图体会这样计算的原理.
    double x = Math.cos(r);
    double y = Math.sin(r);
    //在刚开始时,loc是坐标系原点(也就是玩家所在的位置)
    //这里我们的add将其变为了我们想要播放粒子的坐标位置
    //后面我们又subtract(减)将其又变为了坐标原点
    loc.add(x,0,y);
    loc.getWorld().spawnParticle(Particle.VILLAGER_HAPPY,loc,1,null);
    loc.subtract(x, 0, y);
}

这样我们就完成了这一效果.

依此,可以大致概括出实现粒子效果的基本步骤:

  1. 分析: 从数学角度分析, 思考怎么才能获得所需形状中所有的点;从代码角度分析,思考怎样才能依此获得这些点的坐标值
  2. 实现:利用恰当的方法播放粒子效果

# 音效播放

由于Effect既包含动效,也包含声效,这意味着使用与上面PlayerEffect方法一样的方法,我们也可以播放音效.

在新API中提供了playSound方法并且加入了Sound枚举. 目前常用这一方法. 这一方法是World也同样是Player类的方法, 具体使用哪一方法,取决于你希望对谁播放.

BukkitAPI后续更新中,枚举或多或少都有变动,应当注意!

进阶

20分钟

粒子效果

播放粒子效果

播放所需的形状

音效播放