Jump to content
Korean Random
SV_Kirov

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

Recommended Posts

а метод скорее всего приватный...

А метод скорее всего на питоне (который вызывает кнопка).

Share this post


Link to post

Short link
Share on other sites

но это не точно)

Но точно можно проверить.

Вообще есть НЯП у окна метод, который вызывается кодом на AS в питон для обработки кнопок. По крайней мере в диалогах это есть.

Питон же как-то узнает, что что-то там нажали :)

Share this post


Link to post

Short link
Share on other sites

Ну раз можно, то зачем гадать?@Ekspoint, нужно больше информации.

мне нужно что бы вызываемоее окно само закрывалось через какое то время

Share this post


Link to post

Short link
Share on other sites

мне нужно что бы вызываемоее окно само закрывалось через какое то время

Ну если делать по-нормальному, нужен таймер в кнопке. А это редактирование флеша 100%.

Share this post


Link to post

Short link
Share on other sites

А с помощью BigWorld.callback не получится?

1. А BigWorld.callback(), для тех кто не особо в курсе, зависит от скорости времени в игре, т.е. при паузе реплея колобки тоже встают на паузу. Поэтому нельзя использовать колобки для графического интерфейса. И вообще, колобки имеют узкую сферу применимости, относительно привязанных к игровому времени вещей, просто нубокодеры пихают их куда не попадя.

2. Для отображения времени до автонажатия на кнопке нужно писать код на AS, а не д***ить флешку по DAAPI из питона. Без отображения времени временами может возникать баттхерт у народа.

3. И вообще вещи нужно делать правильно и аккуратно, а не через *опу.

Share this post


Link to post

Short link
Share on other sites

BigWorld.callback(), для тех кто не особо в курсе, зависит от скорости времени в игре, т.е. при паузе реплея колобки тоже встают на паузу

Колобки так не работают. Для теста сделай такой через 0 и он даже не паузе будет работать, а вот почему угадай сам =)

 

PS по теме

Все что надо парню это

  1. создать callback в методе populate с сохранением ID для своего метода с нужным таймаутом.
  2. закрыть окно из питона (destroy/dispose) при вызове своего метода callback-ом.
  3. отменить callback по ID при закрытии юзером окна вручную.

Это при условиях

  1. своя собственная обвязка окна на питоне (с дефолтной будет некрасиво).
  2. не надо отображать статус таймера визуально.
Edited by POLIROID

Share this post


Link to post

Short link
Share on other sites

Для теста сделай такой через 0 и он даже не паузе будет работать, а вот почему угадай сам =)

"def callback( time, function ):

Registers a callback function to be called after a certain time, but not before the next tick. The callback is executed once and is not automatically repeated, so reset the callback again if regular updates are needed. If multiple callbacks are due to be executed within a single frame, the chronological order in which they were added is maintained.

 

Parameters: time A float describing the delay in seconds before function is called. If a time of 0 is given, then it is guaranteed to be called on the next frame.

function Function to call. This function must take 0 arguments.

 

Returns: int A handle that can be used to cancel the callback."

Это цитата из документации. Ноль, да, на паузе работает, а вот время для колобков на паузе замирает, на задержках тоже тормозится. Как и BigWorld.time().

 

создать callback в методе populate с сохранением ID для своего метода с нужным таймаутом.

Колобок - это в данном случае костыль, по принципу Вовки из известного мультика. Нормальным образом это таймер с флешки.

не надо отображать статус таймера визуально.

А теперь прикинь, ты кликаешь кнопку, в этот момент окно закрывается по колобку - ты думаешь что это ты нажал на нужную кнопку... А нихера подобного.

Вариант 2. У тебя выкинуло окно, а тебя отвлекли или еще что - ты думаешь, окно подождет, потом прочитаю... А нихера.

Если есть таймер - его должно быть видно, чтобы пользователь видел, что оно с таймером, и сколько осталось.

Share this post


Link to post

Short link
Share on other sites

Вы я вижу по теме ни чего не пишите, потому анекдотец жахну:

 

.... А колобок - повесился (><)

  • Downvote 2

Share this post


Link to post

Short link
Share on other sites

Колобок - это в данном случае костыль, по принципу Вовки из известного мультика. Нормальным образом это таймер с флешки. А теперь прикинь, ты кликаешь кнопку, в этот момент окно закрывается по колобку - ты думаешь что это ты нажал на нужную кнопку... А нихера подобного. Вариант 2. У тебя выкинуло окно, а тебя отвлекли или еще что - ты думаешь, окно подождет, потом прочитаю... А нихера. Если есть таймер - его должно быть видно, чтобы пользователь видел, что оно с таймером, и сколько осталось.

Само собой это костыль, и в здравом уме никто так не делает.

Но парень ведь просит костыль на питоне =)

Вот если бы он хотел делать как нормальные люди, тогда на изи все делается через "flash.utils.Timer" и визуально отображается с помощью "LoadingBar" из "guiControlsLogin.swf"

 

А по поводу callback-ов, они работают на гейм-тиках (если человеческим то на каждом кадре).

И писать

зависит от скорости времени в игре, т.е. при паузе реплея колобки тоже встают на паузу

не совсем комильфо =) Edited by POLIROID

Share this post


Link to post

Short link
Share on other sites

они работают на гейм-тиках

Ну я в курсе как-бы, точнее это в доках написано.

не совсем комильфо =)

А вот тут я специально вчера проверял, ставил на паузе реплея колобок на 5 сек через отладчик... и нифига, пока с паузы не снимешь, не сработает. Т.е. колобок работает по игровому времени. BigWorld.time() то же самое, на паузе в реплее оно не увеличивается.

Нулевой, да, срабатывает, так как он, как написано в доках, обработается по следующему фрейму.

Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites

ставил на паузе реплея колобок на 5 сек через отладчик... и нифига, пока с паузы не снимешь, не сработает. Т.е. колобок работает по игровому времени. BigWorld.time() то же самое, на паузе в реплее оно не увеличивается.

Нулевой, да, срабатывает, так как он, как написано в доках, обработается по следующему фрейму.

Я разве говорил что время используется реальное, а не игровое?

Я тебе о том что обработка callback-ов не зависит от того поставлена у тебя пауза или нет, то есть пробежка по всем callback-ам с проверкой готовности и выстрелом происходит на каждом тике (кадре).

 

 

PS вот этот оффтоп, он никак парню с кнопкой не поможет =)

Edited by POLIROID

Share this post


Link to post

Short link
Share on other sites

Здравствуйте. Недавно заинтересовался созданием модов, и создание окна показалось достаточно простым для начала. Но что-то пошло не так.

Что я делал:

1. в FlashDevelop создал AS3 проект, в нём .as файл с содержимым из первого поста (для окна без всего)
2. скопировал содержимое из первого поста в файл .py, скопировал его в проект.
3. скачал XFW отсюда - https://bitbucket.org/XVM/xfw/downloads/ 
4. установил cygwin и запустил скрипт build.sh из папки  .../XVM/src/actionscript/

Получил набор файлов в /XVM/~output/swc:
wg_battle.swc, wg_lobby.swc, wg_shared.swc, wg_vm.swc, xfw.swc, xfw_shared.swc

Файла wg.swc среди них не оказалось
5. добавил все эти файлы в проект в папку lib и в свойствах проекта указал эти файлы как external libraries, на всякий случай дописав туда и wg.swc, потому что это ни на что не повлияло
6. для .as файла поставил галочку напротив Document Class, поскольку без этого проект отказался собираться

7. собрал проект, получил .swf файл, который добавил в папку с игрой в res_mods

Но добавление файла никак не повлияло на работу игры - окно по нажатию F10 не открылось. Подскажите пожалуйста, где я мог допустить ошибку, и если возможно, как я такого рода ошибки могу обнаруживать. 

Share this post


Link to post

Short link
Share on other sites

установил cygwin и запустил скрипт build.sh из папки  .../XVM/src/actionscript/

Можно просто зайти в найтлики и скачать оттуда. И не парится со сборкой.

Share this post


Link to post

Short link
Share on other sites

Добрый день!
Парни не поможите, что не так?

# Embedded file name: mod_clik
import BigWorld
from notification.NotificationListView import NotificationListView
from notification.settings import NOTIFICATION_BUTTON_STATE
from gui.SystemMessages import SM_TYPE
from adisp import process

@process
def openBrowserWindow(url, title):
from gui import game_control
width = 990
height = 550
browserSize = [width, height]
yield game_control.g_instance.browser.load(url=url, title=title, showActionBtn=True, browserSize=browserSize, showCloseBtn=True)

old_populate = NotificationListView._populate

def new_populate(self):
message = {'typeID': 1,
'message': {'bgIcon': '',
'defaultIcon': '',
'savedData': 0,
'timestamp': -1,
'filters': [],
'buttonsStates': {'cancel': NOTIFICATION_BUTTON_STATE.HIDDEN},
'buttonsLayout': [{'action': 'action_1',
'type': 'submit',
'label': '\xd0\x9e\xd1\x82\xd0\xba\xd1\x80\xd1\x8b\xd1\x82\xd1\x8c',
'width': 100}, {'action': 'action_2',
'type': 'cancel',
'label': 'Button 2',
'width': 100}],
'message': '\xd0\x98\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f ModPackSG',
'type': 'black',
'icon': 'img://../icons/SG.png'},
'entityID': 99999,
'auxData': ['GameGreeting']}
old_populate(self)
self.as_appendMessageS(message)

NotificationListView._populate = new_populate
old_onClickAction = NotificationListView.onClickAction

def new_onClickAction(self, typeID, entityID, action):
if action == 'action_1':
openBrowserWindow('https://docviewer.yandex.ru/?url=ya-disk-public%3A%2F%2FzQ%2BixpkQPkBLxjSdk%2B5hLdC1vUIYT%2FnITuvj7140U9A%3D&name=%20information.docx&c=579508c0090d\xd0\x98\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f')
elif action == 'action_2':
print 'action_2'
else:
old_onClickAction(self, typeID, entityID, action)

NotificationListView.onClickAction = new_onClickAction

Работало до версии 0.9.15 (примерно).
Спасибо.

Share this post


Link to post

Short link
Share on other sites

Парни не поможите, что не так?

Не так то, что код нужно оформлять тегом кода, иначе он нечитаемый!

Share this post


Link to post

Short link
Share on other sites


# Embedded file name: mod_clik
import BigWorld
from notification.NotificationListView import NotificationListView
from notification.settings import NOTIFICATION_BUTTON_STATE
from gui.SystemMessages import SM_TYPE
from adisp import process

@process
def openBrowserWindow(url, title):
from gui import game_control
width = 990
height = 550
browserSize = [width, height]
yield game_control.g_instance.browser.load(url=url, title=title, showActionBtn=True, browserSize=browserSize, showCloseBtn=True)


old_populate = NotificationListView._populate

def new_populate(self):
message = {'typeID': 1,
'message': {'bgIcon': '',
'defaultIcon': '',
'savedData': 0,
'timestamp': -1,
'filters': [],
'buttonsStates': {'cancel': NOTIFICATION_BUTTON_STATE.HIDDEN},
'buttonsLayout': [{'action': 'action_1',
'type': 'submit',
'label': '\xd0\x9e\xd1\x82\xd0\xba\xd1\x80\xd1\x8b\xd1\x82\xd1\x8c',
'width': 100}, {'action': 'action_2',
'type': 'cancel',
'label': 'Button 2',
'width': 100}],
'message': '\xd0\x98\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f ModPackSG',
'type': 'black',
'icon': 'img://../icons/SG.png'},
'entityID': 99999,
'auxData': ['GameGreeting']}
old_populate(self)
self.as_appendMessageS(message)


NotificationListView._populate = new_populate
old_onClickAction = NotificationListView.onClickAction

def new_onClickAction(self, typeID, entityID, action):
if action == 'action_1':
openBrowserWindow('https://docviewer.yandex.ru/?url=ya-disk-public%3A%2F%2FzQ%2BixpkQPkBLxjSdk%2B5hLdC1vUIYT%2FnITuvj7140U9A%3D&name=%20information.docx&c=579508c0090d', '\xd0\x98\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f ModPackSG')
elif action == 'action_2':
print 'action_2'
else:
old_onClickAction(self, typeID, entityID, action)


NotificationListView.onClickAction = new_onClickAction

 

Share this post


Link to post

Short link
Share on other sites

Помогите с компонентом UILoaderAlt.

При загрузке изображений через него всегда искажаются их размеры. Если конечно не включить autoSize, но тогда нельзя изменять высоту с шириной, а нужно...

Странно то, что свойства originalWidth и originalHeight всегда 27 и 17.

Edited by Tester

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.

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