Artos 99 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 (изменено) Gektor ... применить апгрейд на ствол? Если ты думаешь, что каждому ясно, что под этим ты подразумеваешь - то ошибаешься. Тем более тебя не поймет LUA (скрипты). Нацепить глушитель иль прицел, увелисть точность иль скорострельность, увелисить магазин иль переделать под иной патрон - нет таких единых функций. Если что-то и есть, имеющее отношение к подобному, то бОльшей частью это уже алгоритмы с множеством функций и привязаны к конкретному контексту (кодам в игре). Gun12 Данный кусок кода по формированию из строки индексной таблицы нередко востребован. Например, в конфигах нередко используют перечисления типа: param1 = 30,50,75 param2 = item1,item2,item3 Вот и получается подобным кодом сразу массив значений ... cчитав 'param1' как строку и применив: Tbl = str_expl(param1, 1, ",") Согласись, путей реализации далеко не один. Иной вопрос в оптимальности выбраного алгоритма и кодов для его реализации. Изменено 5 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
KASIMKA 0 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 Доброго времени суток! Делал квест, неудачным завершением которого, была бы полная зачистка военными лагеря новичков на Кордоне. Столкнулся с проблемой: нпс не хотят заходить в некоторые дома дальше крыльца (пути много раз менял и перепроверял). Судя по имеющейся у меня информации - там нет ai-сетки. Возможно ли их туда провести, не прибегая к редактированию уровня? Видел, как некоторые люди сталкивались с "противоположной" проблемой: нпс ходили через стены, вроде как при указании неправильных level- и game- vertex'ов. Заранее спасибо! Ссылка на комментарий
Artos 99 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 KASIMKA Любое(!) управляемое движение НПС в игре возможно ТОЛЬКО по AI-сетке. Невозможно заставить НПС идти туда, где ее нет. То, что порой НПС хотят через стены - результат некорректного спавна этих НПС за пределами AI-сетки, что порождает неуправляемое перемещение этого НПС как обычный объект/предмет к ближайшей доступной точке AI-сетки. Тебе так же следует почитать информацию о параметре 'terrain' для сталкеров/монстров, т.к. и им можно задавать/ограничивать доступность тех или иных участков на AI-сетке. Но в любом случае отсутствие AI-сетки там, где хочется чтобы ходили - влечет за собою перекомпиляцию уровня. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
gruber 2 481 Опубликовано 6 Сентября 2011 Поделиться Опубликовано 6 Сентября 2011 (изменено) НПС возможно заставить находится в местах с отсутствием аи сетки ,если в их логике пути отсутствуют вообще(логика типа remark) т.е нпс будет находится в точке спавна.Другой вариант запустить локацию кордон из ЧН (подключив к ТЧ или ЗП) -там сетка есть в домах .Так же сетка есть во всех домах на складах(даже на кроватях,а местами проходит по воздуху,в метре от земли) И без адресный и практически безинформативный пост, оторванный от ближайщих вопросов. Если адресован для KASIMKA - то ему подобное не требуется. Если же 'вообще' - набор очевидностей ... --/ Artos [x] Изменено 7 Сентября 2011 пользователем Artos Ссылка на комментарий
Artos 99 Опубликовано 6 Сентября 2011 Поделиться Опубликовано 6 Сентября 2011 (изменено) Из категории: "Маленткие хитрости" 1. Нередко в модах можно встретить сохранение некоторых переменных в pstor актора (иль иного объекта) для хранения значений типа 'вкл/откл' в виде: 'xr_logic.pstor_store(db.actor, "var_name", 1)' или 'xr_logic.pstor_store(db.actor, "var_name", 0)'. Можно подсчитать сколько байт займет данная переменная в сэйве: Имя переменной займет string.len(var_name) + 1 = 9 байт Значение переменной (число) займет float() = 4 байта. Итого имеем: 9+4 = 13 байт Если же использовать булевы значения (true/false), т.е.: 'xr_logic.pstor_store(db.actor, "var_name", true)' или 'xr_logic.pstor_store(db.actor, "var_name", false)' то запись значения переменной будет занимать всего 1 байт ( bool() == u8() ) и на каждой подобной переменной экотомится целых 3 байта(!) Напомню, что максимальный объем для psor'а ограничен 8192 байтами. 2. Нередко в модах используют сохранение таблиц в pstor, с использованием упаковки таблицы в строку функциями упаковки из АМК мода. В случае, упаковки таблицы типа простого списка {val1,val2,...valN} этот список упаковывается с порядковыми индексами всех значений в списке. Учитывая изложенное в п.1 и, принимая во внимание, что на каждый разряд индекса тратится 1 байт, выходит, что списки, имеющие более чем 10 индексов, экономнее хранить используя упакованным как массив с булевыми значениями. Если перед записью переводить подобный список в массив типа: {val1=true,val2=true,...valN=true} - то экономия байт в сэйве будет достигать (N - 9) байт для списка менее 100 индексов! Для списков с более 100 индексов экономия еще более, т.к. на каждом более 100-ом индексе уже экономится по 2 байта. Естественно при извлечении из сэйва (возможно) потребуется обратная конвертация в простой список. Резюме: Храните переменные в pstor'ах по-возможности в булевых значениях и большие таблицы (списки) в массивах с булевыми значениями, а не списками. Изменено 7 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Clayman 104 Опубликовано 6 Сентября 2011 Поделиться Опубликовано 6 Сентября 2011 (изменено) Но в любом случае отсутствие AI-сетки там, где хочется чтобы ходили - влечет за собою перекомпиляцию уровня. Достаточно перекомпилировать аи-сетку и спавн, что совсем недолго. Я так эксперементировал с бункером сидорыча на кордоне, когда хотел посадить туда обычного непися а не сидора, изначально там нету аи-сетки - добавил несколько нодов, вэй поинт для спавна, анимпоинт на стул (в ЗП) и вуаля - новый непись прекрасно спавнился и сидел там. Другое дело, что не во все дома добавишь корректно ноды сетки, так как она-же определенного размера и иногда не попадает (не влазит) в проходы..что может вызвать некорректное движение нпс.. В процитированных словах есть упоминание про полную перекомпиляцию? В исходном вопросе звучало про нежелательность 'редактирования уровня' ... Под 'перекомпиляцией уровня' мною подразумевалось (см. контекст) именно создание необходимой AI-сетки для уровня и перекомпиляция/редактирование всего, на что это влияет. --/ Artos Изменено 6 Сентября 2011 пользователем Artos Ссылка на комментарий
Nazgool 250 Опубликовано 6 Сентября 2011 Поделиться Опубликовано 6 Сентября 2011 (изменено) singapur22 Поступил по твоей аналогии и заключил все варианты в функции. Оставил общую таблицу как "точку отсчёта". a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaa" --100 символов b = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbb" --100 символов c = "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccc" --100 символов d = "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddd" --100 символов e = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeee" --100 символов tb = {a, b, c, d, e} -- общая для всех таблица function f_t(tb) t = os.clock() local q for i=1, 1000000 do q = table.concat(tb) end t2 = os.clock() - t print("table", t2) end function f_c(a,b,c,d,e) t = os.clock() local q for i=1, 1000000 do q = a..b..c..d..e end t2 = os.clock() - t print("concat", t2) end function f_f(...) t = os.clock() local q for i=1, 1000000 do q = string.format("%s%s%s%s%s", ...) end print("format", os.clock() - t) end f_t(tb) f_c(unpack(tb)) f_f(unpack(tb)) Ускорилось. Теперь показания выглядят так : table 0.921 concat 0.594 format 1.344 Изменено 6 Сентября 2011 пользователем Gun12 Ссылка на комментарий
Artos 99 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) Gun12, singapur22 А почему бы не привязаться к реальным кодам игры и не точечно, а хотя бы точками из дапазона? Что-то типа:: function test_concat() --/ предустановка local size = {1,25,50,75,100,125,150} --/ кол-ва символов for _,v in ipairs(size) do --/ циклы проверки с различной длиной --/ предустановки для тест-циклов local a = string.rep("a",v) local b = string.rep("b",v) local c = string.rep("c",v) local d = string.rep("d",v) local e = string.rep("e",v) printf("Size=%s:%s", v, string.rep("~",50)) --/ test table.concat local t1 = profile_timer() t1:start() local tb = {a, b, c, d, e} --/ таблица local s for i=1, 1000000 do s = table.concat(tb) end t1:stop() printf("table.concat:=%s", t1:time()) --/ test strings concat local t2 = profile_timer() t2:start() local s for i=1, 1000000 do s = a .. b .. c .. d .. e end t2:stop() printf("strings_concat:=%s", t2:time()) --/ test string.format local t3 = profile_timer() t3:start() local s for i=1, 1000000 do s = string.format("%s%s%s%s%s", a, b, c, d, e) end t3:stop() printf("string.format:=%s", t3:time()) end end Специально создание таблицы стрингов для 'table.concat' внес внутрь цикла, т.к. все же исходными являются именно строки, а шаг по формированию 'удобств' - это уже издержки самого выбираемого метода слияния. Имеем (для реального x-Rey Stalker:SHoC): Size=1:~~~~~~~~~~~~~~~~~~~~~~ table.concat : 382377.4375 strings_concat: 126710.90625 string.format : 849551.875 Size=25:~~~~~~~~~~~~~~~~~~~~~ table.concat : 560190.5625 strings_concat: 225513.09375 string.format : 2258268.75 Size=50:~~~~~~~~~~~~~~~~~~~~~ table.concat : 612529.625 strings_concat: 288320.59375 string.format : 3637614 Size=75:~~~~~~~~~~~~~~~~~~~~~ table.concat : 686650.125 strings_concat: 334355.90625 string.format : 5190542 Size=100:~~~~~~~~~~~~~~~~~~~~ table.concat : 687361.375 strings_concat: 373632.84375 string.format : 759546.75 Size=125:~~~~~~~~~~~~~~~~~~~~ table.concat : 1232452.5 strings_concat: 448679.375 string.format : 1306033.125 Size=150:~~~~~~~~~~~~~~~~~~~~ table.concat : 1321812.875 strings_concat: 502137.53125 string.format : 1403406.5 Варьируя различными значениями можно подтвердить для LUA в применении к Сталкеру, что; 1. Самым оптимальным является 'чистый' concat, т.е. применение оператора '..'; 2. Для коротких строк оптимальнее применять слияние строк при помощи 'table.concat', а не 'string.format'; 3. Самым медленным вариантом является "string.format', хотя для длинных строк (>=100) его проигрыш уже не очевиден. Изменено 7 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
7.9 174 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) Приехали... В общем, тут такое дело... Что делаем: 1. Создаём базовый CustomStatic с прикреплённым на него CUIStatic-ом, далее создаём ещё дополнительный CustomStatic. 2. Удаляем дополнительный CustomStatic, через апдейт удаляем прикреплённый CUIStatic, и удаляем базовый CustomStatic. Не срабатывает удаление прикреплённого CUIStatic-а. Вернее не совсем несрабатывает, а только сначала, то-есть, при первой загрузке, после запуска игры - скрипт всегда виснет, а при второй загрузке - всё работает как положено. Где-то косяк: или в алгоритме, или в коде. Мне такой затык "не по зубам". Прошу помощи. 1. начинаем "новую игру", получаем предмет, делаем сохранение на будущее. 2. активируем предмет (stco2) (клавиша "2"). 3. по клавише "6" долны переключаться экраны этого предмета - нажимаем. 4. скрипт "d2hud" виснет на 68 строке. 5. не выходя в систему загружаем сохранение. 6. активируем предмет stco2 (клавиша "2"). 7. всё работает как задумано. Не помогает: 0. проверка скриптов на ошибки. 1. увеличение числа апдейтов в задержке перед удалением прикреплённого CUIStatic. 2. перемещение всех функций в один файл (мало-ли!)... 3. устранение "load_string"-ов - замена на if... (мало-ли!)... 4. переход на другую локацию. 5. пережидание времени. "Проект" целиком (1.3МБ): _http://narod.ru/disk/24294526001/2DHUD(test).7z.html Если сохранится с зависшим скриптом - сейв будет битый. Вылет при загрузке такого сейва, если сразу после запуска игры: ... LUA error: i:\stalker1\gamedata\scripts\bind_stalker.script:397: attempt to concatenate field '?' (a nil value) если такой сейв попытатся загрузить не сразу, а после загрузки здоровых сейвов - вылет уже другой: ! Unknown command: ОШИБКА:SAVE_FILE_IS_CORRUPT ... LUA error: i:\stalker1\gamedata\scripts\_g.script:1125: attempt to call global 'exit' (a nil value) Добавлено: Версия игры: ТЧ 1.006. Изменено 7 Сентября 2011 пользователем Artos всё легко Ссылка на комментарий
Artos 99 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) 7.9 Из лога ошибки ('bind_stalker.script:397'): get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty]) - т.е. ошибка чтения уже первого байта из пакета актора ('game_difficulty'), а значит природа обоих вылетов едина - 'битый' сэйв. Просто неудачный вывод в лог (от разрабов) чуть раньше, чем прерывание по 'SAVE FILE IS CORRUPT' СтОит немного подправить в любом случае для любых модов, типа: if game_difficulty_by_num[game_difficulty] then get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty]) else abort("SAVE FILE IS CORRUPT: Error read game_difficulty") end - тогда не будет ругаться на конкатенацию и выдаст причину ошибки. ... остальное позже, требуется анализ кодов. Изменено 7 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
gruber 2 481 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) Artos, Да пост относился именно ему,т.к. был постом раннее.И из сообщения нельзя было понять ,что именно он хотел сделать,может ему нужно было,чтоб нпс просто находился в одном из домов. П.С. если что то для вас лично -не информативный пост,это не значит,что для остальных так же.Для меня все ваши и большинство постов в теме ,совершенно не информативные,так как в скриптах я ноль. Читаем в вопросе: KASIMKA: ... Столкнулся с проблемой: нпс не хотят заходить в некоторые дома ... И что тут непонятного? Если непонятно что-то в вопросе - это не повод флудить на тему ... Ну а если в чем-то 'ноль' (по собственному признанию) - не следует выказывать своих суждений, а то становишься схож с персонажем басни дедушки Крылова "Мартышка и очки". --/ Artos [x] Изменено 7 Сентября 2011 пользователем Artos Ссылка на комментарий
Nazgool 250 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 Artos Наверное следует вспомнить про дедушку Эйнштейна. Если смотреть относительно заранее проинициализированных строками переменных, то простая конкатенация конечно будет работать быстрее, чем tаblе.соnсаt, для использования которого необходимо понести накладные расходы на создание массива. Если же смотреть относительно заранее созданой таблицы с массивом конкатенируемых строк, то быстрее будет tаblе.соnсаt, т.к. расход понесет простая конкатенация, для выполнения которой нужно выбирать значения из таблицы. В общем нужно исходить из конкретных ситуаций. Ссылка на комментарий
Artos 99 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) 7.9 Суть твоей ошибки: 1. Строкою: st = get_hud():AddCustomStatic("d2hud", true) - ты создаешь объект кастомстатика 2. Приаттачиваешь свою страничку (page_static) строкою: st:wnd():AttachChild(page_static) - Внимание! st:wnd() - это новый объект 'окно', т.е. ты приаттачиваешь не к 'st', а к его дочернему объекту ( 'wnd()' ). 3. Отключаешь свою страничку (page_static) строкою: st:wnd():DetachChild(page_static) - Внимание! Тут уже от родительского 'st' создается НОВЫЙ объект 'окна' st:wnd(), который совершенно иной, чем тот, к которому ты приаттачивал ранее. В результате возникает фатальная ошибка попытки отключить то, что не было приаттачено -> зависает биндер актора (поток, откуда был вызов) -> рушатся сэйвы (пакет актора некому сохранять). Решение: Работать только с одним и тем же объектом окна. При создании 'st', запоминать не его, а сразу объект его 'окна', типа: st_wnd = get_hud():AddCustomStatic("d2hud", true):wnd() - и уже далее работать именно с ним (st_wnd). И удалять именно его. Примечание: Удалять созданное 'st_wnd' нужно в обязательном порядке при любом выходе из игры. Если не удалять принудительно - перезагрузка сэйва без выхода в ОС может приводить к аналогичным фатальным ошибкам, т.к. объект 'st_wnd' не уничтожается чистильщиком LUA. Добавлено через 32 мин.: Gun12 Полностью согласен с тем, что всегда требуется учитывать контекст (конкретику), почему редко стараюсь давать полные варианты ответов, т.к. всего не учесть ... Но в данном конкретном случае, даже вынесение из цикла подсчета времени формирования таблицы для табличного слиятия (table.concat) и принудительная конкатенация операторами '..' выборкой из из сформированной таблицы (s = tb[1]..tb[2]..tb[3]..tb[4]..tb[5]) - все одно приводит к одному и тому же результату: конкатенация операторами более чем в 2 раза быстрее любого другого метода. Т.е. даже заведомое использование 'родной' заранее подготовленной таблицы со строками для "table.concat' и принудительное ее использование для 'обычной' (что добавляется к времени обычной конкатенации операторами '..') не приводит к преимуществам 'табличной конкатенации'. Изменено 7 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
7.9 174 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) Но тогда получается, что этот эффект обусловленный - ведь после второй загрузки всё находится и удаляется корректно. Почему? Возможно, что-бы такая ситуация была временной - до второй загрузки? Не готов ответить. Причуд у движка сталкера немало ... Порой приходится эмпирически искать, и если решение есть - стОит ли тратить время на объяснения причуд? Все одно только предполагалки возможны. Будет время - подумаем ... поищем. :-) --/ Artos Точно, я ведь в динамическихиндикаторах так и делал... hud_power = hud:GetCustomStatic("hud_power_level"):wnd() но в этом случае так не сделал... Видимо, "не знал и забыл" Буду пробовать... Изменено 7 Сентября 2011 пользователем Artos всё легко Ссылка на комментарий
_Призрак_ 11 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) Раз уж зашел разговор о UI то у меня тоже давно был вопрос как с кастом статика убрать текстурку? Я создал статик и установил текстуру: self.picture = xml:InitStatic("picture", self) self.picture:InitTexture("ui\\ui_disk_io") Но как теперь убрать эту текстуру со статика? Вариант 1: Убить старый объект и пересоздать без инициализации текстуры; Вариант 2: Заменить прежнюю текстуру на 'пустышку' иль на прозрачную; Вариант 3; Установить размер текстуры/окна в 1 пиксель ... --/ Artos Изменено 7 Сентября 2011 пользователем Artos Freedom Ссылка на комментарий
Nazgool 250 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 Artos Мои результаты в тесте (пост #320 стр.16 "Справочника") говорят об обратном. Concat оказался быстрее. Не на много, но факт. Ссылка на комментарий
Artos 99 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) Gun12 Если результаты разнятся - значит есть различия в условиях тестирования ... их нужно или устранять или учитывать. Я убираю различные субъективные причины: версия интерпретатора LUA на компе, его надстройка в SciTE (и пр.), оставив только то, что имеет отношение к собственно игре (к встроенному интерпретатору LUA). Воспроизвести эту функция (аналог твоей) может каждый, даже не запуская игру (подключив в '_g'), а только выйдя в основное меню: function test_concat() --/ предустановки local size = {1,25,50,75,100,125,150,175} --/ кол-ва символов local a,b,c,d,e,s,tb,t1,t2,t3 --/ объявление переменных for k,v in ipairs(size) do --/ циклы проверки с различной длиной строк --/ (пере)учтановки a = string.rep("a",v) b = string.rep("b",v) c = string.rep("c",v) d = string.rep("d",v) e = string.rep("e",v) tb = {a, b, c, d, e} --/ таблица для 'table.concat' printf("Size=" .. tostring(v) .. ":" .. string.rep("~",22)) --/ table.concat t1 = profile_timer() t1:start() for i=1, 1000000 do s = table.concat(tb) end t1:stop() printf("table.concat:=" .. tostring(t1:time())) --/ strings concat t2 = profile_timer() t2:start() for i=1, 1000000 do -- s = a .. b .. c .. d .. e s = tb[1] .. tb[2] .. tb[3] .. tb[4] .. tb[5] end t2:stop() printf("strings_concat:=" .. tostring(t2:time())) --/ string.format t3 = profile_timer() t3:start() for i=1, 1000000 do s = string.format("%s%s%s%s%s", a, b, c, d, e) end t3:stop() printf("string.format:=" .. tostring(t3:time())) end end и Size=1:~~~~~~~~~~~~~~~~~~~~~~ table.concat : 378829.9375 strings_concat: 115101.3671875 string.format : 885728.75 Size=25:~~~~~~~~~~~~~~~~~~~~~~ table.concat : 556410.875 strings_concat: 239722.640625 string.format : 2280955.75 Size=50:~~~~~~~~~~~~~~~~~~~~~~ table.concat : 614913.9375 strings_concat: 290451.71875 string.format : 3658724.5 Size=75:~~~~~~~~~~~~~~~~~~~~~~ table.concat : 685291.0625 strings_concat: 352517.84375 string.format : 5199886 Size=100:~~~~~~~~~~~~~~~~~~~~~~ table.concat : 692421.5 strings_concat: 379044.0625 string.format : 778628.3125 Size=125:~~~~~~~~~~~~~~~~~~~~~~ table.concat : 1130261.5 strings_concat: 460861.65625 string.format : 1249460.5 Size=150:~~~~~~~~~~~~~~~~~~~~~~ table.concat : 1326386.75 strings_concat: 493378.875 string.format : 1415757 Size=175:~~~~~~~~~~~~~~~~~~~~~~ table.concat : 1426552.75 strings_concat: 569790.5625 string.format : 1558606.125 - как видно есть различия с твоими результатами ... Остается - набирать статистики в одинаковых условиях. Изменено 7 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) _Призрак_ local sp = self.picture:InitTexture("ui\\ui_disk_io") self.sp:Show(False) не пробовал? Приведет к фатальной ошибке. Локальная 'sp' никак не определяет 'self.sp', применение к которой любого метода приведет к ошибке с nil'ом --/ Artos В крайнем случае, если такой метод не работает, инициализируй картинку отдельно от self.picture: self.sp = xml:InitTexture("ui\\ui_disk_io") self.sp:Show(false) Метод 'InitTexture' недоступен для об'ектов класса 'CScriptXmlInit'. --/ Artos Один из двух методов точно будет работать, а результат врятле изменится. Я кстати не понимаю, в чём принципиальная разница между InitTexture и InitStatic? Изменено 7 Сентября 2011 пользователем Artos Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 *Shoker* Воздержись от ответов на вопросы в которых сам 'плаваешь'. Разница между 'InitTexture' и 'InitStatic' достаточно огромна. Тебе следует поискать ответ в "Справочник по классам и функциям". Кратко: 'InitStatic' - метод только для класса 'ScriptXmlInit', подразумевающего использование xml-файлы в качестве основы/параметров. Инициализирует/создает (для CUIWindow) дочерний объект класса 'CUIStatic'. 'InitTexture' - метод, доступный для многих CUI-классов, которым инициализилуется/подключается заданная текстура (иль ее аналог). "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
_Призрак_ 11 Опубликовано 7 Сентября 2011 Поделиться Опубликовано 7 Сентября 2011 (изменено) Как поставить машину на тормоз? Ситуация такая: Спавню машину около остановки на Кордоне. Там небольшой склон. Рядом с машиной обязательно во время боя взрывается пара гранат. Из-за них машина в 100% случаях машина скатывается в овраг. Как бы мне сделать так чтобы машина не скатывалась в овраг от каждой шальной пули? Для Artos'а Ты сейчас скажешь что изначально машина спавнится точно по координатам и на нее не действуют законы физики и только когда по машине наносится хит, законы физики начинают на нее действовать, и она скатывается. Но у меня при старте игры наносится всем машинам хиты и машина при старте стоит нормально, она откатывается именно от взрывов других машин и от взрывов гранат. Не знал, что на форуме имеются оракулы-предсказатели. Бум иметь ввиду и вместо 'Кашпировсого' направлять по адресу ... Может не стОит за меня что-то предсказывать и заранее приписывать что я могу сказать?! --/ Artos Я ни в коем случае не хотел тебя оскорбить, я просто хотел сказать что я предусмотрел этот вариант Оскорбить и рассердить - разные вещи, но в любом случае не стОит заранее думать и говорить за другого ... --/ Artos Изменено 7 Сентября 2011 пользователем Artos Freedom Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти