1. Как вызвать функцию US из AS.В том кадре в котором это надо (если надо в нескольких кадрах, то во всех) в начале скрипта вставляем строку:
Тем самым мы подключаем библиотеку для работы с внешними приложениями.
Сам вызов производится так:
Код: Выделить всё
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 так:
Яркость воздействует сразу на все тона картинки, контраст только на светлые тона и тени, увеличивая "расстояние" между ними.
Для громкости:
Код: Выделить всё
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... Если кто видел нормальные уроки/описания по нему - укажите плиз...
Как привязать звуки к нему?
Нужно просто в defaultproperties указать:
Код: Выделить всё
SoundThemes(0)=(ThemeName=default,Theme=UISoundTheme'UDKFrontEnd.Sound.SoundTheme')
Тут я использовал стандартные звуки УДК, но можно создать свою тему.
А вот как заставить УДК в меню воспроизводить музыку/ амбиент звуки/речь? Я найти не могу. Простое добавление:
в лучшем случае включает музыку после выхода из меню. В самом меню музыки нет. Поэтому меняешь громкость музыки "на глазок". Она меняется, но насколько можно узнать, только выйдя из меню. Это ненормально!
Кто сможет решить эту проблему?!?