🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
Ця сторінка написана для версії:
1.21.4
Ми вже коротко торкалися промальовування речей у HUD на сторінці основні концепції промальовування та використання контексту малювання, тому на цій сторінці ми будемо дотримуватись API Hud і параметра RenderTickCounter.
HudRenderCallback WARNING
Раніше Fabric надавав HudRenderCallback для промальовування в HUD. Через зміни у промальовуванні HUD ця подія стала надзвичайно обмеженою та не підтримується після Fabric API 0.116. Використання настійно не рекомендується.
HudLayerRegistrationCallback Fabric надає API Hud для промальовування та накладення елементів на HUD.
Для початку нам потрібно зареєструвати слухача HudLayerRegistrationCallback, який реєструє ваші шари. Кожен шар є IdentifiedLayer, який є ванілльним LayeredDrawer.Layer з прикріпленим Identifier. Екземпляр LayeredDrawer.Layer зазвичай є лямбда-виразкою, яка приймає екземпляри DrawContext і RenderTickCounter як параметри. Перегляньте HudLayerRegistrationCallback і пов’язані Javadocs, щоб дізнатися більше про те, як використовувати API.
Контекст малювання можна використовувати для доступу до різноманітних утиліт промальовування, які надає гра, і доступу до стеку необроблених матриць. Перегляньте сторінку контекст малювання, щоб дізнатися більше про контекст малювання.
Клас RenderTickCounter дозволяє отримати поточне значення tickDelta. tickDelta — це «прогрес» між останнім ігровим тактом і наступним.
Наприклад, якщо ми припустимо сценарій 200 FPS, гра запускає новий такт приблизно кожні 10 кадрів. Кожен кадр, tickDelta, представляє, наскільки ми знаходимося між останнім тактом і наступним. Понад 11 кадрів ви можете побачити:
| Кадр | tickDelta |
|---|---|
1 | 1: Новий такт |
2 | 1/10 = 0.1 |
3 | 2/10 = 0.2 |
4 | 3/10 = 0.3 |
5 | 4/10 = 0.4 |
6 | 5/10 = 0.5 |
7 | 6/10 = 0.6 |
8 | 7/10 = 0.7 |
9 | 8/10 = 0.8 |
10 | 9/10 = 0.9 |
11 | 1: Новий такт |
На практиці ви повинні використовувати tickDelta лише тоді, коли ваші анімації залежать від галочок Minecraft. Для анімації на основі часу використовуйте Util.getMeasuringTimeMs(), який вимірює реальний час.
Ви можете отримати tickDelta, викликавши renderTickCounter.getTickDelta(false), де логічним параметром є ignoreFreeze, що, по суті, дозволяє вам просто ігнорувати, коли гравці використовують команду /tick freeze.
У цьому прикладі ми використаємо Util.getMeasuringTimeMs() для лінійної інтерполяції кольору квадрата, який промальовується на HUD.
public class HudRenderingEntrypoint implements ClientModInitializer {
private static final Identifier EXAMPLE_LAYER = Identifier.of(FabricDocsReference.MOD_ID, "hud-example-layer");
@Override
public void onInitializeClient() {
// Attach our rendering code to before the chat hud layer. Our layer will render right before the chat. The API will take care of z spacing and automatically add 200 after every layer.
HudLayerRegistrationCallback.EVENT.register(layeredDrawer -> layeredDrawer.attachLayerBefore(IdentifiedLayer.CHAT, EXAMPLE_LAYER, HudRenderingEntrypoint::render));
}
private static void render(DrawContext context, RenderTickCounter tickCounter) {
int color = 0xFFFF0000; // Red
int targetColor = 0xFF00FF00; // Green
// You can use the Util.getMeasuringTimeMs() function to get the current time in milliseconds.
// Divide by 1000 to get seconds.
double currentTime = Util.getMeasuringTimeMs() / 1000.0;
// "lerp" simply means "linear interpolation", which is a fancy way of saying "blend".
float lerpedAmount = MathHelper.abs(MathHelper.sin((float) currentTime));
int lerpedColor = ColorHelper.lerp(lerpedAmount, color, targetColor);
// Draw a square with the lerped color.
// x1, x2, y1, y2, z, color
context.fill(0, 0, 10, 10, 0, lerpedColor);
}
}
Чому б вам не спробувати використати tickDelta і подивитися, що відбувається з анімацією, коли ви виконуєте команду /tick freeze? Ви повинні побачити зависання анімації, коли tickDelta стане постійним (припустимо, що ви передали false як параметр для RenderTickCounter#getTickDelta)