MENU

从 0 到 1 的 Hologram

January 23, 2022 • Read: 493 • Bukkit,Minecraft,后端

在看本篇文章之前请确保你有 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 功能实现,更多的功能需要你去探索。

Last Modified: March 20, 2023