Jump to content
Korean Random
SV_Kirov

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

Recommended Posts

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

Интуиция мне подсказывает, что это какой-то специфичный компонент. А UILoader не пробовал?

Share this post


Link to post

Short link
Share on other sites

Интуиция мне подсказывает, что это какой-то специфичный компонент. А UILoader не пробовал?

 

Мой косяк... Нужно было отключить сохранение пропорций (maintainAspectRatio), он ведь включен по умолчанию. Правда при включенном остается проблема искажения, так как по умолчанию ставится размер 27х17 и соответственно от него устанавливаются пропорции. Странно, что после загрузки разрабы не обновляют переменные с оригинальными размерами.

Edited by Tester

Share this post


Link to post

Short link
Share on other sites

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

Ничего странного, это картошка.

Share this post


Link to post

Short link
Share on other sites
Парни не поможите, что не так? Работало до версии 0.9.15

 

Пример:

'mod_Test.py'

#===============================================================================================
# Константы
#===============================================================================================

widthBW = 1000
heightBW = 600

#===============================================================================================
# Создание функции вызова окна встроенного браузера
#===============================================================================================

from adisp import process
from helpers import dependency
from skeletons.gui.game_control import IBrowserController

class BrowserWindow(object):

    @process
    def openBrowserWindow(self, url, title, browserID): 
        global widthBW, heightBW
        width = int(widthBW)
        height = int(heightBW)
        browserSize = [width, height]
        browserCtrl = dependency.instance(IBrowserController) 
        yield browserCtrl.load(url=url, title=title, browserID=browserID, browserSize=browserSize, showActionBtn=True, showCloseBtn=True, showWaiting=True)

g_browserWindow = BrowserWindow()

#===============================================================================================
# Создание окна в центре уведомлении с кнопкой
#===============================================================================================

import BigWorld
from notification.NotificationListView import NotificationListView
from notification.settings import NOTIFICATION_BUTTON_STATE
    
def messages():
    return {
        'typeID': 1,
        'message': {
            'bgIcon': '',
            'defaultIcon': '',
            'savedData': 0,
            'timestamp': -1,
            'filters': [],
            'buttonsStates': {'cancel': NOTIFICATION_BUTTON_STATE.HIDDEN},
            'buttonsLayout': [
                {
                    'action': 'action_1',
                    'type': 'submit',
                    'label': u'Кнопка 1',
                    'width': 80
                },
                {
                    'action': 'action_2',
                    'type': 'submit',
                    'label': u'Кнопка 2',
                    'width': 80
                }
            ],
            'type': 'black',
            'icon': '',
            'message': 'Пример - переход по ссылке',
        },
        'entityID': 99999,
        'auxData': ['GameGreeting']
    }

orig_getMessagesList = NotificationListView._NotificationListView__getMessagesList

def custom_getMessagesList(self):
    result = orig_getMessagesList(self)
    if self._NotificationListView__currentGroup in 'info':
        result.append(messages())
    return result

orig_onClickAction = NotificationListView.onClickAction

def custom_onClickAction(self, typeID, entityID, action):
    if action == 'action_1':
        BigWorld.wg_openWebBrowser('https://worldoftanks.ru/')
    elif action == 'action_2':
        g_browserWindow.openBrowserWindow("https://koreanrandom.com/forum/", "Koreanrandom", "99999")
    else:
        orig_onClickAction(self, typeID, entityID, action)

NotificationListView._NotificationListView__getMessagesList = custom_getMessagesList
NotificationListView.onClickAction = custom_onClickAction

Edited by night_dragon_on
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

пример можно, если не сложно?

import net.wg.gui.components.advanced.FieldSet;

addChild(App.utils.classFactory.getComponent("FieldSet", FieldSet, {label: 'text', x: 0, y: topPadding, width: 220, height: 170}));

Edited by IzeBerg

Share this post


Link to post

Short link
Share on other sites
sldr = new Slider();
sldr.x = 50;
sldr.y = 50;
sldr.width = 100;
sldr.height = 25;
sldr.value = 10;
sldr.maximum = 23;
sldr.minimum = 0;			
addChild(sldr);

что не так? почему даже не показывает слайдер?

 

UPD: вопрос снят. решил вот так
 

sldr = addChild(App.utils.classFactory.getComponent("Slider", Slider, {
                width: 100,
                height: 25,
                minimum: 0,
				maximum: 0,
				x: 10,
                y: 10
            })) as Slider;

 

Вопрос #2:
как навесить листенер.

 

попробовал вот так:

sldr.addEventListener(SliderEvent.VALUE_CHANGE, this.onChangeSldr);

...

public function onChangeSldr(event:SliderEvent){
	this.myFunction(this.sldr.value); 
}

 

Edited by CyToTV

Share this post


Link to post

Short link
Share on other sites
Только что, CyToTV сказал:

sldr = new Slider();
sldr.x = 50;
sldr.y = 50;
sldr.width = 100;
sldr.height = 25;
sldr.value = 10;
sldr.maximum = 23;
sldr.minimum = 0;			
addChild(sldr);

что не так? почему даже не показывает слайдер?

Потому что классы scaleform.clik.controls.Slider и net.wg.gui.components.controls.Slider - это интерфейсы для взаимодействия с UI.

Сам UI реализован например в классе Slider в guiControlsLobbyBattle.swf (импортится в лобби вроде бы).

 

Вот это должно работать, но это не точно:

sldr = App.utils.classFactory.getComponent("Slider", Slider, {x: 50, y: 50, width: 100, height: 25, value:10, minimum: 23, maximum:0});
addChild(sldr);

 

Share this post


Link to post

Short link
Share on other sites
2 минуты назад, IzeBerg сказал:

Потому что классы scaleform.clik.controls.Slider и net.wg.gui.components.controls.Slider - это интерфейсы для взаимодействия с UI.

Сам UI реализован например в классе Slider в guiControlsLobbyBattle.swf (импортится в лобби вроде бы).

 

Вот это должно работать, но это не точно:


sldr = App.utils.classFactory.getComponent("Slider", Slider, {x: 50, y: 50, width: 100, height: 25, value:10, minimum: 23, maximum:0});
addChild(sldr);

 

все спасибо, разобрался.

это, второй вопрос снимается. там maximum: 0

Share this post


Link to post

Short link
Share on other sites

Кажется,  пример mod_TestWindow.py с первой страницы не работает. Ничего не менял, окно в ангаре не создаётся. В лог питона вылетает ошибка

2017-09-27 16:55:03.038: ERROR: [EXCEPTION] (scripts/common/Event.py, 46):
Traceback (most recent call last):
  File "scripts/common/Event.py", line 44, in __call__
  File "res_mods\mod_TestWindow.py", line 32, in onhandleKeyEvent
    g_appLoader.getDefLobbyApp().loadView(_alias)
  File "scripts/client/gui/Scaleform/framework/application.py", line 325, in loadView
  File "scripts/client/gui/Scaleform/framework/managers/containers.py", line 1014, in load
AttributeError: 'str' object has no attribute 'viewKey'

Кроме того, при загрузке игры в логи вылетает вот такое (не факт, что имеет отношение к вопросу)

2017-09-27 16:54:41.646: WARNING: [WARNING] (scripts/client/gui/Scaleform/framework/managers/containers.py, 1213): Loading of view Hangar[0x2b04a170]=[key=ViewKey[alias=hangar, name=hangar], scope=SimpleScope[0x1bb911d0]=[scopeType=subView, parentScope=SimpleScope[0x1bb91150]=[scopeType=view, parentScope=GlobalScope[0x1bb91110]=[scopeType=global, parentScope=None]]], state=0] is requested but the container subView is still not exist!

 

Edited by John_Nash

Share this post


Link to post

Short link
Share on other sites
Только что, John_Nash сказал:

Кажется,  пример mod_TestWindow.py с первой страницы не работает. Ничего не менял, окно в ангаре не создаётся. В лог питона вылетает ошибка

 

Ну клиент игры то обновляется же, а примеры нет. Функцию loadView изменили в 0.9.20.

Share this post


Link to post

Short link
Share on other sites

Спасибо -- уфф, отлегло, испугался было, что сам незаметно накосячил. Куда теперь копать, чтобы обратно заработало?

 

Или, может, появились более легкие способы создавать окно в ангаре? Стандартная же задача.

 

Update: нашел таки костыль, для ангара: надобно импортировать

from gui.Scaleform.framework.managers.loaders import ViewLoadParams

а потом заменить

loadView(_alias)

на

loadView(ViewLoadParams(_alias, None))
Edited by John_Nash

Share this post


Link to post

Short link
Share on other sites
В 27.09.2016 в 19:52, POLIROID сказал:

Вот такой грязный фикс поможет с доступностью любого WG контрола в любом месте (буть то бой/ангар/экран логина)

 

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

 

Что то никак не выходит разобраться...

Например, пытаюсь использовать "в бою" любой контрол из guiControlsLobby.swf: ошибок нет, но и контролов на сцене нет.

В лобби все отображается правильно.

 

import net.wg.infrastructure.events.LibraryLoaderEvent;

// -------------

App.instance.loaderMgr.loadLibraries(Vector.<String>([
	"guiControlsLobby.swf", 
	"guiControlsLobbyBattle.swf", 
	"guiControlsLobbyBattleDynamic.swf", 
	"guiControlsLobbyDynamic.swf", 
	"guiControlsLogin.swf", 
	"guiControlsLoginBattle.swf", 
	"guiControlsLoginBattleDynamic.swf"
]));
			
App.instance.loaderMgr.addEventListener(LibraryLoaderEvent.LOADED_COMPLETED, onLoadedCompleted, false, 0, true);

// -------------

private function onLoadedCompleted() : void
{			
	// тут код создания, настройки и добавления контрола на сцену
}

 

 

Share this post


Link to post

Short link
Share on other sites
8 часов назад, Steeler сказал:

 

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

 

Что то никак не выходит разобраться...

Например, пытаюсь использовать "в бою" любой контрол из guiControlsLobby.swf: ошибок нет, но и контролов на сцене нет.

В лобби все отображается правильно.

 


import net.wg.infrastructure.events.LibraryLoaderEvent;

// -------------

App.instance.loaderMgr.loadLibraries(Vector.<String>([
	"guiControlsLobby.swf", 
	"guiControlsLobbyBattle.swf", 
	"guiControlsLobbyBattleDynamic.swf", 
	"guiControlsLobbyDynamic.swf", 
	"guiControlsLogin.swf", 
	"guiControlsLoginBattle.swf", 
	"guiControlsLoginBattleDynamic.swf"
]));
			
App.instance.loaderMgr.addEventListener(LibraryLoaderEvent.LOADED_COMPLETED, onLoadedCompleted, false, 0, true);

// -------------

private function onLoadedCompleted() : void
{			
	// тут код создания, настройки и добавления контрола на сцену
}

 

 

Как создаете и добавляете контрол?

Share this post


Link to post

Short link
Share on other sites
11 минуту назад, IzeBerg сказал:

Как создаете и добавляете контрол?

 

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

import net.wg.gui.components.advanced.TextAreaSimple;

// --------------

var textArea : TextAreaSimple = addChild(App.utils.classFactory.getComponent("TextAreaSimple", TextAreaSimple, {
	x: 		10,
	y: 		10,
	width: 		300,
	height: 	100,
	showBgForm: 	true,
	scrollBar: 	"ScrollBar",
	text: 		"Example TextAreaSimple"
})) as TextAreaSimple;

 

Share this post


Link to post

Short link
Share on other sites

Трудно мне дается AS3, но кажется разобрался с причиной.

А суть в том, что классы некоторых контролов находятся только в lobby.swf, и в бою (при загруженной battle.swf) соответственно недоступны, так как флешка ангара выгружена.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
8 hours ago, Steeler said:

А суть в том, что классы некоторых контролов находятся только в lobby.swf, и в бою (при загруженной battle.swf) соответственно недоступны, так как флешка ангара выгружена.

Так все библиотечные элементы есть в SWC файлах картохи. А содержимое, в плане какие классы там имеются, можно без проблем посмотреть в том же FlashDevelop.

Share this post


Link to post

Short link
Share on other sites

Hi,I have a question.

I want to display Scroll Bar in DropDownMenu.

And I want to specify an item from an external file on DropDownMenu.

How can I make it work?

Here is My Current Code.

package
{
	App.instance.loaderMgr.loadLibraries(Vector.<String>([
		"guiControlsLobbyBattle.swf"
	]));
	App.utils.classFactory.getComponent("DropdownMenuUI", DropdownMenu);
	import net.wg.gui.components.controls.DropdownMenu;
    import net.wg.infrastructure.base.AbstractWindowView;
    import net.wg.gui.components.controls.SoundButton;
    import flash.text.*;
	import scaleform.clik.data.DataProvider;

    public class Main extends AbstractWindowView
    {
        private var soundButtonLoad		: SoundButton;
        private var soundButtonCancel	: SoundButton;
        private var textFieldTest		: TextField;
		private var ddMenu				: DropdownMenu;
		

        public function Main()
        {
            super();
        }

        override protected function onPopulate() : void
        {
            super.onPopulate();
            width = 600;
            height = 400;
            window.title = "Test Window";
			var data : Array = new Array();
			data.push( { "label":"00_tank_tutorial" } );
			data.push( { "label":"01_karelia" } );
			data.push( { "label":"02_malinovka" } );
			data.push( { "label":"04_himmelsdorf" } );
			data.push( { "label":"05_prohorovka" } );
			data.push( { "label":"06_ensk" } );
			data.push( { "label":"07_lakeville" } );
			data.push( { "label":"08_ruinberg" } );
			data.push( { "label":"10_hills" } );
			data.push( { "label":"11_murovanka" } );
			data.push( { "label":"13_erlenberg" } );
			data.push( { "label":"14_siegfried_line" } );
			data.push( { "label":"17_munchen" } );
			data.push( { "label":"18_cliff" } );
			data.push( { "label":"19_monastery" } );
			data.push( { "label":"22_slough" } );
			data.push( { "label":"23_westfield" } );
			data.push( { "label":"28_desert" } );
			data.push( { "label":"29_el_hallouf" } );
			data.push( { "label":"31_airfield" } );
			data.push( { "label":"33_fjord" } );
			data.push( { "label":"34_redshire" } );
			data.push( { "label":"35_steppes" } );
			data.push( { "label":"36_fishing_bay" } );
			data.push( { "label":"37_caucasus" } );
			data.push( { "label":"38_mannerheim_line" } );
			data.push( { "label":"44_north_america" } );
			data.push( { "label":"45_north_america" } );
			data.push( { "label":"47_canada_a" } );
			data.push( { "label":"63_tundra" } );
			data.push( { "label":"73_asia_korea" } );
			data.push( { "label":"83_kharkiv" } );
			data.push( { "label":"84_winter" } );
			data.push( { "label":"86_himmelsdorf" } );
			data.push( { "label":"92_starlingrad" } );
			data.push( { "label":"95_lost_city" } );
			data.push( { "label":"96_prohorovka_defence" } );
			data.push( { "label":"100_thepit" } );
			data.push( { "label":"101_dday" } );
			data.push( { "label":"103_ruinberg_winter" } );
			data.push( { "label":"112_eiffel_tower_ctf" } );
			data.push( { "label":"114_czech"} );
			data.push( { "label":"120_kharkiv_halloween" } );
			data.push( { "label":"212_epic_random_valley" } );
			data.push( { "label":"h03_shopfest_2015" } );
			data.push( { "label":"hangar_bootcamp" } );
			data.push( { "label":"hangar_halloween_v2" } );
			data.push( { "label":"hangar_kharkiv_halloween" } );
			data.push( { "label":"hangar_premium_v2" } );
			data.push({"label":"hangar_v2"});
			var dataProv : DataProvider = new DataProvider(data);
			
			textFieldTest = new TextField();
            textFieldTest.width = 590;
            textFieldTest.height = 360;
            textFieldTest.x = 20;
            textFieldTest.y = 15;
            textFieldTest.multiline = true;
            textFieldTest.selectable = false;
            textFieldTest.defaultTextFormat = new TextFormat("$FieldFont", 20, 0xEA4517);
			textFieldTest.text = "If You Select Map Name and Push 'Load' Button, it will load Map.";
			addChild(textFieldTest);
			ddMenu = addChild(App.utils.classFactory.getComponent("DropdownMenuUI", DropdownMenu, {
				x: 20,
				y: 40,
				width: 200,
				itemRenderer: "DropDownListItemRendererSound",
				dropdown: "DropdownMenu_ScrollingList",
				menuRowCount: dataProv.length,
				//rowCount:rows,
				//scrollBar:scrBar,
				dataProvider: dataProv,
				selectedIndex: 0
			})) as DropdownMenu;

            soundButtonLoad = addChild(App.utils.classFactory.getComponent("ButtonRed", SoundButton, {
                width: 100,
                height: 25,
                x: 195,
                y: 365,
                label: "Load"
            })) as SoundButton;

            soundButtonCancel = addChild(App.utils.classFactory.getComponent("ButtonNormal", SoundButton, {
                width: 100,
                height: 25,
                x: 305,
                y: 365,
                label: "Cancel"
            })) as SoundButton;
        }
    }
}

 

image.png

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