🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
This page is written for:
1.21
This page is written for:
1.21
INFO
Эта страница относится к обычным экранам, а не к управляемым — эти экраны открываются игроком на клиенте, а не те, которыми управляет сервер.
Экраны по сути представляют собой графические интерфейсы, с которыми взаимодействует игрок, например, титульный экран, экран паузы и т. д.
Вы можете создавать собственные экраны для отображения пользовательского контента, пользовательского меню настроек и многого другого.
Чтобы создать экран, вам необходимо расширить класс Screen
и переопределить метод init
(при желании вы также можете переопределить метод render
), но обязательно вызовите его super метод, иначе он не отобразит фон, виджеты и т. д.
Вам следует принять к сведению, что:
width
и height
, еще недоступны или неточны.init
вызывается при инициализации экрана, и это лучшее место для создания виджетов. addDrawableChild
, который принимает любой отрисовываемый виджет.render
вызывается в каждом кадре — из этого метода можно получить доступ к контексту отрисовки и положению мыши.В качестве примера мы можем создать простой экран с кнопкой и меткой над ней.
public class CustomScreen extends Screen {
public CustomScreen(Text title) {
super(title);
}
@Override
protected void init() {
ButtonWidget buttonWidget = ButtonWidget.builder(Text.of("Hello World"), (btn) -> {
// When the button is clicked, we can display a toast to the screen.
this.client.getToastManager().add(
SystemToast.create(this.client, SystemToast.Type.NARRATOR_TOGGLE, Text.of("Hello World!"), Text.of("This is a toast."))
);
}).dimensions(40, 40, 120, 20).build();
// x, y, width, height
// It's recommended to use the fixed height of 20 to prevent rendering issues with the button
// textures.
// Register the button widget.
this.addDrawableChild(buttonWidget);
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
super.render(context, mouseX, mouseY, delta);
// Minecraft doesn't have a "label" widget, so we'll have to draw our own text.
// We'll subtract the font height from the Y position to make the text appear above the button.
// Subtracting an extra 10 pixels will give the text some padding.
// textRenderer, text, x, y, color, hasShadow
context.drawText(this.textRenderer, "Special Button", 40, 40 - this.textRenderer.fontHeight - 10, 0xFFFFFFFF, true);
}
}
Вы можете открыть экран с помощью метода setScreen
MinecraftClient
— это можно сделать из многих мест, например, с помощью привязки клавиш, команды или обработчика пакетов клиента.
MinecraftClient.getInstance().setScreen(
new CustomScreen(Text.empty())
);
Если вы хотите закрыть экран, просто установите экран в значение null
:
MinecraftClient.getInstance().setScreen(null);
Если вы хотите проявить изюминку и вернуться к предыдущему экрану, вы можете передать текущий экран в конструктор CustomScreen
и сохранить его в поле, а затем использовать его для возврата к предыдущему экрану при вызове метода close
.
public Screen parent;
public CustomScreen(Text title, Screen parent) {
super(title);
this.parent = parent;
}
@Override
public void close() {
this.client.setScreen(this.parent);
}
Теперь при открытии пользовательского экрана вы можете передать текущий экран в качестве второго аргумента — тогда при вызове CustomScreen#close
произойдет возврат к предыдущему экрану.
Screen currentScreen = MinecraftClient.getInstance().currentScreen;
MinecraftClient.getInstance().setScreen(
new CustomScreen(Text.empty(), currentScreen)
);