🇺🇦 Українська (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
. Клас RenderTickCounter
дозволяє отримати поточне значення 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
.
Ви можете отримати tickDelta
за допомогою функції renderTickCounter.getTickDelta(false);
, де логічним параметром є ignoreFreeze
, що, по суті, дозволяє вам просто ігнорувати, коли гравці використовують команду /tick freeze
.
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
)