Проблемы с обработкой касаний по Кастомному_GUI_Элементу в Minecraft 26.1 - Fabric : Mojo-mapping

Версия Minecraft
1.26.1
API
Fabric
Ну... такс... [Решение]
Правила форума гласит - сначало сам разберись....
ХМММММММММММММММММММММ
- разобрался,
Короче, там на 26.1 в отличи от 1.21.11 - Всё очень разделено, прям конкретненько
в 1.21.11 для содания своего UI или GUI достаточно было реализовать класс, который бы наследовался от "Я уже не понмю но чот интерфейс InputHandler" - вероятно я не помню :unsure:
Ну можно* было обойтись и без наследования, главное реализовать mouseClick - или MousePressed и MouseRelesed -
А потом в Screen или его наследнике - К примеру если кастомный экран, для GUI то просто нужно было, обьявит все функции - или нужные* функции такие как
MousePressed()
[B]MouseRelesed()[/B]
MouseDrag()

и в них уже {
Цыкл элементов "Item"
item.mousePressed() или item.mouseRelesed() или item.mouseDrag()
}
Ну если давать пример кода :
Псевдо-код : Типо мой Кастомный GUI елемент:
public void MousePressed(double MouseX,double MouseY,float delta) {
    if (isHovered(MouseX,MouseY)) {
        this.isPressed = true;
        this.setFocus(this.isPressed)
        return true;
    }
    return false;
}

public void MouseRelesed(double MouseX,double MouseY,float delta) {
    this.isPressed = false;
    return true;
}

А далее, уже в screen :
Псведо* - GUI_Element наследствии от Screen:
import local.namel.client.gui.CustomElement;

public class Element extends Screen {
   
    private CustomElement  ElMent = new CustomElement();
    protected list<CustomElement> ScreenItems = new ArrayList<?>(); // Э... чот не помню, ну ладно...
   
    @overide
    public void Init(String title) {
        ElMent.setPosX(32);
        ElMent.setPosY(32);

        super(title)
    }
   
    // ... Какой то код, там рендер и тд


    @overide
    public void MousePressed(double MouseX,double MouseY,float delta) {
        for (i : CustomElement ScreenItems) {
            if (i instanceof InputHandler) // Интерфейс, с помощью которого можно проверить подерживает ли он отклит* Водд
            {
                i.MousePressed(MouseX,MouseY,delta);
            }
        }
        return true;
    }

    @overide
    public void MouseRelesed(double MouseX,double MouseY,float delta) {
        for (i : CustomElement ScreenItems) {
            if (i instanceof InputHandler) // Интерфейс, с помощью которого можно проверить подерживает ли он отклит* Водд
            {
                i.MouseRelesed(MouseX,MouseY,delta);
            }
        }
        return true;
    }
   
    // ... Какой то код, там дальнешая обработка, и дополнительные функции отрисовки, блюр итд
}


И ну остальное делалось за меня :) "Я без понятия что ещё можно написать, задайте вопрос если чот не понятно ладно? :confused:"
Ранее а именно 1.21.11 такое было достаточно, но щяс, твой кастомный элемент должен быть более подстроенным под Некие критерии!?

Если так подумать, принципе нечего не изменилось.
Просто теперь в Screen надо добавить свой кастомный элемент в wighet - через

addRenderableWidget(?):
InputFragment.setPos_X(Fragment.getPos_X()+Fragment.getSize_X()+32);
InputFragment.setPos_Y(32);
this.addRenderableWidget(InputFragment);
// Это все делаеться в Init! Разовая растоновка..
И короче Прикол в том, что как видно по названию, это для Rendera, ну тоесть, он за тебя, будет вызывать вот такой фрагментик
InputFragment.extractRenderState(guiGraphics,mouseX,mouseY,partialTick);
И я логический подумал, и пришёл к "К сожелению" тупому решению, сделать так ::
this.addWidget(InputFragment);
По моей чудо логике, должно было заработать и касании* водд короче говоря -
Почему? А потому-что, addWiget внутри себя делает проверку на наличия наследствия от таких интерфейсов как : GuiEventListener и Renderable и ещё Нуратебл - ток я не смог его найти в коде 0_-, я забыл где он проверялся,
И вот, мой InputFragment - Содержит наследия\подключён интерфейс GuiEventListener и! Renderable
Если что Renderable и GuiEventListener Шаблон* или Абстракции, те мотодов, а именно: [Которых нужно реализовать, сам по себе можно обойтись без наследования, но тогда Screen не захочет рендерить или Обрабатывать вод, но пока, он и с ними этого не делает...]
1] void extractRenderState(final GuiGraphicsExtractor graphics, int mouseX, int mouseY, final float a); - Это как старый render() {}
2]
InputHandler но теперь GuiEventListener:
public interface GuiEventListener extends TabOrderedElement {
    default void mouseMoved(final double x, final double y) {
    }

    default boolean mouseClicked(final MouseButtonEvent event, final boolean doubleClick) {
        return false;
    }

    default boolean mouseReleased(final MouseButtonEvent event) {
        return false;
    }

    default boolean mouseDragged(final MouseButtonEvent event, final double dx, final double dy) {
        return false;
    }

    default boolean mouseScrolled(final double x, final double y, final double scrollX, final double scrollY) {
        return false;
    }
// . . . :: code
3] Что-то для того- чтобы, была подержка диктора, но я просто вставил заглушки и всё, кстати... зачем диктор в игре? Притом выжевания где важна скорость и точность.... (Ну по крайнее мере в онлайне)

По сей чудо логике, если мой интерфейс\GUI наследует от нашего GuiEventListener, то Screen должен сам его обрабатывать их реализации в моём Элементе который я добавил в его список Wighets которых он обновляет данных и render > extractRenderState

Кстати меня пугает это название : extractRenderState - О какое State идёт речь, и почему extract, что им обычный render сделал, что они решили его заменить... Кто разбираеться лучше, можете по приколу ответить на этот вопрос, может я вообще не туда лезу... я видел у . . . . . . . забыл имя класса, плохо... ну в 26.1 есть, методы которые делают отрисовку по стандарту через render() а не extractRenderState() И лично я, не вижу разницы в работе, притом, рендер работает полностью исправно, А ВОТ касания, игнорируеться...

Я не понимаю в чём дело... вроде всё правильно, как и почему this.addRenderableWidget(InputFragment);
Выполняет свою работу, и рендер происходит без ручного создания цыкла фор, в extractRenderState() у наследника Screen

А вот похожа функция, но без Renderable по середине просто this.addWidget(InputFragment); - не выполняет работу по обработке вода. Я пытался найти что-то подобии this.add[B]GuiListener[/B]Widget(InputFragment) - Но либо я слепой, либо такого там нет. ПРИТОМ, почему this.addWidget(InputFragment);, Требует от элемента, наследия интерфейсов " [ GuiEventListener & NarratableEntry ] "
И при этом, в закулисии, не занимаеться их обработкой? - Когда this.addRenderableWidget(InputFragment);
Который Требует от элемента, наследия интерфейсов " [ GuiEventListener & Renderable & NarratableEntry ] " - . . . Нечего не понял, я думал он только Renderable требует, а нет... там ещё и GuiEventListener...

Может дело в заглушке? У меня класс элемента* В конце содержит такую заглушку для NarratableEntry

Как думаете? Эти заглушка, как-то бьёт по работоспособности GuiEventListener:
public class InputBLayout extends BLayout implements GuiEventListener, NarratableEntry {
    // BLayout содержит в себе implements к Renderable!
    // ... code ...
   
    @Override
    public NarrationPriority narrationPriority() {
        return null;
    }
    @Override
    public void updateNarration(NarrationElementOutput output) {

    }
}

Если вы не полняли что тут происходит... это печально, а то я не знаю как ещё можно обьяснить...
Если кратко, игнориуеться касания, как и касания, так и hover, ну я вообще могу в executeRenderState() {Тут} - делать проверки и тд и тп, или в главной игровой цыкле, сделать эти проверки к всем обьектам на экране, и если есть совпадения, то у него вызвать всё что нужно по коду* но звучит не рентабельно. Ведь явно это можно сделать по проше


Это, мой первый пост, где-либо... не где н просил помошь, из-за чего не один проект не дожил до релиза :3
Но в отличии от этой, там баги бывали более маштабными, что либо знаний не хватало для решений, либо не мог нати источник где можно понять, что делать в таких нестандартных или стандартных но для меня нестандартных сетуациях

[Решение]
 
Последнее редактирование:
Решение
Решение проблемы : Нашлась почему-то очень быстро -_-, будто назло


Метод isMouseOver(double mouseX, double mouseY) должен возвращать true.
Если ты наследовался от интерфейса GuiEventListener напрямую (или через абстрактные классы) и забыл переопределить метод isMouseOver, он по умолчанию всегда возвращает false! Как результат: Screen думает, что мышка находится не над твоим элементом, и даже не пытается вызвать mouseClicked.​


===============

Есть 2 метода решения проблемы:
Просто сделать return true; у isMouseOver()
2] Или сделать полноценную реализцаю..


Я скопировал свой пост, решил скормить AI, и он...​
Я сразу скажу, полез в 26.1+ чисто ради интересо, и чтобы пошюпать новые функции и методы, те-же слизи -
Ну и так-как оно новое, у меня был подобный проектик* на 1.21.11 но он остановился в середине, там у меня всё шло хорошо, отрисовка - окна - и тд, тут некие- проблемки вылезли, я смотрел "Учебник" - там если я не плох в поиске информации Вероятно я плох в поиске информации - не нашёл нечего годного, там версии очень старые, и явно код и решение не подходят.

Если что я пытаюсь заменить главный экран, через миксины, но не думаю что это может быть ключевым обьектом, моей проблемы. тут больше проблема в незнании API, который сильно обновился, ну или не прям.
Успешно заменил, я пытался как-то помягче* без миксинов, или с частичным использованиям миксинов, но получалась береберда, и я лешил, наглуха вбить свой код, в текуший TitleScreen или как он там, кстати если это ключ к решению проблемы, то печально, мне честно лень мучаться с магкой заменой, если можно просто заменить код... странная логика, для безопасности и совместимости, это критично, ну мой мод будет чисто локальным* так-что, не думаю что стоит беспокоиться о совместимости.


Я Не Java разработчик, я вообще самоучка, с одного языка на другой пригаю, от чего синтаксисы путаю в примерах "Псевда кода" -

Так же там на первом Псевдо-Коде, упушен момент добовления в ElMent мой кастомный Элемент, ну не думаю что это критично, притом код не написан чтобы его копировать и вставлять, а лишь для... если честно не знаю зачем..., для ознакомления =\

А также касательно норатора, и то что я там делаю return null; исправлено, он с null возврошает ощибку НалПоинт так что, не спешите писать насчёт этого :|, но в общем, основная проблема не решена
 
Последнее редактирование:
Решение проблемы : Нашлась почему-то очень быстро -_-, будто назло


Метод isMouseOver(double mouseX, double mouseY) должен возвращать true.
Если ты наследовался от интерфейса GuiEventListener напрямую (или через абстрактные классы) и забыл переопределить метод isMouseOver, он по умолчанию всегда возвращает false! Как результат: Screen думает, что мышка находится не над твоим элементом, и даже не пытается вызвать mouseClicked.​


===============

Есть 2 метода решения проблемы:
Просто сделать return true; у isMouseOver()
2] Или сделать полноценную реализцаю..


Я скопировал свой пост, решил скормить AI, и он смог найти ощибку, спасибо за внимание, жалко что проблема так быстро решилась, инетересно было бы почитать, чтобы вы написали...​



Если вдруг, кто думает "А почему ты сам не догодался? " - То ответ таков : "Потомую-что я и не заметил этот метод, я слепой как бревно"
 
Назад
Сверху