-Рубрики

 -Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в seamanmur

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 14.04.2006
Записей:
Комментариев:
Написано: 120


Без заголовка

Вторник, 23 Ноября 2010 г. 09:25 + в цитатник

Взаимодействие AS и US.
1. Как вызвать функцию US из AS.
В том кадре в котором это надо (если надо в нескольких кадрах, то во всех) в начале скрипта вставляем строку:
    import flash.external.ExternalInterface;
Тем самым мы подключаем библиотеку для работы с внешними приложениями.
Сам вызов производится так:
    ExternalInterface.call("OnPressNewGameButton");
В кавычках - имя функции, которая есть в US.
Например при нажатии на кнопку AS "New Game" будет вызываться функция US "OnPressNewGameButton", которая загружает начальный уровень игры консольной командой:
    function OnPressNewGameButton(GFxClikWidget.EventData ev)
    {
        PC.Player.Actor.ConsoleCommand("open Terra1", false);
    }

Ну, естественно в AS нужно на кнопку "New Game" повесить слушателя и связать его с функцией...
"Полный" код AS:
    import gfx.controls.ButtonGroup;
    import flash.external.ExternalInterface;
    function SendNewGameCommand() {
        ExternalInterface.call("OnPressNewGameButton");   
    }
    btn_NewGame.addEventListener("click", this, "SendNewGameCommand");
    stop();

Аналогично добавляем для остальных кнопок меню...
2. Как передать данные из AS в US.
Для начала добавляем на главное меню слой, в котором будем хранить все переменные.
Добавляем в первый кадр скрипт с переменными. Опции лучше всего сделать так:
    if (!options) {
        var options:Object = {};
    }

    var defScreen:Number = 2;
    var defBrightness:Number = 5;
    var defContrast:Number = 5;
    var defGamma:Number = 5;

    var defSpeak:Number = 5;
    var defMusik:Number = 5;
    var defSFX:Number = 5;
    var defAmbient:Number = 5;

    options.selectedScreen = (options.selectedScreen) ? options.selectedScreen : defaultScreen;
    options.Brightness = (options.Brightness) ? options.Brightness : defBrightness;
    options.Contrast = (options.Contrast) ? options.Contrast : defContrast;
    options.Gamma = (options.Gamma) ? options.Gamma : defGamma;

    options.Speak = (options.Speak) ? options.Speak : defSpeak;
    options.Musik = (options.Musik) ? options.Musik : defMusik;
    options.SFX = (options.SFX) ? options.SFX : defSFX;
    options.Ambient = (options.Ambient) ? options.Ambient : defAmbient;

тут мы сначала определили переменную - массив объектов (если ее еще не было). Далее заполнили массив начальными значениями (опять таки если их не было, то дефолтными)...

Выбор разрешения экрана у меня - это степпер CLIK-а, яркость и все остальное - слайдеры.
В кадре где выводится меня выбора опций в акциях добавляем в скрипт:
    stp_Screen.dataProvider = ["800*600", "1024*768", "1280*768", "1280*1024"];
    stp_Screen.selectedIndex = (options.selectedScreen) ? options.selectedScreen : defScreen;

    sld_Brightness.value = (options.Brightness) ? options.Brightness : defBrightness;
    sld_Contrast.value = (options.Contrast) ? options.Contrast : defContrast;
    sld_Gamma.value = (options.Gamma) ? options.Gamma : defGamma;

Здесь определяем набор разрешений экрана (текст, который будет выводиться на степпере) и задаем начальные значения.
Далее на каждую опцию соответствующую функцию:
    function SendBrightness() {
        options.Brightness = sld_Brightness.value;
        ExternalInterface.call("OnChangeGraphic");
    }

Меняем данные, которые может получить US и вызываем функцию US, которая собственно получает эти данные.
Ну и слушатели для каждой опции:
    sld_Brightness.addEventListener("change", this, "SendBrightness");
Разрешение экрана лучше не менять на лету, а менять только при выходе из меню. Т.е. для него функция слегка другая:
    function SendChangeScreen() {
        options.selectedScreen = stp_Screen.selectedIndex;
    }

Нужно еще две функции:
    function SetDefault() {
        stp_Screen.selectedIndex = defScreen;
    -----
        options.Gamma = defGamma;
        ExternalInterface.call("OnChangeGraphic");
    }

Установка опций по умолчанию. И:
    function ReturnToOptionsMenu2() {
        options.selectedScreen = stp_Screen.selectedIndex;
        options.Brightness = sld_Brightness.value + 0.001;
        options.Contrast = sld_Contrast.value + 0.001;
        options.Gamma = sld_Gamma.value + 0.001;
        gotoAndPlay("optionsmenu");
    }

Возврат в главное меню. Тут мы просто устанавливаем данные для получения в US и переходим в главное меню... Почему прибавляем  + 0.001 - не помню уже, но оно надо...
Чтобы в конце US мог получить эти данные при выходе из меню нужно вызвать спецфункцию:
    import flash.external.ExternalInterface;
    ExternalInterface.call("OnCloseAnimationComplete");
    stop();

