在看本篇文章之前请确保你有 Java 基础及一定 Bukkit 开发经验,仅适合 1.8 及以上版本。
一、前言
做为一名积极 (咕咕) 的开发者,看到某项功能的时候第一时间想应该不是怎么去好好利用这个功能,而是应该思考这项功能是如何实现的?
本文将带你走入 Hologram,主要解析我们常见的 Hologram 全息文本是怎么实现的。
二、解析
既然我们是解析 Hologram 是怎么实现的,那我们就需要将它拆分出来进行思考。
Hologram 是由什么组成的?多行文本?不仅仅是多行文本,本文使用盔甲架实现,拥有更高的扩展性。
在开始之前,我们将 Hologram 拆分一下,拆分结构有利于我们更有逻辑的去实现功能。
我们将结构拆分出来后,我们去一一实现各个模块的内容,本文仅展示 Hologram 对象部分 (文本行)
建立一个 Hologram Class, 喜欢高扩展性的开发者可以建立一个接口,再去新建类来实现接口,扩展性更高。
public class HologramCache {
private final List<ArmorStand> stands = new ArrayList<>();
public HologramCache(Location source, List<String> list) {
double lineSpace = 0.3;
Location location = source.clone();
for (int i = 0; i < list.size(); i++) {
ArmorStand armorStand = (ArmorStand) source.getWorld().spawnEntity(location.clone(), EntityType.ARMOR_STAND);
armorStand.setVisible(false);
armorStand.setInvulnerable(true);
armorStand.setGravity(false);
armorStand.setSmall(true);
armorStand.setCustomName(ChatColor.translateAlternateColorCodes('&', list.get(list.size() - i - 1)));
armorStand.setCustomNameVisible(true);
this.stands.add(armorStand);
location = location.add(0, lineSpace, 0);
}
}
public void delete() {
this.stands.forEach(Entity::remove);
}
}
通过生成盔甲架并设置属性及 CustomName,来实现文本行这个功能,并集中于一个 List 存储。
需要注意的是,我们是以 i + 1 的形式去实现 for 循环,但我们获取文本的时候是通过 list.size – i – 1 去获取。
这样,我们就写出了一个能实现 Hologram 的类 HologramCache,自动计算行距及提供删除全息的方法。
三、结尾
本文仅做出 Hologram 的结构解析及基础的 Hologram 功能实现,更多的功能需要你去探索。