2015-08-21 4 views
2

Я попытался использовать как HaxeUI, так и HaxeFlixel, но то, что я получаю, является интерфейсом HaxeUI на белом фоне, покрывающим все под ним. Более того, даже если бы можно было несколько заставить HaxeUI и HaxeFlixel работать вместе, неясно, как изменить пользовательский интерфейс 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 имеют свой собственный основной цикл, и что их обработка событий может быть не совместимы, но только в том случае, кто-то может иметь более окончательный ответ?

Edit:

На самом деле, это гораздо лучше при использовании 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.

+0

работает с функцией Toolkit.openPopup(). – Cletrix

ответ

0

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

+1

Вы правы относительно flixel-ui, он интегрирован с фликселем с нуля. Но haxeui кажется гораздо лучше документированным, по крайней мере, для части XML. Фактически, как упоминалось в обновлении вопроса, использование openPopup() решает часть проблемы, и обе части экрана могут взаимодействовать. Во всяком случае, я, вероятно, в конечном итоге буду использовать flixel-ui из-за его интеграции с haxeflixel. – x2f

0

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

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

+0

Да, на самом деле проблема с белым фоном исчезает при использовании openPopup() (см. Обновление вопроса). У меня все еще есть проблема, что указатель мыши haxeflixel отображается ниже виджета haxeui. Если бы была работа, для которой это было бы выполнимо, я думаю. Вы получили эту проблему в своем предыдущем опыте работы с flixel + haxeui? – x2f

1

При использовании 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. (ПРИМЕЧАНИЕ. Они не обязательно должны быть подчиненными, это то, что лучше всего работает в моем случае.)

 Смежные вопросы

  • Нет связанных вопросов^_^