2


Пятница-Fredas
27.12.2024 14:47

Летописи Тамриэля

TESmagic


В жизни нет ничего лучше собственного опыта. Вальтер Скотт

Приветствую Вас Путешественник | RSS Главная | Функции ввода текста в OBSE - Форум | Регистрация | Вход |

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Функции ввода текста в OBSE
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 неверного значения.


Чем больше я сплю, тем меньше от меня вреда......
 
  • Страница 1 из 1
  • 1
Поиск:

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]


Copyright ImperialCity ©2009-2024 При копировании материалов - ссылка на сайт  обязательна!

free counters Rambler's Top100