SkepticalFox 1,445 #284937 Posted July 26, 2015 А ничего что это команда на деструкт вьюшки? Что она ее убивает. Вот она и пропадает. А чтобы она появилась в другом виде где-то, нужно подумать как туда добавить, и как связать активность. На въюшках директ колл не прокатит (я не знаю полного пути до объекта, а создавать левые ссылки на объекты GUI и отсылать тем самым удаление объекта на уборщик мусора очень нехорошо, ибо будут баги), так что либо эвенты с добавлением листенера на популейт и удалением на деструкт (вроде картоха так делает), либо слабые ссылки (тут уже вопрос с их контролем). Как вариант, можно определить работу объекта через враппер (который и будет прибираться), но тогда с ним (объектом) не очень удобно будет работать.Человек первый раз на AS3 пишет, а ты! Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #284949 Posted July 26, 2015 Человек первый раз на AS3 пишет, а ты!А я про Питон. Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #285620 Posted July 30, 2015 Добавляем к классу TestWindow в файле TestWindow.py методы def testF(self, param1): print param1 def as_setTextS(self): if self._isDAAPIInited(): return self.flashObject.as_setText('Hello') В классе TestWindow в TestWindow.py изменим def _populate(self): View._populate(self) self.as_setTextS() В TestWindow.as добавим: public var testF:Function = null; public function as_setText(param:String):void { this.testF(param); } В PjOrion'е увидим - Hello Не пойму как вывести текст в TextField Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #285633 Posted July 30, 2015 (edited) del Edited June 19, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #285771 Posted July 31, 2015 (edited) public function as_setText(param:String):void { this.textFieldTest.htmlText = param; } Хм.. вчера так и пытался вывести но почему то вывел пустату заместо "Hello World!" override protected function configUI() : void { super.configUI(); this.textFieldTest = new TextField(); this.textFieldTest.width = 590; this.textFieldTest.height = 360; this.textFieldTest.x = 5; this.textFieldTest.y = 0; this.textFieldTest.multiline = true; this.textFieldTest.selectable = false; this.textFieldTest.addEventListener(MouseEvent.CLICK, this.ontextFieldTest, false, 0, true); this.addChild(this.textFieldTest); } public var testF:Function = null; public function as_setText(param:String):void { this.textFieldTest.htmlText = param; } public function TestWindow() { super(); } from gui.Scaleform.framework import g_entitiesFactories, ViewSettings from gui.Scaleform.framework import ViewTypes, ScopeTemplates from gui.Scaleform.daapi.view.meta.WindowViewMeta import * from gui.Scaleform.daapi import LobbySubView from gui.WindowsManager import g_windowsManager from gui.shared.utils.key_mapping import getBigworldNameFromKey from gui.Scaleform.framework.entities.View import View class TestWindow(LobbySubView, WindowViewMeta): def __init__(self): View.__init__(self) def _populate(self): View._populate(self) self.as_setTextS() def onWindowClose(self): self.destroy() def onTryClosing(self): return True def testF(self, param1): print param1 def as_setTextS(self): if self._isDAAPIInited(): return self.flashObject.as_setText('Hello World!') _alias = 'TestWindow' _url = 'TestWindow.swf' _type = ViewTypes.WINDOW _event = None _scope = ScopeTemplates.DEFAULT_SCOPE _settings = ViewSettings(_alias, TestWindow, _url, _type, _event, _scope) g_entitiesFactories.addSettings(_settings) def onhandleKeyEvent(event): key = getBigworldNameFromKey(event.key) if key == 'KEY_F10': g_windowsManager.window.loadView('TestWindow', 'TestWindow') return None from gui import InputHandler InputHandler.g_instance.onKeyDown += onhandleKeyEvent *** EXCEPTION(scripts/common/Event.py, 34):*** Traceback (most recent call last): *** File "scripts/common/Event.py", line 32, in __call__ *** File "scripts/client/gui/Scaleform/framework/managers/containers.py", line 509, in __loader_onViewLoaded *** File "scripts/client/gui/Scaleform/framework/entities/DisposableEntity.py", line 17, in create *** File "testWindow", line 16, in _populate *** File "testWindow", line 29, in as_setTextS *** Exception: PyGFxValue - Failed to invoke method as_setText. Edited July 31, 2015 by SV_Kirov Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #285798 Posted July 31, 2015 (edited) del Edited June 19, 2016 by ShadowHunterRUS 1 Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #285807 Posted July 31, 2015 Все ясно! У меня такая же ошибка была. Нужно после _populate вызвать as_setText То есть должно получиться: def __init__(self): View.__init__(self) def _populate(self): View._populate(self) self.as_setTextS() def as_setTextS(self): if self._isDAAPIInited(): return self.flashObject.as_setText('Hello World!') def onWindowClose(self): self.destroy() def onTryClosing(self): return True def testF(self, param1): print param1 Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #285808 Posted July 31, 2015 (edited) То есть должно получиться:нет не такНужно из флешки отправить сигнал на старт функции public var startF:Function;В конце configUI дописать this.startF();В питоне class TestWindow(LobbySubView, WindowViewMeta): def __init__(self): View.__init__(self) def _populate(self): View._populate(self) def as_setTextS(self): if self._isDAAPIInited(): return self.flashObject.as_setText('<font color="#FFFFFF">Hello World!</font>') def onWindowClose(self): self.destroy() def onTryClosing(self): return True def startF(self): self.as_setTextS() Edited July 31, 2015 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #285823 Posted July 31, 2015 Теперь ошибки тут *** Traceback (most recent call last):*** File "testWindow", line 28, in startF*** File "testWindow", line 19, in as_setTextS*** Exception: PyGFxValue - Failed to invoke method as_setText. from gui.Scaleform.daapi import LobbySubView from gui.WindowsManager import g_windowsManager from gui.shared.utils.key_mapping import getBigworldNameFromKey from gui.Scaleform.framework.entities.View import View class TestWindow(LobbySubView, WindowViewMeta): def __init__(self): View.__init__(self) def _populate(self): View._populate(self) def as_setTextS(self): if self._isDAAPIInited(): return self.flashObject.as_setText('<font color="#FFFFFF">Hello World!</font>') def onWindowClose(self): self.destroy() def onTryClosing(self): return True def startF(self): self.as_setTextS() _alias = 'TestWindow' _url = 'TestWindow.swf' _type = ViewTypes.WINDOW _event = None _scope = ScopeTemplates.DEFAULT_SCOPE _settings = ViewSettings(_alias, TestWindow, _url, _type, _event, _scope) g_entitiesFactories.addSettings(_settings) def onhandleKeyEvent(event): key = getBigworldNameFromKey(event.key) if key == 'KEY_F10': g_windowsManager.window.loadView('TestWindow', 'TestWindow') return None from gui import InputHandler InputHandler.g_instance.onKeyDown += onhandleKeyEvent Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #285824 Posted July 31, 2015 А чем вариант с populate плох? Флешка типа не успеет прогрузиться? И почему _isDAAPIInited не блочит вызов к DAAPI в такой ситуации? Интересно, как связаны вызовы ключевых методов вьюшки в питоне и во флеше, а то как-то не совсем понятно, что и когда вызывается, особенно во флеше. В питоне еще более менее понятно, populate / destroy, обработчики событий на закрытие и свертывание окна... А вот во флеше - вопрос. Смысл методов понятен и названий по большому счету, а вот при каких условиях они вызываются - не совсем. Жаль нормальных доков на эту тему нет( Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #285825 Posted July 31, 2015 Вот по этому я и не могу вкурить Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #285828 Posted July 31, 2015 (edited) Теперь ошибки тутПопробуй посмотреть список атрибутов flashObject. Возможно, ты не совсем корректно поднял DAAPI... Хотя с другой стороны... Если ты делал, как сказал , то у тебя вызов проходит сначала через DAAPI Flash-Python, потом идет обратно Python-Flash, где и фейлится... Попробуй выполнить в питоне перед вызовом self.flashObject.as_setText(...) print self.flashObject print self.flashObject.as_setTextВ обоих случаях он должен выкинуть что-то типа DisplayObject. Если так происходит только с первым принтом, значит у тебя DAAPI почему-то не подхватил метод из флеша.По сути DAAPI (Direct Access API) реализует прямой доступ к объектам флеша из питона, так что можно попробовать выполнить что-то типа self.flashObject.textFieldTest.htmlText = '...'Но тогда нужно определить textFieldTest как public. Я надеюсь в AS классе ты не забыл его вообще определить? Хотя, мне кажется, что флешка тогда отказалась бы компилиться) Если честно, я не совсем понимаю логику распределения методов на приватные и те, которые сопоставляются через DAAPI, но скорее всего на flashObject должны быть видны все public аттрибуты, а из питона подтягиваться все public function, которые определены в AS-классе. Возможно, с этим связано то, что к методам на питоне добавляют S... Чтобы не было перегрузки метода во флеше. Ну и до кучи проверка self._isDAAPIInited(). Если я в чем-то ошибаюсь, прошу поправить. Upd. Так бы поигрался с другими именами функций, было бы время, но скорее всего имена функций даются разработчиками для понятности, а для инициализации DAAPI используют параметры атрибутов связанных классов. Раскопай базовые классы вьюшек и особенно DAAPI-Python класс, посмотри как там проходит инициализация... Ну и код популяции вьшек тоже посмотри. Там полюбому все эти "хвосты" есть. Я подымал руками DAAPI на AS2, там при ините базового класса элемента (разработка в Macromedia Flash 8 идет, основному элементу флешки, тип MovieClip задается базовый класс, весь код пишется там) задаются параметры перегружаемых питоном методов через недокументированную функцию... Декомпильни RadialMenu (Python/Flash), там все это есть. После загрузки флеша получается объект flashObject, ему задается параметр .script = self, т.е. назначается класс-обработчик питона, как раз и происходит перегрузка методов DAAPI. А во flashObject видно и доступно все, что есть у флеш-объекта в атрибутах / объявлено в базовом классе (private не тестировал). Особо не копался, я в AS чайник, но в общих чертах разобрался, что куда. Не думаю, что в AS3 используется какой-то особо отличающийся метод, но по крайней мере через DAAPI я спокойно двигал флеш объект по экрану, через _x / _y. Зачем нужен класс gfx.io.GameDelegate я не совсем понимаю, но скорее всего это предшественник DAAPI, ибо в новых боевых флешках на глаза он мне не попадался... Разбери тот же BattleRibbons.swf, как-то так он называется, это новые ленты достижений. Насколько я понимаю, всю замуту с инициализацией DAAPI картоха уже провернула, и ты наследуешь уже готовые классы, где у тебя сразу инициализируется DAAPI при популяции, но тебе все равно придется покопаться, что и как происходит... Но я как-то причину твоей ошибки не могу понять... С виду вроде все правильно. Edited July 31, 2015 by GPCracker Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #285847 Posted July 31, 2015 (edited) del Edited June 19, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #285855 Posted July 31, 2015 (edited) Хы, понял где косяку меня было так: public var startF:Function; public function as_setText(param:String):void { this.textFieldTest.htmlText = param; } public function TestWindow() { super(); } override protected function configUI() : void { super.configUI(); this.startF(); this.textFieldTest = new TextField(); this.textFieldTest.width = 590; this.textFieldTest.height = 360; this.textFieldTest.x = 5; this.textFieldTest.y = 0; this.textFieldTest.multiline = true; this.textFieldTest.selectable = false; this.textFieldTest.addEventListener(MouseEvent.CLICK, this.ontextFieldTest, false, 0, true); this.addChild(this.textFieldTest); } Edited July 31, 2015 by SV_Kirov Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #285856 Posted July 31, 2015 (edited) Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше?Смотри, что я нашел: # Embedded file name: scripts/client/gui/miniclient/lobby/MiniclientDescriptionWindow.py import os import ResMgr from gui.game_control import getBrowserCtrl from gui.shared import g_eventBus, events from helpers.i18n import makeString as _ms class MiniclientDescriptionWindow(object): def __init__(self): g_eventBus.addListener(events.GUICommonEvent.LOBBY_VIEW_LOADED, self.__openDescriptionInBrowser) def __openDescriptionInBrowser(self, event): current_working_dir = os.getcwd() getBrowserCtrl().load(url='file:///{0}'.format(ResMgr.resolveToAbsolutePath('gui/html/miniclient_description/index_{0}.html'.format(_ms('#settings:LANGUAGE_CODE')))), title=_ms('#miniclient:hangar/miniclient_description_window/title'), browserSize=(780, 450), showCloseBtn=True, showActionBtn=False)(lambda success: True) g_eventBus.removeListener(events.GUICommonEvent.LOBBY_VIEW_LOADED, self.__openDescriptionInBrowser)Именно то, что ты искал... P.S. я и не знал, что есть кастрированная версия WoT) Информационный листокВы используете стартовую версию World Of Tanks Что это обозначает? Стартовая версия знакомит с миром танков и занимает существенно меньше места. Ради этого пришлось вырезать следующее: игру с друзьями; некоторые режимы игры; личные боевые задачи; технику выше 3 уровня. Всё это станет доступно после загрузки оставшейся части игры. Загрузить полную версию Edited July 31, 2015 by ShadowHunterRUS 2 Quote Share this post Link to post Short link Share on other sites
BossBox 14 #286194 Posted August 3, 2015 P.S. я и не знал, что есть кастрированная версия WoT) Нежданчики от картошки xD Quote Share this post Link to post Short link Share on other sites
Redneck 3 #286253 Posted August 3, 2015 Нежданчики от картошки xD Самое интересное что даже здесь они каквсигда. Стабильность! Quote Share this post Link to post Short link Share on other sites
dj3vil 0 #286962 Posted August 9, 2015 Hello, how i can add a Serverside config, so i can send player a notify, an update is arrive. ? Best Wish DJ3vil Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #286964 Posted August 9, 2015 (edited) Hello, how i can add a Serverside config, so i can send player a notify, an update is arrive. ? Best Wish DJ3vil from urllib2 import urlopen text_on_server = urlopen('http://some_url_address.com/text_config.txt').read() Edited June 19, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
dj3vil 0 #286986 Posted August 9, 2015 Ok thanks, will this show up all time ? or can i edit an timeless bzw version number of an mod and so long it will be shown ? Quote Share this post Link to post Short link Share on other sites