3

我尝试同时使用 HaxeUI 和 HaxeFlixel,但我得到的是白色背景上的 HaxeUI 界面,覆盖了下面的所有内容。此外,即使可以在某种程度上使 HaxeUI 和 HaxeFlixel 一起工作,当 HaxeFlixel 中的状态发生变化时,如何更改 HaxeUI 的 UI 也不清楚。这是我使用的代码:

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 用户界面元素下。

4

3 回答 3

1

当同时使用 Flixel 和 HaxeUI 时,几乎就像同时运行两个应用程序一样。但是,它们都依赖 OpenFL 作为后端,并且都将自己附加到其显示树。

我现在正在试验的一种技术是打开 Flixel 子状态,并在子状态中调用 Toolkit.openFullscreen()。在此内部,您可以将根背景的 alpha 设置为 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 控制器相关联。(注意:严格来说,它们不一定是子状态,这对我来说是最有效的。)

于 2015-09-26T06:24:36.413 回答
0

当您使用 haxeui 打开全屏或弹出窗口时,程序流程将被阻止(不会调用您的 update() 和 draw() 函数)。您可能应该看看flixel-ui

于 2015-08-22T15:26:54.423 回答
0

根据我的经验,haxeflixel 和 haxeui 可以很好地协同工作,但它们是完全独立的项目,因此,flixel 状态和显示的 UI 之间的任何协调都必须由编码器添加。

我不记得你提到的白色背景问题,除非 haxeui 根精灵具有坚实的背景,否则它不应该发生,在这种情况下,它应该解决给 haxeui 项目维护者。

于 2015-08-22T16:09:12.580 回答