Luna | Дата: Суббота-Loredas, 30.06.2012, 13:30 | Сообщение # 1 |
Министр Иносайтных дел
Группа: Администраторы
Сообщений: 16776
Награды: 155
Статус: Выехал
| Возможно, кому-то пригодится этот перевод, как когда-то я искала хоть что-то о функциях ввода текста. Ссылки на оригиналы статей приведены, авторский скрипт - в прокрутке. Чуть позже приведу более простой пример использования функций ввода. Моя благодарность AleksTirex'у, который проверил и отредактировал этот перевод
Функции ввода текста в OBSE
http://cs.elderscrolls.com/index.php?title=Text_Input_With_OBSE Text Input With OBSE Этот код будет принимать ввод текста с клавиатуры от игрока, а также отображать текст в MessageBox. Требование: Extender Oblivion Script (OBSE) версии 0014 или выше.
Скрипт сохраняет строку в название объекта, для этого Вам необходим сам объект, определенный для этой цели. Этот объект может быть любым, который имеет имя и возможность быть активированным, желательно активатор. Строка должна иметь начальное значение, которое заканчивается знаком акцента (`). Я использовал " `Ввести название `". Чтобы использовать любое свое название, скрипт должен быть изменен в пяти местах - и у этих пяти мест это имя должно быть одинаковым. Эти пять мест были отмечены с комментариями "!!! INIT NAME!!! '". Дополнительно, в двух из этих мест у названия должна быть замыкающая тильда (~). Эти места были отмечены "w/~", а другие три были отмечены "w/o ~". Имя не может быть "`~~`", если не изменить места, где эта строка используется в скрипте (в шести местах). Кроме того, Вам необходим активатор, чтобы прикрепить к нему скрипт. Этот активатор должен быть размещен в мире, чтобы игрок мог активировать его, а так же он может быть активирован другим скриптом через RefID.
Недостатки: Как говорилось выше, у вводимого имени имеются некоторые специальные правила. Скрипт поддерживает только латинские буквы, пробелы, тире и апостроф. Поддержка дополнительных символов относительно проста, но имейте в виду, что вам придется делать это самостоятельно, если вы захотите этого. Кроме того, Caps Lock игнорируется. Учитывая, что он обычно используется для работы, то поддержка Caps Lock может быть добавлена в скрипт с минимальными усилиями. Наконец, невозможно поддерживать знак акцента (`), тильды (~), точки с запятой (; ) или двойных кавычек (").
Сопутствующие функции.
С этим кодом используются следующие функции: GameMode OnActivate Activate SetName ModName AppendToName OnKeyDown IsKeyPressed3 MessageBoxEX Message GetButtonPressed
Рекомендуется, чтобы у Вас было некоторое представление о том, что эти функции делают и как они работают.
Использование скрипта.
В текстовом поле будет отображаться запись, когда объект, на котором висит скрипт, будет активирован. Активировать можно как сам объект, так и через другой активатор посредством кода: ActivatorRef.Activate player 1
Заключительные комментарии.
Этот код был тщательно протестирован, и должен работать, если Вы указали String_Var для нужного объекта. Пояснение переводчика: String_Var - переменная строка, в которой будет храниться введенная информация. Для удобства ее добавляют в блок объявленных переменных.
Пример использования функций
Код scn TextInputBox ; Object script, goes on an Activator
short state short caps short button
ref StringVar
short bConsole
Begin GameMode
if ( state ) Activate player 1 endif
End
Begin MenuMode
if ( state ) Activate player 1 endif
End
Begin OnActivate
if ( state == 0 ) OnKeyDown 57 ; clears the counter from the initial press when activating the item GetButtonPressed ; clears the counter as well if ( StringVar == 0 ) set StringVar to INSERT_NAME_STORAGE_OBJECT_ID_HERE ; this is where your string gets stored endif SetName "`Enter Name`~" StringVar ; !!!INIT NAME!!! w/ ~ set state to 1
elseif ( state == 1 ) ModName "~|" StringVar MessageBoxEx "%n|Done" StringVar ; the specific text can be changed to meet your needs ModName "`Enter Name`|" StringVar ; !!!INIT NAME!!! w/o ~ AppendToName "~" StringVar set state to 2
elseif ( state == 2 ) ; first, standard MessageBox menu stuffs set button to GetButtonPressed + 1 if ( button ) ; pressed Done set state to 3 return endif
; check for Console if ( OnKeyDown 41 ) set bConsole to bConsole == 0 ; toggle bConsole endif
if ( bConsole ) return ; return if in the Console (the rest of the commands break the Console) endif
; now String-capturing code set caps to 0 if ( IsKeyPressed3 42 ) || ( IsKeyPressed3 54 ) ; either Shift key set caps to 1 endif
if ( OnKeyDown 16 ) if ( caps ) ModName "~|Q~" StringVar else ModName "~|q~" StringVar endif set state to 1 elseif ( OnKeyDown 17 ) if ( caps ) ModName "~|W~" StringVar else ModName "~|w~" StringVar endif set state to 1 elseif ( OnKeyDown 18 ) if ( caps ) ModName "~|E~" StringVar else ModName "~|e~" StringVar endif set state to 1 elseif ( OnKeyDown 19 ) if ( caps ) ModName "~|R~" StringVar else ModName "~|r~" StringVar endif set state to 1 elseif ( OnKeyDown 20 ) if ( caps ) ModName "~|T~" StringVar else ModName "~|t~" StringVar endif set state to 1 elseif ( OnKeyDown 21 ) if ( caps ) ModName "~|Y~" StringVar else ModName "~|y~" StringVar endif set state to 1 elseif ( OnKeyDown 22 ) if ( caps ) ModName "~|U~" StringVar else ModName "~|u~" StringVar endif set state to 1 elseif ( OnKeyDown 23 ) if ( caps ) ModName "~|I~" StringVar else ModName "~|i~" StringVar endif set state to 1 elseif ( OnKeyDown 24 ) if ( caps ) ModName "~|O~" StringVar else ModName "~|o~" StringVar endif set state to 1 elseif ( OnKeyDown 25 ) if ( caps ) ModName "~|P~" StringVar else ModName "~|p~" StringVar endif set state to 1 elseif ( OnKeyDown 30 ) if ( caps ) ModName "~|A~" StringVar else ModName "~|a~" StringVar endif set state to 1 elseif ( OnKeyDown 31 ) if ( caps ) ModName "~|S~" StringVar else ModName "~|s~" StringVar endif set state to 1 elseif ( OnKeyDown 32 ) if ( caps ) ModName "~|D~" StringVar else ModName "~|d~" StringVar endif set state to 1 elseif ( OnKeyDown 33 ) if ( caps ) ModName "~|F~" StringVar else ModName "~|f~" StringVar endif set state to 1 elseif ( OnKeyDown 34 ) if ( caps ) ModName "~|G~" StringVar else ModName "~|g~" StringVar endif set state to 1 elseif ( OnKeyDown 35 ) if ( caps ) ModName "~|H~" StringVar else ModName "~|h~" StringVar endif set state to 1 elseif ( OnKeyDown 36 ) if ( caps ) ModName "~|J~" StringVar else ModName "~|j~" StringVar endif set state to 1 elseif ( OnKeyDown 37 ) if ( caps ) ModName "~|K~" StringVar else ModName "~|k~" StringVar endif set state to 1 elseif ( OnKeyDown 38 ) if ( caps ) ModName "~|L~" StringVar else ModName "~|l~" StringVar endif set state to 1 elseif ( OnKeyDown 44 ) if ( caps ) ModName "~|Z~" StringVar else ModName "~|z~" StringVar endif set state to 1 elseif ( OnKeyDown 45 ) if ( caps ) ModName "~|X~" StringVar else ModName "~|x~" StringVar endif set state to 1 elseif ( OnKeyDown 46 ) if ( caps ) ModName "~|C~" StringVar else ModName "~|c~" StringVar endif set state to 1 elseif ( OnKeyDown 47 ) if ( caps ) ModName "~|V~" StringVar else ModName "~|v~" StringVar endif set state to 1 elseif ( OnKeyDown 48 ) if ( caps ) ModName "~|B~" StringVar else ModName "~|b~" StringVar endif set state to 1 elseif ( OnKeyDown 49 ) if ( caps ) ModName "~|N~" StringVar else ModName "~|n~" StringVar endif set state to 1 elseif ( OnKeyDown 50 ) if ( caps ) ModName "~|M~" StringVar else ModName "~|m~" StringVar endif set state to 1 elseif ( OnKeyDown 12 ) if ( caps ) ModName "~|_~" StringVar else ModName "~|-~" StringVar endif set state to 1 elseif ( OnKeyDown 57 ) ModName "~| ~" StringVar set state to 1 elseif ( OnKeyDown 40 ) ; CANNOT type double-quote mark ModName "~|'~" StringVar set state to 1
elseif ( OnKeyDown 14 ) ; Backspace Label 0
ModName "q~|" StringVar ModName "w~|" StringVar ModName "e~|" StringVar ModName "r~|" StringVar ModName "t~|" StringVar ModName "y~|" StringVar ModName "u~|" StringVar ModName "i~|" StringVar ModName "o~|" StringVar ModName "p~|" StringVar ModName "a~|" StringVar ModName "s~|" StringVar ModName "d~|" StringVar ModName "f~|" StringVar ModName "g~|" StringVar ModName "h~|" StringVar ModName "j~|" StringVar ModName "k~|" StringVar ModName "l~|" StringVar ModName "z~|" StringVar ModName "x~|" StringVar ModName "c~|" StringVar ModName "v~|" StringVar ModName "b~|" StringVar ModName "n~|" StringVar ModName "m~|" StringVar ModName "-~|" StringVar ModName "_~|" StringVar ModName " ~|" StringVar ModName "'~|" StringVar ModName " ~|" StringVar AppendToName "~" StringVar ModName "~~|~" StringVar
ModName "|`~~`" StringVar ModName "`~~`~|`Enter Name`~" StringVar ; !!!INIT NAME!!! w/ ~ ModName "`~~`|" StringVar
if ( IsKeyPressed3 29 ) || ( IsKeyPressed3 157 ) ; Ctrl+Delete deletes an entire word. if ( CompareName " ~" StringVar != 1 ) if ( CompareName "`Enter Name`" StringVar != 1 ) ; !!!INIT NAME!!! w/o ~ Goto 0 endif endif endif
set state to 1
elseif ( OnKeyDown 28 ) ; Enter - ends menu same as Done set state to 3
endif
elseif ( state == 3 ) ModName "|`~~`" StringVar if ( CompareName "`~~`~" StringVar ) SetName "`Enter Name`" StringVar ; !!!INIT NAME!!! w/o ~ Message "Must enter a new name." set state to 1 else ModName "`~~`|" StringVar ModName "~|" StringVar set state to 0 set button to 0 ; include any code to use the string here MessageBoxEx "Congratulations, you named it %n" StringVar endif endif
End
Функции ввода:
http://cs.elderscrolls.com/index.php?title=OpenTextInput OpenTextInput Синтаксис: OpenTextInput "текст1", "текст2",.... "текст20" MenuType maxLength Открывает меню ввода текста, если он не используется в настоящее время. Значение MenuType равно 0 для MessageBox, 1 для книги, или 2 для прокрутки. Парметр MaxLength определяет максимальное количество символов. Если будет поставлено значение MenuType == 0, то в MessageBox строка ввода будет обозначена курсором. Следующие переменные, введенные после первой, будут обозначены как кнопки (аналогично тому, как это делается для команды GetButtonPressed).
http://cs.elderscrolls.com/index.php?title=UpdateTextInput UpdateTextInput Синтаксис: UpdateTextInput Выводит меню ввода текста для проверки введенных пользователем данных и обновления отображаемого текста, если это необходимо. Команда должна вызываться в каждом фрейме, в то время как открыто меню ввода, иначе меню просто закроется.
http://cs.elderscrolls.com/index.php?title=InsertInInputText InsertInInputText Синтаксис: InsertInInputText string_var1:varies_var2:varies ... var20: varies Вставка введенного текста в текущую позицию курсора в меню ввода текста, пока это допускается максимальной длиной строки, определенной varies .
http://cs.elderscrolls.com/index.php?title=GetInputText GetInputText Синтаксис: GetInputText Возвращает текст, введенный пользователем. Вы можете вызывать эту функцию в любой точке перед вызовом CloseTextInput. Обратите внимание, что возвращаемая строка включает в себя любое HTML форматирование, сделанное пользователем.
http://cs.elderscrolls.com/index.php?title=CloseTextInput CloseTextInput Синтаксис: CloseTextInput Закрывает меню ввода текста. Она должна ставиться в скрипт после того, как нужная информация уже введена соответствующей командой.
http://cs.elderscrolls.com/index.php?title=IsTextInputInUse IsTextInputInUse Синтаксис: IsTextInputInUse Возвращает 1, если скрипт в настоящее время использует меню ввода текста, независимо от того, видно оно или нет. Одновременно может работать только одно меню ввода текста.
http://cs.elderscrolls.com/index.php?title=DeleteFromInputText DeleteFromInputText Синтаксис: DeleteFromInputText numToDelete:short bBackwards:bool bDeleteWholeWords:bool Удаляет количество символов или слов из введенного текста в указанном направлении, начиная с текущей позиции курсора. Обратите внимание, что HTML-теги трактуются и как слово и символ (только эту часть тега удалить не возможно). Оба дополнительных параметра, являются ложными по умолчанию.
http://cs.elderscrolls.com/index.php?title=GetTextInputCursorPos GetTextInputCursorPos Синтаксис: GetTextInputCursorPos Возвращает текущую позицию курсора как индекс в строке ввода.
http://cs.elderscrolls.com/index.php?title=MoveTextInputCursor MoveTextInputCursor Синтаксис: MoveTextInputCursor numChars:short moveBackwards:bool Перемещает курсор на указанное количество знаков в указанном направлении от текущей позиции. Обратите внимание, что каждый тег HTML рассматривается как один символ.
http://cs.elderscrolls.com/index.php?title=GetTextInputControlPressed GetTextInputControlPressed Синтаксис: GetTextInputControlPressed Возвращает скан-код последней нажатой клавиши в сочетании с ключевыми CTRL, за исключением тех ключей, которые зарезервированы для использования в меню ввода текста. Как только код восстановлен, последующий вызов этой команды вернет -1, он также вернет -1, если не была нажата клавиша.
http://cs.elderscrolls.com/index.php?title=MessageBoxEx MessageBoxEx Синтаксис: MessageBoxEX "текст1" var1 var2 ... var20 Отображение отформатированных MessageBox с помощью расширенного спецификатора формата для текстовых сообщений. Спецификаторы формата будут показаны в виде кнопок. Текст кнопок должен быть включен в строку формата, отделенную для каждой кнопки вертикальной чертой |. Вы можете использовать до 10 кнопок. Вы можете использовать до 20 переменных. Примечания: Для получения информации о том, как создать рабочие меню смотрите описание функции MessageBox. Отображает максимум 512 символов. В версии 0014a, количество увеличено 4096 символов. В версии 0016 с добавлением переменной string_var, этот предел был увеличен до 16 400 символов, хотя однострочный предел еще 512. Использование string_var - очень простой способ обойти однострочный предел.. Применение нескольких MessageBoxes или MessageBoxExes может вызвать возврат GetButtonPressed неверного значения.
Чем больше я сплю, тем меньше от меня вреда......
|
|
| |