Nazgool 250 Опубликовано 15 Октября 2016 Поделиться Опубликовано 15 Октября 2016 @TIGER_VLAD, Да там всё просто. На родительское окно лепишь статик с фоном бара (напр. красный) и задаешь ему позицию "Х" равную -(минус)ширина_бара Т.е. изначально оно скрыто (скажем). По мере надобности меняем "Х" и двигаем этот дочерний статик относительно родительского так как нужно. То что выходит за пределы родителя видно не будет, а то что будет видно на родителе, то и будет тебе прогресс баром Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 15 Октября 2016 Поделиться Опубликовано 15 Октября 2016 @FonSwong, @Nazgool, Можно пример кода? Ссылка на комментарий
UnLoaded 313 Опубликовано 15 Октября 2016 Поделиться Опубликовано 15 Октября 2016 (изменено) прогресс-бар в ТЧ работает, конкретно вопрошающему необходим SetWndPos Ну наверное ему нужно все-же SetProgressPos, если разговор о прогресс-баре. Можно пример кода? Ну примерно так: local inv_main = level:main_input_receiver() if inv_main then local inv_xml = CScriptXmlInit() inv_xml:ParseFile("какой-то_файл.xml") -- парсим файл с описанием элементов -- local pb_new = inv_xml:InitProgressBar("конкретный_элемент", inv_main) pb_new:SetAutoDelete(true) pb_new:Show(true) end затем pb_new:SetProgressPos(нужное значение) какой-то_файл.xml создать по аналогии с другими в папке config\ui. Для прогресс-бара описание будет как-то так: <конкретный_элемент x="445" y="349" width="140" height="4" horz="1" min="0" max="100" pos="0"> <progress> <texture a="255" r="255" g="255" b="255">ui_scale_green_sect_horz</texture> </progress> <background> <texture a="80" r="255" g="255" b="255">ui_scale_green_sect_horz</texture> </background> </конкретный_элемент> Изменено 15 Октября 2016 пользователем UnLoaded 1 Ссылка на комментарий
Карлан 1 049 Опубликовано 15 Октября 2016 Поделиться Опубликовано 15 Октября 2016 Ну наверное ему нужно все-же SetProgressPos, если разговор о прогресс-баре. Да, разумеется, я почему-то написал иное, причем дважды, хотя имел ввиду именно SetProgressPos. Сюда же GetProgress, впрочем не так важно, я доносил иную мысль, остальное все видно из сигнатуры класса. 1 Ссылка на комментарий
FonSwong 33 Опубликовано 16 Октября 2016 Поделиться Опубликовано 16 Октября 2016 Какой функцией можно собрать все ноды с локации и узнать координаты оных? Ссылка на комментарий
Zander_driver 10 334 Опубликовано 17 Октября 2016 Поделиться Опубликовано 17 Октября 2016 level.vertex_position(number) не подойдет? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
FonSwong 33 Опубликовано 17 Октября 2016 Поделиться Опубликовано 17 Октября 2016 (изменено) level.vertex_position(number) не подойдет? слишком мало на уровне, тот же кордон 200 с чем-то всего-лишь, подумал по нодам (аи сетки) спавнить, но тут мне сказали: В моде ПТО мы ещё 1,5 года назад сделали спавн аномалий по рандомным координатам локации и ни к каким нодам не привязывались. Причём во время выброса одни аномалии рассасывались, а после окончания выброса другие спавнились рандомно по новым координатам. Аномалии вообще к нодам ( к АИ-сетке ) не привязаны никак. буду ковырять Припять Точку Отчёта, забью на ноды пока что... Если есть более конкретные подсказки, буду рад Изменено 17 Октября 2016 пользователем FonSwong Ссылка на комментарий
Карлан 1 049 Опубликовано 18 Октября 2016 Поделиться Опубликовано 18 Октября 2016 @FonSwong, возьми исходники, там есть доступ к левел графу, у которого в свойствах есть количество вертексов (нод), отсюда без всяких сторонних функций в одну строку ты можешь взять рандомный вертекс с уровня. Функции инверсны, по позиции можно получить вертекс, и позицию можно получить по вертексу, все весьма удобно. Я, если не ошибаюсь, так и делал, брал рандомный вертекс, далее брал позицию из него и спавнил, с точки зрения скриптовой реализации все весьма не дурно. Исходя из левелвертекса можешь получить точный геймвертекс. На самом деле там все сильно взаимосвязано и довольно многие данные можно получать без дополнительных действий. 1 Ссылка на комментарий
FonSwong 33 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 (изменено) @Карлан, Собственно я так и делал, по вертексам tbl_din_anom = {} local anom = { --ЛОКАЛЬНЫЕ АНОМАЛИИ 'zone_mine_acidic_weak', --газировка 'zone_mine_acidic_average', 'zone_mine_acidic_strong', --'zone_mine_acidic_big', --НЕ УДАЛОСЬ ЗАСПАВНИТЬ 'zone_buzz_weak', --холодец(первый вид) 'zone_buzz_average', 'zone_buzz_strong', 'zone_mine_chemical_weak', --холодец(второй вид) 'zone_mine_chemical_average', 'zone_mine_chemical_strong', 'zone_mine_electric_weak', --электра обычная 'zone_mine_electric_average', 'zone_mine_electric_strong', 'zone_mine_static_weak', --электра статическая 'zone_mine_static_average', 'zone_mine_static_strong', 'zone_witches_galantine_weak', --электра невидимая(хз, так же статична) 'zone_witches_galantine_average', 'zone_witches_galantine_strong', 'zone_mine_thermal_weak', --жарка(первый вид) 'zone_mine_thermal_average', 'zone_mine_thermal_strong', 'zone_zharka_static_weak', --жарка(второй вид) 'zone_zharka_static_average', 'zone_zharka_static_strong', 'zone_mine_steam_weak', --жарка(пар) 'zone_mine_steam_average', 'zone_mine_steam_strong', 'zone_gravi_zone', --грави 'zone_mine_gravitational_weak', --трамплин 'zone_mine_gravitational_average', --воронка 'zone_mine_gravitational_strong', --карусель(первый вид) 'zone_mine_gravitational_big', --карусель(второй вид) 'zone_mosquito_bald', --комаринная плешь 'zone_mosquito_bald_weak', 'zone_mosquito_bald_weak_noart', 'zone_mosquito_bald_average', 'zone_mosquito_bald_strong', 'zone_mosquito_bald_strong_noart', --ЗОНАЛЬНЫЕ АНОМАЛИИ 'zone_radioactive', --радиация(первый вид)(БЕЗВРЕДНАЯ) 'zone_radioactive_weak', --радиация(первый вид) 'zone_radioactive_average', 'zone_radioactive_strong', 'zone_field_radioactive', --радиация(второй вид)(БЕЗВРЕДНАЯ) 'zone_field_radioactive_weak', --радиация(второй вид) 'zone_field_radioactive_average', 'zone_field_radioactive_strong', 'zone_field_acidic', --кислотный туман(БЕЗВРЕДНАЯ) 'zone_field_acidic_weak', 'zone_field_acidic_average', 'zone_field_acidic_strong', 'zone_field_psychic', --пси зона 'zone_field_psychic_weak', 'zone_field_psychic_average', 'zone_field_psychic_strong', 'zone_field_thermal', --высокая температура 'zone_field_thermal_weak', 'zone_field_thermal_average', 'zone_field_thermal_strong' } function random_anomalies(count) local t = Get_Levels_and_Game_Vertexes() store_table(t) for k, v in pairs(t['GameVertexes']) do if k ~= 'fake_start' and k == 'l01_escape' then local i = 0 while i < count do local r_lv = math.random(#t.LevelsVertexes[k]) local r_gv = math.random(#t.GameVertexes[k]) local r_anom = math.random(#anom) local sobj = create_anom(anom[r_anom],3,t.LevelsVertexes[k][r_lv],t.GameVertexes[k][r_gv]) table.insert(tbl_din_anom,sobj.id) level.map_add_object_spot_ser(sobj.id, "blue_location", sobj.id) i = i + 1 end end end end function Get_Levels_and_Game_Vertexes() local t = {} local i = 0 t['LevelsVertexes'] = {} t['GameVertexes'] = {} local graph = game_graph() while graph:valid_vertex_id(i) do local v = graph:vertex(i) local ln = alife():level_name(v:level_id()) if not t['LevelsVertexes'][ln] then t['LevelsVertexes'][ln] = {} end if not t['GameVertexes'][ln] then t['GameVertexes'][ln] = {} end t['LevelsVertexes'][ln][#t['LevelsVertexes'][ln]+1] = v:level_vertex_id() t['GameVertexes'][ln][#t['GameVertexes'][ln]+1] = i i = i+1 end return t end function create_anom(section,radius,lv,gv,mode) local pos = level.vertex_position(lv) local sobj = alife():create(section,pos,lv,gv) local t = stpk_utils.get_anom_zone_data(sobj) --[[if mode then t.custom_data = 'field' end]] -- почему-то пишут что нужно, хотя нормально и без него... t.shapes = {} t.shapes[1] = {} t.shapes[1].shtype = 0 t.shapes[1].offset = vector():set(0, 0, 0) t.shapes[1].radius = radius stpk_utils.set_anom_zone_data(t,sobj) return sobj end Итак, начинаю пояснять конкретно о проблеме, в функции Get_Levels_and_Game_Vertexes() мы получаем таблицей Левел и гейм вертиксы всех локаций: https://yadi.sk/d/MQ7rA_AQxBWkR Например для левела эскейп находятся 279 левел вертиксов, то бишь мы имеем на этом уровне ВСЕГО ЛИШЬ 279 координат спавна, что очень мало, и при спавне свыше 279 штук аномалий, они, аномалии, начинают накладываться друг на друга!(отсеивание спавна по одинаковым координатам в коде нету, я знаю) Собственно в этом и заключается проблема, в том, что мне нужно больше координат спавна по локации, левел вертиксов слишком мало. Как мне получить координаты каждой ноды аи-сетки, думаю как раз таки это мне облегчит жизнь. П.С.: где-то кто-то говорил что можно как-то использовать реализацию дождя, мол дождь бьёт по геометрии, и это можно использовать для спавна аномалий Изменено 19 Октября 2016 пользователем Eugen81 Добавлено Eugen81, 19 Октября 2016 Ты уверен, что таблицу в 10000 строк надо было выкладывать сюда под спойлер? Больше так не делай. Ссылка на комментарий
naxac 2 447 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 (изменено) Левел и гейм вертиксы всех локацийЭто не все доступные левел-вертексы. Как ты их считал? По граф-поинтам (гейм-вертексам)? Так вот, это только вертексы граф-поинтов. Берешь самый большой из них для нужной локации, потом через math.random(1, <самый большой вертекс>) получаешь случайный вертекс, затем через level.vertex_position получаешь его координаты, а потом ищешь ближайший к этим координатам гейм-вертекс. Посмотри скрипты спавна динамических аномалий из того же АМК. Изменено 19 Октября 2016 пользователем naxac 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
FonSwong 33 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 (изменено) @naxac, Я подозревал, что не все вертексы использую, но не мог сам себе объяснить почему. Благодарю за подробный ответ. Ещё вопрос, когда спавним, то указываем level vertex и game vertex, за что конкретно они отвечают? Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать? Изменено 19 Октября 2016 пользователем FonSwong Ссылка на комментарий
naxac 2 447 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать? Этого не знаю, надо у двигоправов спрашивать, что там к чему. Возможно, вертексы при спавне нужны для Ai. 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
UnLoaded 313 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать? Уже много раз обсуждалось: при спавне объектов, движок использует гейм-вертекс - для идентификации уровня, на котором будем спавнить, и координаты - для размещения объекта. Левел-вертекс не имеет значения и похоже движком не используется\игнорируется. Соответственно, гейм-вертекс можно указать любой, относящийся к локации. Ссылка на комментарий
Карлан 1 049 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 при спавне объектов, движок использует гейм-вертекс - для идентификации уровня, на котором будем спавнить Тем не менее это ошибочное суждение, для серверного объекта этот параметр важен, при "любом" гейм вертексе могут возникать конфликты с масками, если они будут активно использоваться. Еще так же советую обратить внимание на возможность управления "включенности" гейм вертекса, вы попросту можете отключить не тот вертекс, и это будет ошибкой. Есть еще масса функций управления вершинами, которые использует движок, здесь он, очевидно, будет работать не с той вершиной. Собственно я так и делал, по вертексам Совершенно не так. Ты делаешь таблицы с магическими цифрами, это, на мой взгляд, довольно некорректное решение вопроса, к тому же, как верно заметили, массив ошибочен, его нужно составлять инверсионно твоему, но я повторюсь, у геймвертекса его левелвертекс есть в свойствах (он не может быть ему не ассоциирован). То есть ты должен просто получить одно из другого, рандомная вершина с текущего уровня берется одной строкой безо всяких функций составляющих массивы с магическими цифрами, из этого вереткса получаешь его позицию и гейм вертекс, это еще пара строк (если без изменений в общедоступные исходники, то нужно будет сделать цикл по гейм вертексам уровня, где рекомендую каждый проверить на валидность и далее проверяй на соответствие твоей вершине), затем спавнишь (у меня примерно так и работает). Возможно есть более корректные алгоритмы, но я профан в навигации, наверняка можно напрямую ассоццированный гейм вертекс получить, тут уже нужно в движок глядеть. Ссылка на комментарий
UnLoaded 313 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 Еще так же советую обратить внимание на возможность управления "включенности" гейм вертекса, вы попросту можете отключить не тот вертекс, и это будет ошибкой. Вот это не понял напрочь: что означает "включенность" гейм-вертекса ? Хочу подробнее . Так-же - что такое вершины ? Другое название гейм-вертекса ? Почему ? Ссылка на комментарий
abramcumner 1 157 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 (изменено) Вот это не понял напрочь: что означает "включенность" гейм-вертекса ?Скорей всего имеется ввиду следующий код из bind_physic_object.script: game_graph():accessible(self.disable_graph_point, false)Можно отключить вершину и НПЦ будут обходить все аи-ноды, которые соотвествуют этому геймвертексу. Этакая эмуляция закрытых дверей для НПЦ Вершина - русское слово, вертекс - калька с английской. Обозначают одно и тоже. Изменено 20 Октября 2016 пользователем abramcumner Ссылка на комментарий
FonSwong 33 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 (изменено) Ну в общем я переписал и сделал как-то вот так, вроде работает: tbl_din_anom = {} function random_anomalies(count) local t = Get_Levels_and_Game_Vertexes() for k, v in pairs(t['GameVertexes']) do if k ~= 'fake_start' then local i = 0 while i < count do local r_lv = math.random(1, t.LevelsVertexes[k]) local pos = level.vertex_position(r_lv) local min_gv = t.GameVertexes[k][1] local max_gv = t.GameVertexes[k][2] local r_anom = math.random(#anom) local new_gv = 0 local min_dist = 100000 --подбираем геймвертекс for a = min_gv, max_gv do local g1 = game_graph():vertex(a):game_point() if g1:distance_to(pos)<min_dist then min_dist = g1:distance_to(pos) new_gv = a end end local sobj = create_anom(anom[r_anom],3,pos,r_lv,new_gv) table.insert(tbl_din_anom,sobj.id) level.map_add_object_spot_ser(sobj.id, "blue_location", sobj.id) i = i + 1 end end end end function Get_Levels_and_Game_Vertexes() local t = {} local i = 0 t.LevelsVertexes = {} t.GameVertexes = {} local graph = game_graph() while graph:valid_vertex_id(i) do local v = graph:vertex(i) local ln = alife():level_name(v:level_id()) if not t.LevelsVertexes[ln] then t.LevelsVertexes[ln] = v:level_vertex_id() elseif v:level_vertex_id() > t.LevelsVertexes[ln] then t.LevelsVertexes[ln] = v:level_vertex_id() end if not t.GameVertexes[ln] then t.GameVertexes[ln] = {} end if not t.GameVertexes[ln][1] then t.GameVertexes[ln][1] = i else t.GameVertexes[ln][2] = i end i = i+1 end return t end Может чего лишнего намудрил? Изменено 20 Октября 2016 пользователем FonSwong 1 Ссылка на комментарий
advisor890 1 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 Есть функция проверки близости ГГ к аномалии.function anomaly_prec:update()local distance = self.object :position():distance_to(db.actor :position())if distance < 10 then"Действие выполняется если игрок подойдет к аномалии на расстояние меньше 10 метров"endendПроблема в том что мне нужно чтобы действие выполнялось когда ГГ подходит к аномалии на определенное расстояние. Допустим действие будет выполнятся если игрок подходит к аномалии на расстояние 10 метров. Не больше не меньше. Именно конкретное число. If distance == не предлагать. Если так поставить, то действие выполнятся не будет. Ссылка на комментарий
UnLoaded 313 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 If distance == не предлагать. Если так поставить, то действие выполнятся не будет. С чего бы это ? Если у тебя в кармане 10руб(монетой) - то условие "if в_кармане == 10 then" не должно выполняться ? Ищи ошибку у себя в проверках\условиях, причем достаточно тупую(это без оскорблений, просто так оно и есть)... Ссылка на комментарий
Карлан 1 049 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 то условие "if в_кармане == 10 then" не должно выполняться ? Конкретно здесь оно выполнятся не будет. Это очевидно. Ошибки здесь нет, здесь есть не понимание принципов работы с подобными величинами. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти