Мы уже кратко затронули тему рендеринга объектов в HUD на странице Основные концепции рендеринга и Использование контекста рисования, поэтому на этой странице мы остановимся на событии HudRenderCallback и параметре deltaTick.
HudRenderCallback
Событие HudRenderCallback, предоставляемое Fabric API, вызывается в каждом кадре и используется для рендеринга объектов в HUD.
Чтобы зарегистрироваться на это событие, вы можете просто вызвать HudRenderCallback.EVENT.register и передать lambda, которое принимает DrawContext и float (deltaTick) в качестве параметров.
Контекст отрисовки можно использовать для доступа к различным утилитам рендеринга, предоставляемым игрой, а также для доступа к стеку необработанных матриц.
Вам следует посетить страницу Контекст рисования, чтобы узнать больше о контексте рисования.
DeltaTick
deltaTick относится ко времени с момента последнего кадра в секундах. Это можно использовать для создания анимации и других временных эффектов.
Например, предположим, что вы хотите изменять цвет с течением времени. Вы можете использовать deltaTickManager, чтобы получить deltaTick, и сохранять его с течением времени для преобразования цвета:
java
public class HudRenderingEntrypoint implements ClientModInitializer {
@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.
HudElementRegistry.attachElementBefore(VanillaHudElements.CHAT, Identifier.of(FabricDocsReference.MOD_ID, "before_chat"), 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, color
context.fill(0, 0, 10, 10, lerpedColor);
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25