Это в последнем кадре меню...
Теперь все это нужно в US получить...
Делаем функции:
    function OnChangeGraphic()
    {
        Brightness = 2.f - MainMC.outer.GetVariableNumber("options.Brightness") / 5.f;
        Contrast = 1.05f - MainMC.outer.GetVariableNumber("options.Contrast") / 10.f;
        Gamma = MainMC.outer.GetVariableNumber("options.Gamma") / 10.f;
        ChangeDisplayOption();
    }
    function ChangeDisplayOption()
    {
        local Player PP;
   
        PP = GetLP();
   
        PP.PP_HighlightsMultiplier = PC.PostProcessPresets[0].Highlights * Contrast * Brightness * 2.f;
        PP.PP_MidTonesMultiplier = PC.PostProcessPresets[0].MidTones * Brightness;
        PP.PP_ShadowsMultiplier = PC.PostProcessPresets[0].Shadows * ( 1.f - Contrast ) * Brightness * 2.f;
        PC.SetGamma(Gamma);
    }

.outer.GetVariableNumber - получает число от AS. MainMC - это GFxObject, который мы получили в функции Start так:
    MainMC = GetVariableObject("_root");
Яркость воздействует сразу на все тона картинки, контраст только на светлые тона и тени, увеличивая "расстояние" между ними.
Для громкости:
    function OnChangeAudio()
    {
        SoundSpeak = MainMC.outer.GetVariableNumber("options.Speak") / 10.f;
        SoundMusik = MainMC.outer.GetVariableNumber("options.Musik") / 10.f;
        SoundSFX = MainMC.outer.GetVariableNumber("options.SFX") / 10.f;
        SoundAmbient = MainMC.outer.GetVariableNumber("options.Ambient") / 10.f;
        ChangeAudioOption();
    }
    function ChangeAudioOption()
    {
        PC.SetAudioGroupVolume( 'SFX', SoundSFX );
        PC.SetAudioGroupVolume( 'Dialog', SoundSpeak );
        PC.SetAudioGroupVolume( 'Announcer', SoundSpeak );
        PC.SetAudioGroupVolume( 'Music', SoundMusik );
        PC.SetAudioGroupVolume( 'Ambient', SoundAmbient );
    }

 / 10.f - т.к. значения слайдера меняются от 0 до 10, а в US от 0 до 1.
PC - это UTPlayerController :
    var UTPlayerController PC;
    function bool Start()
    {
    ...
    PC = UTPlayerController(GetPC());
    ...
    }

Ну и разрешение экрана:
    function OnCloseAnimationComplete()
    {
        ScreenRes = MainMC.outer.GetVariableNumber("options.selectedScreen");
        switch(ScreenRes)
        {
            case 0:
                UT_ConsoleCommand("setres 800x600x32xw", true);
                break;
            case 1:
                UT_ConsoleCommand("setres 1024x768x32xw", true);
                break;
            case 2:
                UT_ConsoleCommand("setres 1280x768x32xw", true);
                break;
            case 3:
                UT_ConsoleCommand("setres 1280x1024x32xw", true);
                break;
            default:
                break;
        }
        UTGFxHudWrapper(GetPC().MyHUD).CompletePauseMenuClose();
    }


Передать в AS данные аналогично, только SetVariableNumber. Подробно пока писать не буду - закопался в DataProvider... Если кто видел нормальные уроки/описания по нему - укажите плиз...

Также еще один вопрос - по звукам в GFx меню. Как привязать звуки к нему я нашел:
Нужно просто в defaultproperties указать:
    SoundThemes(0)=(ThemeName=default,Theme=UISoundTheme'UDKFrontEnd.Sound.SoundTheme')
Тут я использовал стандартные звуки УДК, но можно создать свою тему.

3. Где все это прописывать

В UTGFxHudWrapper есть функция TogglePauseMenu - там прописано создание нового объекта класса меню
    PauseMenuMovie = new class'GFxUI_PauseMenu';

И установка его свойств. Там напрямую прописан клип, который вызывается по команде ShowMenu, забинденной на клавишу Esc.
Наследуешься от этого класса, прописываешь свой клип (Ну или просто в нем исправляешь на свой). После чего он будет вызываться при нажатии Esc. Ну а зная все это можно вызвать клип и любом другом случае...
Соответственно там прекрасно видно как обращаться с классом GFxUI_PauseMenu...
Вот в этом самом GFxUI_PauseMenu и прописаны все функции взаимодействия с AS, про которые я писал.

А вообще класс GFxMoviePlayer очень хорошо описан тут:
UDN
Там же ниже написано как вызывать функции AS из US и наоборот...

А вот как заставить УДК в меню воспроизводить музыку/ амбиент звуки/речь. Я найти не могу. Простое добавление:
    PC.ClientPlaySound(MenuMusic);
в лучшем случае включает музыку после выхода из меню. В самом меню музыки нет. Поэтому меняешь громкость музыки "на глазок". Она меняется, но насколько можно узнать, только выйдя из меню. Это ненормально!

На УДН по ссылке выше есть код для вызова звука из AS:

    if( _global.gfxProcessSound )
    {
         _global.gfxProcessSound(this, "SoundThemeName", "SoundEventName");
    }

Однако у меня это не работает - звук начинает проигрываться только после выхода из меню (GFxMoviePlayer)...
Кто сможет решить эту проблему?!?

Рубрики:  3ds/UDK
Метки:  

seamanmur   обратиться по имени Решение проблемы со звуком Четверг, 25 Ноября 2010 г. 10:40 (ссылка)
Нужно просто изменить класс SoundCue.
Правой кнопкой на SoundCue - выбрать Sound classes => SFX => UI. Тогда он будет звучать и в меню...
Путем экспериментов я выяснил, что чтобы музыка оставалась музыкой, но звучала в меню нужно выбирать:
Sound classes => Music => Option
Ответить С цитатой В цитатник
 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку