Начинающий
-
Автор темы
- #1
Настройки для модулей в гуи. Все что я хотел сказать.
Начнем писать.
Подразделяем на этапы:
1) Создание обьекта
2) Виджеты наследники.
3) Основная логика виджетов.
4) Определение сэттинга.
Пишем дальше, теперь нужно будет создать аннотацию для определение строк в классах. Таким образом мы будем автоматически проверять является ли модуль настриваемым, короче рефлексия.
Теперь добавим виджетов (чекбокс, слайдер и тд). Лучше задикларируем переменные там.
Теперь кешируем данные об настриваемом модуле.
Далее пишем логику рендера в гуи или где то еще. Там просто задействуйте логику через итерацию, отрендерите области настроек как захотите.
Начнем писать.
Подразделяем на этапы:
1) Создание обьекта
2) Виджеты наследники.
3) Основная логика виджетов.
4) Определение сэттинга.
Главное тело (обьект):
//contructor
public class Setting {
private final String name;
private double x, y;
public Setting(String name, double x, double y) {
this.name = name;
}
public String getName() {
return name;
}
//logic
public void render(MatrixStack matrices, double x, double y) {
//pre
this.x = x;
this.y = y;
}
public void click(double mouseX, double mouseY, int button) {
//mouse logic
}
}
Аннотация:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public [USER=1340661]@interface[/USER] TSetting {
}
Widget (checkbox):
public class CheckBox extends Setting {
public boolean isActivate; //состояние чекбокса
public CheckBox(String name) {
super(name);
}
[USER=1367676]@override[/USER]
public void render(MatrixStack matrixStack, double x, double y) {
super.render(matrixStack, x, y);
//псевдо код
double width = 30;
double height = 15;
Render2D.drawRectGradient(x, y, width, height, styleOPA.getColor()[0], styleOPA.getColor()[1]);
Render2D.drawRectGradient(x, y, width, 2, styleOP.getColor()[0], styleOP.getColor()[1]);
Render2D.drawRect(x + (isActivate ? 15 : 0), y + 2.5f, width / 2, height - 2.7f, isActivate ? new Color(80, 80, 80) : new Color(25, 25, 25));
mc.fontRenderer.drawString(matrixStack, getName(), (float) ((x + width) + 2), (float) y + 3, isActivate ? -1 : Color.DARK_GRAY.getRGB());
}
[USER=1367676]@override[/USER]
public void click(double mouseX, double mouseY, int button) {
if(Mouse.isHovered(mouseX, mouseY, x, y, 30, 20)) isActivate = !isActivate;
super.click(mouseX, mouseY, button);
}
в классе Module:
//метод для обнаружения
private boolean detect() {
Class<?> clazz = this.getClass();
for(Field field : clazz.getDeclaredFields()) {
if(field.isAnnotationPresent(TSetting.class)) { //проверяем на наличие аннотации
return true;
}
}
return false;
}
//Не забудьте в этом же классе обьявить ArrayList<Setting> как константу.
//Апдейтить лист можно будет на этапе инициализации. Так же для кеширования присвоите boolean isSetting = detect();