Перейти к контенту

Рекомендуемые сообщения

@TIGER_VLAD,

Да там всё просто.

На родительское окно лепишь статик с фоном бара (напр. красный) и задаешь ему позицию "Х" равную -(минус)ширина_бара

Т.е. изначально оно скрыто (скажем). По мере надобности меняем "Х" и двигаем этот дочерний статик относительно родительского так как нужно. То что выходит за пределы родителя видно не будет, а то что будет видно на родителе, то и будет тебе прогресс баром

Ссылка на комментарий
прогресс-бар в ТЧ работает, конкретно вопрошающему необходим 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>
</конкретный_элемент>
Изменено пользователем UnLoaded
  • Спасибо 1
Ссылка на комментарий

 

 

Ну наверное ему нужно все-же SetProgressPos, если разговор о прогресс-баре.

Да, разумеется, я почему-то написал иное, причем дважды, хотя имел ввиду именно SetProgressPos. Сюда же GetProgress, впрочем не так важно, я доносил иную мысль, остальное все видно из сигнатуры класса.

  • Спасибо 1
Ссылка на комментарий

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.

Ссылка на комментарий
level.vertex_position(number) не подойдет?

слишком мало на уровне, тот же кордон 200 с чем-то всего-лишь, подумал по нодам (аи сетки) спавнить, но тут мне сказали:

В моде ПТО мы ещё 1,5 года назад сделали спавн аномалий по рандомным координатам локации и ни к каким нодам не привязывались. Причём во время выброса одни аномалии рассасывались, а после окончания выброса другие спавнились рандомно по новым координатам. Аномалии вообще к нодам ( к АИ-сетке ) не привязаны никак.

 буду ковырять Припять Точку Отчёта, забью на ноды пока что...

 

Если есть более конкретные подсказки, буду рад

Изменено пользователем FonSwong
Ссылка на комментарий

@FonSwong, возьми исходники, там есть доступ к левел графу, у которого в свойствах есть количество вертексов (нод), отсюда без всяких сторонних функций в одну строку ты можешь взять рандомный вертекс с уровня.

Функции инверсны, по позиции можно получить вертекс, и позицию можно получить по вертексу, все весьма удобно. Я, если не ошибаюсь, так и делал, брал рандомный вертекс, далее брал позицию из него и спавнил, с точки зрения скриптовой реализации все весьма не дурно.

Исходя из левелвертекса можешь получить точный геймвертекс. На самом деле там все сильно взаимосвязано и довольно многие данные можно получать без дополнительных действий.

  • Полезно 1
Ссылка на комментарий

@Карлан, Собственно я так и делал, по вертексам

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 штук аномалий, они, аномалии, начинают накладываться друг на друга!(отсеивание спавна по одинаковым координатам в коде нету, я знаю)

Собственно в этом и заключается проблема, в том, что мне нужно больше координат спавна по локации, левел вертиксов слишком мало.

Как мне получить координаты каждой ноды аи-сетки, думаю как раз таки это мне облегчит жизнь.

 

П.С.: где-то кто-то говорил что можно как-то использовать реализацию дождя, мол дождь бьёт по геометрии, и это можно использовать для спавна аномалий

Изменено пользователем Eugen81
Добавлено Eugen81,

Ты уверен, что таблицу в 10000 строк надо было выкладывать сюда под спойлер? Больше так не делай.

Ссылка на комментарий

Левел и гейм вертиксы всех локаций

Это не все доступные левел-вертексы. Как ты их считал? По граф-поинтам (гейм-вертексам)? Так вот, это только вертексы граф-поинтов. Берешь самый большой из них для нужной локации, потом через math.random(1, <самый большой вертекс>) получаешь случайный вертекс, затем через level.vertex_position получаешь его координаты, а потом ищешь ближайший к этим координатам гейм-вертекс. Посмотри скрипты спавна динамических аномалий из того же АМК. Изменено пользователем naxac
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

@naxac, Я подозревал, что не все вертексы использую, но не мог сам себе объяснить почему. Благодарю за подробный ответ.

Ещё вопрос, когда спавним, то указываем level vertex и game vertex, за что конкретно они отвечают? Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать? :huh:

Изменено пользователем FonSwong
Ссылка на комментарий

Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать?

Этого не знаю, надо у двигоправов спрашивать, что там к чему. Возможно, вертексы при спавне нужны для Ai.

  • Согласен 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

 

 

Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать?

Уже много раз обсуждалось: при спавне объектов, движок использует гейм-вертекс - для идентификации уровня, на котором будем спавнить, и координаты - для размещения объекта. Левел-вертекс не имеет значения и похоже движком не используется\игнорируется. Соответственно, гейм-вертекс можно указать любой, относящийся к локации.

Ссылка на комментарий

при спавне объектов, движок использует гейм-вертекс - для идентификации уровня, на котором будем спавнить

Тем не менее это ошибочное суждение, для серверного объекта этот параметр важен, при "любом" гейм вертексе могут возникать конфликты с масками, если они будут активно использоваться. Еще так же советую обратить внимание на возможность управления "включенности" гейм вертекса, вы попросту можете отключить не тот вертекс, и это будет ошибкой. Есть еще масса функций управления вершинами, которые использует движок, здесь он, очевидно, будет работать не с той вершиной.

 

Собственно я так и делал, по вертексам

Совершенно не так. Ты делаешь таблицы с магическими цифрами, это, на мой взгляд, довольно некорректное решение вопроса, к тому же, как верно заметили, массив ошибочен, его нужно составлять инверсионно твоему, но я повторюсь, у геймвертекса его левелвертекс есть в свойствах (он не может быть ему не ассоциирован). То есть ты должен просто получить одно из другого, рандомная вершина с текущего уровня берется одной строкой безо всяких функций составляющих массивы с магическими цифрами, из этого вереткса получаешь его позицию и гейм вертекс, это еще пара строк (если без изменений в общедоступные исходники, то нужно будет сделать цикл по гейм вертексам уровня, где рекомендую каждый проверить на валидность и далее проверяй на соответствие твоей вершине), затем спавнишь (у меня примерно так и работает). Возможно есть более корректные алгоритмы, но я профан в навигации, наверняка можно напрямую ассоццированный гейм вертекс получить, тут уже нужно в движок глядеть.

Ссылка на комментарий

 

 

Еще так же советую обратить внимание на возможность управления "включенности" гейм вертекса, вы попросту можете отключить не тот вертекс, и это будет ошибкой.

Вот это не понял напрочь: что означает "включенность" гейм-вертекса ? Хочу подробнее  :rolleyes: . Так-же - что такое вершины ? Другое название гейм-вертекса ? Почему ?

Ссылка на комментарий

Вот это не понял напрочь: что означает "включенность" гейм-вертекса ?

Скорей всего имеется ввиду следующий код из bind_physic_object.script:

game_graph():accessible(self.disable_graph_point, false)
Можно отключить вершину и НПЦ будут обходить все аи-ноды, которые соотвествуют этому геймвертексу.

Этакая эмуляция закрытых дверей для НПЦ :)

 

Вершина - русское слово, вертекс - калька с английской. Обозначают одно и тоже.

Изменено пользователем abramcumner
Ссылка на комментарий

Ну в общем я переписал и сделал как-то вот так, вроде работает:

 

 

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  

 

 

Может чего лишнего намудрил? :D

Изменено пользователем FonSwong
  • Полезно 1
Ссылка на комментарий

Есть функция проверки близости ГГ к аномалии.

function anomaly_prec:update()
local distance = self.object :position():distance_to(db.actor :position())
if distance < 10 then
"Действие выполняется если игрок подойдет к аномалии на расстояние меньше 10 метров"
end
end

Проблема в том что мне нужно чтобы действие выполнялось когда ГГ подходит к аномалии на определенное расстояние. Допустим действие будет выполнятся если игрок подходит к аномалии на расстояние 10 метров. Не больше не меньше. Именно конкретное число.

If distance == не предлагать. Если так поставить, то действие выполнятся не будет.

Ссылка на комментарий

 

 

If distance == не предлагать. Если так поставить, то действие выполнятся не будет.

С чего бы это ?

Если у тебя в кармане 10руб(монетой) - то условие "if в_кармане == 10 then" не должно выполняться ?

Ищи ошибку у себя в проверках\условиях, причем достаточно тупую(это без оскорблений, просто так оно и есть)...

Ссылка на комментарий

то условие "if в_кармане == 10 then" не должно выполняться ?

Конкретно здесь оно выполнятся не будет. Это очевидно. Ошибки здесь нет, здесь есть не понимание принципов работы с подобными величинами.

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...