Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 29 Май 2023
- Сообщения
- 23
- Реакции
- 1
Тема полностью редактирована (29.03.2025).
Начнем. Напишем базовую логику настроек.
С чего начать? Начнем с главного класса (тело).
Setting.java
Данный класс потребуется для создания экземпляров на его основе. Будем наследоваться от него.
Далее создадим аннотацию "TSetting", можете назвать ее как хотите. Потребуется для мета-анализа рефлексии, будем отслеживать классы (поля) на наличие аннотации.
Можно сделать и с помощью переопределения методов Module, но так как будто бы правильнее.
TSetting.java
Все. Теперь можем начать писать сами виджеты.
Напишем самый простой CheckBox.
CheckBox.java (псевдо код)
Че дальше? А дальше нам нужно написать саму логику распознавания полей.
Для наглядности предположим что данный метод будет находиться в классе ModuleManager.java.
isSetting.boolean (метод класса)
Все, теперь каждый модуль будет проверен на наличие настроек.
Создайте экземпляр настройки в полях класса и добавьте его в структуру.
Пример:
Вот и все, далее вам просто нужно будет реализовать рендер в Gui.
Советы?
1) Рекомендую использовать заранее заготовленные интерфейсы клика и рендера. Тем самым поступите более правильно и в дальнейшем сможете использовать их же для реализации рендера и обработки в вашей гуишке. Достаточно интересное решения если вы создаете "Подразделяющую" структуру ваших гуи компонентов.
Начнем. Напишем базовую логику настроек.
С чего начать? Начнем с главного класса (тело).
Setting.java
Java:
public class Setting implements Wrapper {
private final String name;
public double x, y, width, height;
public Setting(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void render(MatrixStack matrixStack, double x, double y) {
this.x = x;
this.y = y;
}
@Override
public void click(double mouseX, double mouseY, int button) {
}
@Override
public void release(double mouseX, double mouseY, int button) {
}
@Override
public void moved(double xPos, double mouseY) {
}
}
Данный класс потребуется для создания экземпляров на его основе. Будем наследоваться от него.
Далее создадим аннотацию "TSetting", можете назвать ее как хотите. Потребуется для мета-анализа рефлексии, будем отслеживать классы (поля) на наличие аннотации.
Можно сделать и с помощью переопределения методов Module, но так как будто бы правильнее.
TSetting.java
Java:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TSetting {
}
Все. Теперь можем начать писать сами виджеты.
Напишем самый простой CheckBox.
CheckBox.java (псевдо код)
Java:
public class CheckBox extends Setting {
public boolean isActivate;
public CheckBox(String name) {
super(name);
this.width = 30;
this.height = 15;
}
@Override
public void render(MatrixStack matrixStack, double x, double y) {
super.render(matrixStack, x, y);
Render2D.drawRectGradient(this.x, this.y, this.width, this.height, color1, color2);
Render2D.drawRectGradient(this.x + (isActivate ? 15 : 0), this.y + 2.5f, this.width / 2, this.height - 2.7f, color1, color2);
mc.fontRenderer.drawString(matrixStack, this.getName(), (float) ((x + this.width) + 2), (float) y + 3, isActivate ? -1 : Color.DARK_GRAY.getRGB());
}
@Override
public void click(double mouseX, double mouseY, int button) {
if(Mouse.isHovered(mouseX, mouseY, this.x, this.y, this.width, this.height)) isActivate = !isActivate;
super.click(mouseX, mouseY, button);
}
}
Че дальше? А дальше нам нужно написать саму логику распознавания полей.
Для наглядности предположим что данный метод будет находиться в классе ModuleManager.java.
isSetting.boolean (метод класса)
Java:
public boolean isSetting(Module module) {
Class<?> clazz = module.getClass();
for(Field field : clazz.getDeclaredFields()) {
if(field.isAnnotationPresent(TSetting.class)) {
return true;
}
}
return false;
}
Все, теперь каждый модуль будет проверен на наличие настроек.
Создайте экземпляр настройки в полях класса и добавьте его в структуру.
Пример:
Java:
@TSetting
private final CheckBox test = new CheckBox("Test");
@TSetting
private final CheckBox test1 = new CheckBox("Test1");
@TSetting
private final CheckBox test1 = new CheckBox("Test2");
public ModuleTest() {
super("ModuleTest");
super.setting(test, test1, test2, ...); //используем varargs способ добавления.
}
Вот и все, далее вам просто нужно будет реализовать рендер в Gui.
Советы?
1) Рекомендую использовать заранее заготовленные интерфейсы клика и рендера. Тем самым поступите более правильно и в дальнейшем сможете использовать их же для реализации рендера и обработки в вашей гуишке. Достаточно интересное решения если вы создаете "Подразделяющую" структуру ваших гуи компонентов.
Последнее редактирование: