Могу ли я использовать HaxeUI с HaxeFlixel?

Я пытался использовать как HaxeUI, так и HaxeFlixel, но я получаю интерфейс HaxeUI на белом фоне, покрывающий все под ним. Более того, даже если было возможно несколько заставить HaxeUI и HaxeFlixel работать вместе, не ясно, как изменить пользовательский интерфейс HaxeUI при изменении состояния в HaxeFlixel. Вот код, который я использовал:

private function setupGame():Void {

    Toolkit.theme = new GradientTheme();
    Toolkit.init();

    var stageWidth:Int = Lib.current.stage.stageWidth;
    var stageHeight:Int = Lib.current.stage.stageHeight;

    if (zoom == -1) {
        var ratioX:Float = stageWidth / gameWidth;
        var ratioY:Float = stageHeight / gameHeight;
        zoom = Math.min(ratioX, ratioY);
        gameWidth = Math.ceil(stageWidth / zoom);
        gameHeight = Math.ceil(stageHeight / zoom);
    }

    trace('stage: ${stageWidth}x${stageHeight}, game: ${gameWidth}x${gameHeight}, zoom=$zoom');
    addChild(new FlxGame(gameWidth, gameHeight, initialState, zoom, framerate, framerate, skipSplash, startFullscreen));

    Toolkit.openFullscreen(function(root:Root) {
        var view:IDisplayObject = Toolkit.processXmlResource("assets/xml/haxeui-resource.xml");
        root.addChild(view);
    });
}

Я могу предположить, что, вероятно, и HaxeUI, и HaxeFlixel имеют свой собственный основной цикл и что их обработка событий может быть несовместимой, но на всякий случай, может ли кто-то иметь более определенный ответ?

Редактировать:

На самом деле, это намного лучше при использовании openPopup:

Toolkit.openPopup( { x:20, y:150, width:100, height:100 }, function(root:Root) {
            var view:IDisplayObject = Toolkit.processXmlResource("assets/xml/haxeui-naming.xml");
            root.addChild(view);
        });

Можно взаимодействовать с остальной частью экрана (управляется с помощью HaxeFlixel), но указатель мыши, присутствующий в части экрана, управляемой с помощью HaxeFlixel, остается под элементами пользовательского интерфейса HaxeUI.

3 ответа

Решение

Когда вы открываете полноэкранный режим или всплывающее окно с haxeui, поток программы будет заблокирован (ваши функции update() и draw() не будут вызываться). Вам, вероятно, стоит взглянуть на flixel-ui.

При совместном использовании Flixel и HaxeUI это почти как запуск двух приложений одновременно. Однако оба они полагаются на OpenFL в качестве серверной части и каждый присоединяется к своему дереву отображения.

Одна из техник, над которыми я сейчас экспериментирую, состоит в том, чтобы открыть вложенное состояние Flixel, а внутри этого состояния вызвать Toolkit.openFullscreen(). Внутри этого вы можете установить альфа фонового корня в 0, что позволит вам видеть сквозь него растровое изображение, которое Flixel использует для рендеринга.

Вот минимальный пример того, как вы можете "встроить" интерфейс редактора в подсостояние Flixel:

import haxe.ui.toolkit.core.Toolkit;
import haxe.ui.toolkit.core.RootManager;
import haxe.ui.toolkit.themes.DefaultTheme;

import flixel.FlxG;
import flixel.FlxSubState;

// This would typically be a Haxe UI XMLController
import app.MainEditor;

class HaxeUIState extends FlxSubState
{

    override public function create()
    {
        super.create();

        // Flixel uses a sprite-based cursor by default,
        // so you need to enable the system cursor to be
        // able to see what you're clicking.
        FlxG.mouse.useSystemCursor = true;

        Toolkit.theme = new DefaultTheme();
        Toolkit.init();
        Toolkit.openFullscreen(function (root) {
            var editor = new MainEditor();

            // Allows you to see what's going on in the sub state
            root.style.backgroundAlpha = 0;
            root.addChild(editor.view);
        });
    }

    override public function destroy()
    {
        super.destroy();

        // Switch back to Flixel's cursor
        FlxG.mouse.useSystemCursor = true;

        // Not sure if this is the "correct" way to close the UI,
        // but it works for my purposes. Alternatively you could
        // try opening the editor in advance, but hiding it
        // until the sub-state opens.
        RootManager.instance.destroyAllRoots();
    }

    // As far as I can tell, the update function continues to get
    // called even while Haxe UI is open.
    override public function update() {
        super.update();

        if (FlxG.keys.justPressed.ESCAPE) {
          // This will implicitly trigger destroy().
          close();
        }
    }
}

Таким образом, вы можете связать разные состояния Flixel с разными контроллерами Haxe UI. (ПРИМЕЧАНИЕ: они не обязательно должны быть подсостояниями, это именно то, что работало лучше всего в моем случае.)

Исходя из моего опыта, haxeflixel и haxeui хорошо работают вместе, но они являются абсолютно независимыми проектами, и поэтому кодер должен добавить любую координацию между состояниями flixel и отображаемым пользовательским интерфейсом.

Я не помню, чтобы у вас была проблема с белым фоном, о которой вы упоминали, она не должна возникать, если у корневого спрайта haxeui нет твердого фона, в этом случае ее следует адресовать сопровождающему проекта haxeui.

Другие вопросы по тегам