This commit is contained in:
boybook
2025-12-01 20:59:16 +08:00
parent 12738a142c
commit 760c2dd9ad
5535 changed files with 21070 additions and 2021 deletions

View File

@@ -0,0 +1,85 @@
---
front:
hard: 进阶
time: 20分钟
---
# 粒子效果及音效播放
## 粒子效果
客户端正常配置时,若对草方块上使用骨粉,草方块上会长出草丛,同时还会生成绿色的颗粒动画. 这样的动画效果就是Minecraft中的粒子效果.
### 播放粒子效果
如果想在某一个`Location`对象所对应的位置播放粒子效果对于不同的Minecraft版本有不同的方案
#### PlayEffect
可以利用World类的`PlayEffect`方法:
*对于EffectBukkitAPI在后续的更改中其中的枚举几乎都或多或少有些许改动。开发时应小心。*
```java
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有意将`Sound``Visual`这两个概念分隔开,对于粒子效果,在使用`spawnParticle`方法时,取`Effect`而代之的是`Particle`枚举.
*spawnParticle的用法较多在此略去大篇幅对各个方法与参数的介绍可以查阅JavaDoc其中有十分简单易懂的注释.*
*BukkitAPI后续更新中枚举或多或少都有变动应当注意*
### 播放所需的形状
> 开发实例: 在玩家脚底播放一圈半径为1的粒子效果
**分析**
1. 几何角度考虑
以玩家脚底处为原点,建立平面直角坐标系. 如下图所示:
![](../images/0_8.jpg)
*绿色部分为粒子效果*
由圆的定义知,所绘制的粒子为到原点的点集.
2. 实现
播放想要的形状就是逐次的在所需播放的坐标处播放粒子效果.
*这里将不解释什么是弧度制,而是做强制要求,只要算角度都必须用这样的方法变为弧度制,有兴趣可以在网上查阅*
```java
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后续更新中枚举或多或少都有变动应当注意*