Jump to content
Korean Random
SV_Kirov

Как создать форму(Окно) в ангаре

Recommended Posts

А ничего что это команда на деструкт вьюшки? Что она ее убивает. Вот она и пропадает. А чтобы она появилась в другом виде где-то, нужно подумать как туда добавить, и как связать активность. На въюшках директ колл не прокатит (я не знаю полного пути до объекта, а создавать левые ссылки на объекты GUI и отсылать тем самым удаление объекта на уборщик мусора очень нехорошо, ибо будут баги), так что либо эвенты с добавлением листенера на популейт и удалением на деструкт (вроде картоха так делает), либо слабые ссылки (тут уже вопрос с их контролем). Как вариант, можно определить работу объекта через враппер (который и будет прибираться), но тогда с ним (объектом) не очень удобно будет работать.

Человек первый раз на AS3 пишет, а ты!

Share this post


Link to post

Short link
Share on other sites

Человек первый раз на AS3 пишет, а ты!

А я про Питон.

Share this post


Link to post

Short link
Share on other sites

Добавляем к классу 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

Share this post


Link to post

Short link
Share on other sites
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 by SV_Kirov

Share this post


Link to post

Short link
Share on other sites

Все ясно! У меня такая же ошибка была.

Нужно после _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
 
 

Share this post


Link to post

Short link
Share on other sites

То есть должно получиться:

нет не так

Нужно из флешки отправить сигнал на старт функции

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 by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

Теперь ошибки тут

 

 

*** 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

Share this post


Link to post

Short link
Share on other sites

А чем вариант с populate плох? Флешка типа не успеет прогрузиться? И почему _isDAAPIInited не блочит вызов к DAAPI в такой ситуации?

Интересно, как связаны вызовы ключевых методов вьюшки в питоне и во флеше, а то как-то не совсем понятно, что и когда вызывается, особенно во флеше. В питоне еще более менее понятно, populate / destroy, обработчики событий на закрытие и свертывание окна... А вот во флеше - вопрос. Смысл методов понятен и названий по большому счету, а вот при каких условиях они вызываются - не совсем. Жаль нормальных доков на эту тему нет(

Share this post


Link to post

Short link
Share on other sites

Теперь ошибки тут

Попробуй посмотреть список атрибутов 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 by GPCracker

Share this post


Link to post

Short link
Share on other sites

Хы, понял где косяку меня было так:

      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 by SV_Kirov

Share this post


Link to post

Short link
Share on other sites

Т.е. я могу забацать 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 by ShadowHunterRUS
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

P.S. я и не знал, что есть кастрированная версия WoT)

 

Нежданчики от картошки xD

Share this post


Link to post

Short link
Share on other sites

Нежданчики от картошки xD

 

Самое интересное что даже здесь они каквсигда. Стабильность!

Share this post


Link to post

Short link
Share on other sites

Hello,

 

how i can add a Serverside config, so i can send player a notify, an update is arrive. ?

 

Best Wish

DJ3vil

Share this post


Link to post

Short link
Share on other sites

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 by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

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 ? 

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...