singapur22
Поспешное суждение о грави-пушке.
Хотя она сделана на базе оружейного класса, но это совершенно иной предмет, которому аналогов нет.
По сути от оружейного класса требуется возможность обрабатывать кнопки мыши (огонь и прицеливание). В гави-пушке по этим кнопкам происходит захват-удержание и бросок. Ну и по 'кол-ву оставшихся патронов' отслеживается собственно факт броска (выстрел).
Суть ее: любой объект с физ.оболочкой может быть захвачен, т.е. у объекта отключается сила тяжести (объект подвешивается) и этот объект помещается в условный фокус пушки (притягивается/отдаляется). После захвата объект может перемещаться в любом направлении отслеживая фокус пушки. Ну и соответственно бросок/толчок ... Далее фантазии на тему 'после броска ...'
В итоге получился некий манипулятор физ.объектами с отключением их массы ('грави').
Как я понял, SkyLoader'у захотелось чтобы захваченный объект 'смотрел все время на актора' (на грави-пушку). В нынешнем виде объект не меняет своего положения относительно координат x и z (не вращается) при перемещениях его пушкой.
отредактировал(а) Artos: 01-06-2011 13:23 GMT3 час.
Artos Спасибо за описание. А то все по неё говорят, а мне и посмотреть, что за ... некогда. :-)
Как я понял, SkyLoader'у захотелось чтобы захваченный объект 'смотрел все время на актора' (на грави-пушку). В нынешнем виде объект не меняет своего положения относительно координат x и z (не вращается) при перемещениях его пушкой.
Нет. Ему нужно нечто иное. С грави-пушкой даже близко не связанным проектом. Отвечу цитатой в личку.
Исходя из твоих слов: "... мы создаем какие то данные, либо получаем их, и заполняем этими данными окно." - получили неким образом массив локаций, для телепортации на них актора (список упростил):
local tTeleports = {
[ 1] = l01_escape,
[ 2] = l02_garbage,
...
[17] = l12u_control_monolith,
[18] = l12_stancia_2
}
Массив привожу в упрощенном виде, в оригинале в нем и позиция для спавна и направление ...
В данном контексте для создания листинга это не важно.
Основной код создания листинга по элементам имеющегося уже массива это:
--/ Создаем окно для всего списка локаций
local list = CUIListWnd() --/ создаем объект окна класса 'листинга'
list:SetAutoDelete(true)
list:Init(10,25,135,300) --/ инициируем его в заданых координатах (x,y,width,height)
list:SetItemHeight(16) --/ высота каждой строки листинга
list:SetFont( GetFontLetterica16Russian() ) --/ тип шрифта строк листинга
list:SetTextColor(255,216,188,140) --/ цвет текста строк
list:EnableScrollBar(true) --/ разрешаем скролл-бар при превышении заполнения окна
list:ShowSelectedItem(false) --/ пока не показываем выделение --/ итерируем по массиву локаций:{[ i]=level_name}
for _,v in ipairs(tTeleports) do
local item = CUIListItemEx() --/ строка i-ой локации
item:SetWndRect(0,0,130,18) --/ x,y,width,height
item:InitTexture("ui\\ui_scb_scroll_box") --/ текстура подложки
item:SetStretchTexture(true)
item:SetHighlightColor(GetARGB(255,255,150,0)) --/ цвет текста при наведении
item:SetSelectionColor(GetARGB(255,200,200,250)) --/ цвет текста выбраной локации
item.map = v --/ запоминаем имя локации дл**5002618d69873ce82a42**
else
self.act0:Show(false) --/ скрываем кнопку действия
end
end
function UI_TabController:OnBtnAction0()
if this.Check_StartGame() then --/ телепортируем только в запущенной игре
local iSelect = self.map_list:GetSelectedItem() --/ индекс выбранной строки
if iSelect >= 0 then
local item = self.map_list:GetItem(iSelect) --/ объект выбранной строки
if item then
local sLevelName = item.map --/ имя локации
for _,v in ipairs(tTeleports) do
if v.map == sLevelName then --/ на текущей локации?
if sLevelName == level.name() then --/ меняем позицию на заданную
db.actor:set_actor_position(v.pos)
db.actor:set_actor_direction(v.dir)
else
this.Get_Teleport(sLevelName, v.pos) --/ вызываем алгоритм телепортации
end
self:Quit() --/ выход
end
end
else
self.act0:Show(false) --/ скрываем кнопку действия
end
end
end
end
[/code]
отредактировал(а) Artos: 01-06-2011 16:11 GMT3 час.
Artos Осмелюсь добавить, что в паре с кнопкой выбора "ОК" желательно использовать и событие двойного клика по элементу списка (пользоваться будет значительно удобней). ui_events.WINDOW_LBUTTON_DB_CLICK устанавливаемый на список.
А если ещё и добавить клик кнопки "ОК" при нажатии "Enter", будет вообще полный набор событий.
singapur22 О грави-пушке:
Было видео на АМК-сайте, но ... почистили. По мотивам и erlik сделал вариант и у меня в сборке есть (для развлечения) эта поделка. Можно спорить о ее востребованности в игре, но ... это скорее очень неплохое (ИМХО) пособие для модмейкеров - как обращаться с разнообразием векторных методов и применения импульсов.
О листинге:
Я сделал иначе с выбором из листинга:
1. Нужный пункт выбирается обычным кликом по выбранной строке и ... появляется кнопка действия.
2. Отработка производится уже нажатием кнопки действия (аналог 'OK').
Т.о. и исключаются случайные нажатия (по сути аналог дабл-клика, только разнесенного) и дается время на 'подумать'.
Такое разнесение является заодно и проверкой - актуален ли данный пункт или он 'бутафорский' (т.е. задел на будущие некие условия, которые могут блокировать некие локации).
P.S. Вторая картинка с активированной кнопкой для выполнения выбранной телепортации:
отредактировал(а) Artos: 01-06-2011 16:29 GMT3 час.
Struck
А вот с 'переносом' длинных текстов огорчу. Данная функциональность доступна только для объектов класса CScriptXmlInit(), т.е. созданых с использованием этого класса и применением соотв.тэгов именно при применении xml-файла.
Так что или использовать xml'ки или 'резать' текст самому и склеивать из неск.окон.
Или же ... а) (самое разумное) применять такие строки, чтобы влезали в окно листинга, б) усекать длинные строки, вылезающие за окно. По сбору кусочков - я пас, этот вопрос не интересен. Для сбора кусочков в единое можно банальные 'статики' (CUIStatic()) использовать иль тот же шаблон из xml'ки.
Рядом есть 'ui_pda_frame_sub.ini', который похоже имеено аналогичные кусочки собирает - но это уже тебе самому поисследовать, иль кто иной ответит. :-)
отредактировал(а) Artos: 01-06-2011 18:00 GMT3 час.
Artos то есть варианта два, либо создавать для каждого объемного текста своего окно, либо писать и "склеивать" кучу статиков?
А про сбор кусочков предполагаю что есть вариант по оптимальней, подожду может и вправду у кого желание появится пояснить.
Struck На счёт мультиплексирования. К твоему глубочайшему сожалению, это возможно только через установку соответствующего аргумента в теге xml файла.
аргумент: complex_mode="1"
И на счёт сбора рамки. Ты ММ юзал? Там все фоновые рамки на их основе и собраны.
Классы CUIFrameWindow() и CUIFrameLineWnd() отвечают за комплексное изображение. Где первый класс отвечает за комплексирование в двух направлениях (по горизонтали и по вертикали), а второй только по горизонтали. Плюс данных классов том, что они не растягивают изображение до размеров виджета, а производят составление общей картинки из набора указанных элементов изображения. Соответственно, размеры можно задавать любые, и общая картинка при этом искажаться не будет.
Короче юзай ММ, там всё сам разберёшь.
MRN$ Функции находятся в заранее определённом файле? Или местоположен**5001618d69873ce82a42**любая приставка, или без неё"]
if func and type(func) == "function" then
func()
end[/code]
Если же файл заранее не известен, то при этом нужно будет итерировать элементы окружения _G и если элемент является таблицей, то производить выше приведённую операцию,
где fileName будет являться элементом окружения. В данном случае уникальная приставка в именх функций будет обязательна, дабы не произошло никаких конфликтов.
отредактировал(а) singapur22: 02-06-2011 17:39 GMT3 час.
Shape :friends
Благодарствую - пашет... singapur22 :friends
Файлы как обычно в папке скриптс, а функции в них...
твой вариант щас то-же попробую...
Имена функций - известны, неизвестны имена файлов.
loadstring(filename.."."..funcname.."()")() - вылетает если не находит файл скрипта...
Нужна проверка файла скрипта на существование, тогда можно запустить "loadstring".
Как безвылетно проверить файл скрипта на существование?
"итерировать элементы окружения _G"?
По сути, можно через итерацию окружения. Но в данном случае, нужно быть уверенным в том, что он туда загружен, что происходит не со всеми файлами. По крайней мере, не сразу. Многие находят выход из данного положения, загружая нужные файлы в окружение принудительно, при старте игры.
Можно через класс FS, но тут я не уверен в том, что данное действие не приведёт к потере новых файлов из виду. Данный класс вообще криво работает, причём на разных ОС могут быть свои глюки. Самый верный вариант, это вывести все требуемые функции в определённый файл, к которому и обращаться при данном действии.
Здравствуйте. Подскажите как сделать большой EditBox? Чтобы можно было писать несколько строк в боксе. Пытался тупо сделать бокс большим размером, но вписать получается только одну строку
Ma$ter класс CUIEditBoxEx(). За текстуру указывать набор типа frame (комплексное изображение из 9 текстур). Данный класс эдит-бокса работает по схеме мультиплексирования. Но есть одна заморочка. курсор эдита функцианирует так, будто это однострочный эдит-бокс. В итоге уходит непонятно куда, хотя текст вводится нормально (многострочно). Я ещё не полностью разобрался с данным классом. Так что ковыряй дальше сам.
А вот интересно, можно ли как нибудь сделать, чтобы по нажатию на ВВОД текст переходил на новую строку? Как в блокноте например. А то невозможно перейти на новую строку не закончив старую
Ma$ter Нет. Видимо класс не доделан, изза потери в нём необходимости.
Раз уж на то пошло, и тебе необходим мультиплекстный редактор текстов. То создай его сам, на основе CUIStatic(). Работа не простая. Но если получится, многие тебе будут только благодарны!
Mehanik Yar Если спавн производится через all.spawn, то зафиксировать можно прописав в конце секции: fixed_bones = список костей, через запятую
Объект при этом должен быть физическим.
Если же спавн производится через скрипт. То для этого имеются соответствующие методы. О данных методах можешь распросить Erlik'a. (найдёшь его на предыдущей странице)
Добавил модельку ноя в игру (скачал с инета). Вроде сделал все правильно: ogf в meshes там в папке actors создал новую папку "noy" туда и сунул ogf, в textures снова создал папку noy туда сунул все фаилы dds. В character_desc_escape.xml Волку прописал эту модельку получилось actors\noy\noy больше нечего неделал. Начинаю новую игру и получил вот такой лаг:::
serega_zombi_stalker Аргументы лога говорят о том, что:
1. текстуры к модели должны лежать в папке gamedata\\textures\\act\\, а не как ты положил, непонятно откуда взявшуюся папку noy.
2. одна из требуемых текстур должна обзываться "act_faces_4_04.dds"
Дальше, если будут дополнительные требования, следовать по выводимым аргументам.
кстати кто нибудь знает какой гулаг у шустрого разведчиков и толика????
Как то давно менял им групировку и чтоб они нерасходились менял групировку гулага. Сейчас снова поменял, но какой гулаг забыл....кстати гулаг лагеря новичков на них недействует.
добавлено спустя 37 минут
уже ненадо))) я сам уж нашел
отредактировал(а) serega_zombi_stalker: 03-06-2011 13:27 GMT3 час.
Please, help me, peopls! После установки мода АМК 1.4.1 на лицуху 1.006 выдает лаг на рабочий стол с такой вот ерундовиной (сообщение XRay Engine "XR_3DA.exe caused BREAKPOINT in module "D:\Program Files\GSC World Publishing\S.T.A.L.K.E.R\bin\xrCore.dll" at 001B:006BCC85, xrDebug::backend()+165 byte(s)")