Могу ли я использовать 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.