Artos 99 Опубликовано 3 Ноября 2012 Поделиться Опубликовано 3 Ноября 2012 Gun12, ну ты уж не придирайся , Callisto уже сама поняла и назвала "ересью"... Да и причина вероятно не в Lua-ошибках (привнесенных позже), а в переполнении стека из-за того, что целую игровую минуту с частотою апдейта актора запускались проигрываться объекты одного и того же звука... "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Jein 12 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Всем привет. Стоит задача вывести строку времени на ПДА. Имеется готовая функция от тов. Artos'а: function show_time() --------------------------------------------------------------------------------- local clock = true -- (true\false) - включение\выключение показа часов на HUDе --------------------------------------------------------------------------------- local hud = get_hud() if clock == true then local cs = hud:GetCustomStatic("hud_show_time") if cs == nil then hud:AddCustomStatic("hud_show_time", true) cs = hud:GetCustomStatic("hud_show_time") end local time_h = level.get_time_hours() - "2" local time_m = level.get_time_minutes() local msg if time_m >= 10 then msg = string.format(" %02d:%02d\n", time_h, time_m) else msg = string.format(" %02d:%02d\n", time_h, time_m) end if cs ~= nil then cs:wnd():SetText(msg) end end end Также в скрипте есть функция которая "ловит" момент открытия ПДА и вызывает функцию времени. ]function PdaOpen() oHelpWnd = CHelpWindow() oPda = level.main_input_receiver() my_show_time.show_time() .... В ui_custom_msgs.xml строка времени уже описана. В результате на самом худе время есть а вот в ПДА строка никак не хочет появляться. "Перехватчик" открытия ПДА работает исправно, после него я добавлял текст с помощью CUIStatic() - текст на ПДА появляется без проблем. А вот строка времени - не хочет. Прошу помощи. Изменено 4 Ноября 2012 пользователем Jein Ссылка на комментарий
Viнt@rь 50 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 Jein, не пробывал время выводить не через кастом статик, а через CUIStatic()? сам пытался сделать подобное(только в окне инвентаря на ЗП) то кастом статиком ничего не добился, в смысле добился, но мой текст был под окном инвентаря... GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Artos 99 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Jein, у тебя выходит как в известной поговорке "В огороде бузина, а в киеве - дядька". Если ты, сформировав строку о времени, выводишь ее с помощью кастомстатика на экран - то с какого такого барабана ждать, что она появится в ПДА? Если требуется чтобы именно в ПДА появилась строка времени - то и выводи ее именно туда, а не на игровой экран. Т.е. посмотри как это делается в исходной игре иль модах при помощи: db.actor:give_talk_message(text, ...) и не заморачивайся с кастом-статиком. P.S. Если же вопрос о выводе в некий доп.элемент на интерфейсе ПДА - то тут уже через CUIStatic(), как подсказал Viнt@rь, и приаттачивать... Viнt@rь, если требуется выводить поверх другого окна, которое обновляется - то или тоже требуется обновлять свою надпись (после обновления подложки) или аттачить свой статик к основному окну... Изменено 4 Ноября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Jein 12 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 Viнt@rь, Artos - кастомное время мне нужно выводить на месте стандартного. С помощью CUIStatic() вывести время у меня получилось без проблем. Поэтому исходя из ваших советов и моих экспериментов - получается что CUIStatic() самый подходящий вариант?? Но здесь встает другой вопрос - дело в том что строка времени выведенная через CUIStatic() статическая, то-есть время не "идет". Получается что нужно как-то обновлять CUIStatic() через апдейт или с помощью цикла. И вот вопрос - как это лутше сделать? К примеру бесконечный цикл в котором крутился бы CUIStatic() вешает игру. Ссылка на комментарий
Viнt@rь 50 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Artos, если требуется выводить поверх другого окна, которое обновляется - то или тоже требуется обновлять свою надпись (после обновления подложки) или аттачить свой статик к основному окну... обновлял(на апдейте актора постоянно, но статик не вылазил на верх...) потому ИМХО самый лучший выход это ...тут уже через CUIStatic()...и приаттачивать... Jein, я точно не уверен, но по идее должно помочь: пример(ЗП) class "CSpNotepad" (CUIScriptWnd) ... function CSpNotepad:Update() CUIScriptWnd.Update(self) self.wClock:TextControl():SetText(GetTime()) end ... Вот примерно таким методом можно обновлять свой эелемент/окошко Изменено 4 Ноября 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Artos 99 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Jein, не нужно надеяться простенькими "штатными" способами сделать то, на что разработчики не расчитывали, т.е. замещать индикацию "штатного" времени "своим". Тебе требуется создать свой CUIStatic() и приаттачить его в нужное место к окну ПДА. Ну а далее, создав объект своего "окошечка" - выводить в него нужную информацию, при необходимости обновляя ее (в твоем случае раз в игровую минуту). Это уже в общем-то отработанный алгоритм, примеры которого можно найти в модах, где свои "окошки" добавлены. Вопрос в общем-то не очень прост, т.к. придется озаботиться и корректным деаттачем своего окошка при завершении/перезагрузке игры. Viнt@rь, наверное нужно было догадаться, что апдейт акторских окошек (инвентаря и т.п.) происходит аналогично циклам апдейта в биндере актора, но после(!) него, т.е. апдейтить (пересоздавать) кастомстатик нужно после "оконных" апдейтов. Но это уже начинаем муссолить очевидное, тем более, как уже написал выше - есть нормальный (независимый) альтернативный вариант. P.S. Использовать штатный метод апдейта для созданного объекта CUIStatic() для ПДА нецелесообразно, ИМХО. И ПДА редко когда открывается и изменения времени - раз в минуту. Имея созданный объект можно просто в нужное время в нем менять/перезаписывать информацию... Изменено 4 Ноября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Jein 12 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 Jein, .... P.S. Использовать штатный метод апдейта для созданного объекта CUIStatic() для ПДА нецелесообразно, ИМХО. И ПДА редко когда открывается и изменения времени - раз в минуту. Имея созданный объект можно просто в нужное время в нем менять/перезаписывать информацию... То есть, ты предлагаешь не использовать метод апдейта, а обновлять объект таймером? Ссылка на комментарий
Viнt@rь 50 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 Jein, да он это и имеет ввиду) обновлять с апдейта актора раз в 1 мин игрового времени(тебе же секунды не надо выводить) GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Artos 99 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Jein, алгоритм может быть аналогичным как в модуле m_backpack.script (из SIMBION-мода), только относительно окна ПДА, а не инвентаря. При первом открытии окна создается объект (в твоем случае для вывода времени). Далее (пере)запускается таймер и раз в минуту информация в этом окне обновляется. Таймет может быть хоть от апдейта актора, хоть от иного, тут не важно, главное чтобы минуты в нужное время сменялись. Ну а по закрытию окна ПДА - таймер останавливается (деактивируется), экономя ресурсы. Объект окна можно или оставлять и использовать при следующем открытии ПДА, или каждый раз создавать новый, естественно тогда деаттачивая и удаляя прежний. Да и строку времени неплохо бы формировать не давно "устаревшей" функцией (неудачно примененной в исходном варианте), а немного иначе: str = game.get_game_time():timeToString(1) --/ TimeToMinutes (23:59) или даже более приближенно к строке времени в ПДА: str = game.get_game_time():timeToString(1) .." " .. game.get_game_time():dateToString(0) --/ TimeToMinutes+DateToDay (23:59 01/01/2012) P.S. Ну а если требуется "сместить" время относительно "штатного", то как раз можно game.get_game_time() заменить на тикающий свой CTime и от него и апдейтить и строки времени формировать. Изменено 4 Ноября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Jein 12 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Viнt@rь, Artos спасибо за разъяснения. Вот только боюсь что строку времени предложенную Artos'ом я не знаю как править, ведь мне нужно "сдвинуть" время на час или на два назад. В конструкции вида local time_h = level.get_time_hours() - "2" все предельно ясно. Я просто отнимаю 2 часа, а в выше изложенном варианте я не знаю как это сделать. И второй вопрос. Решил я функцию времени вынести в другой файл для удобства работы, вот она: function show_time() local oPda = level.main_input_receiver() local time_h = level.get_time_hours() - "2" local time_m = level.get_time_minutes() local msg if time_m >= 10 then msg = string.format(" %02d:%02d\n", time_h, time_m) else msg = string.format(" %02d:%02d\n", time_h, time_m) end oShow_time = CUIStatic() oShow_time:SetAutoDelete(true) oPda:AttachChild(oShow_time) oShow_time:SetStretchTexture(true) oShow_time:SetWndRect(600, 692, 145, 27) oShow_time:SetText(msg) end и начал получать вылет с логом [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...:\s.t.a.l.k.e.r\gamedata\scripts\my_show_time.script:18: attempt to index local 'oPda' (a nil value) из лога я понимаю что переменная oPda не имеет значения, но вот что с ней делать? Что нужно ей присвоить? Забыл сказать что сейчас функция show_time() прописана в function actor_binder:update(delta). А если выкинуть ее из апдейта - ошибка пропадает. Изменено 5 Ноября 2012 пользователем ColR_iT Ссылка на комментарий
Artos 99 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Jein, уже писал выше, что "простенько" не получится и от тебя потребуется поглубже вникать в скрипты. Во-первых, твое упрощенное: local time_h = level.get_time_hours() - 2 начинает врать в первых минутах-часах суток, т.е. вместо 23:00 покажет -01:00 и т.п. Во-вторых, почитав мануалы, статьи и примеры в модах, можно найчиться управляться с классом CTime, задавая и нужное время и формируя нужные строки. Если ждешь готового кода - то ... это не ко мне, а от кого-то иного. Кучку готовых функций можно увидеть в m_hlp.script уже упоминавшегося выше мода. Ну и в третьих, тебе требуется научиться работе со скриптами, в частности создавать, запоминать объекты и в нужное время к ним обращаться. Тот же объект окна ПДА ('oPda') - тебе не просто один раз нужно получать и аттачить к нему свое ('oShow_time'), но и деаттачить в конце. А для этого и окно ПДА нужно помнить и объект созданного окна ('oShow_time'), Так же потребуется и объект таймера помнить, чтобы от него время отсчитывать, а не каждый раз заново создавать.. Ты же пока идешь по тупиковому пути, плодя новые окна - так никаких ресурсов игры не хватит. В общем удели время общим скриптовым вопросам и потренируйся для получения навыка, иначе не ты что-то будешь моддить, а за тебя "дядя"... Изменено 4 Ноября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Jein 12 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Artos, ну на счет того что все будет просто я и не надеялся. А моддингом я вообще-то и не собирался углубленно заниматься. Просто есть желание пройти мод LWRToD в связке с погодой SWTC - но видя, в первые часы игры определенные несуразности решил их поправить. И даже думаю моих мелких правок, если они конечно получатся, мне хватит дабы с покойной душой пройти мод. Ну так подскажешь проблему с вылетом? Изменено 4 Ноября 2012 пользователем Jein Ссылка на комментарий
Viнt@rь 50 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) так мб, если разница в не совпадении времени с погодой, стоит просто поправить погоду? это куда проще Изменено 4 Ноября 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Artos 99 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Jein, извини мою тупость, но не пойму, как может картинка (некие искуственные цифирьки) в окне ПДА влиять на прохождение мода? Время в игре и всё остальное подчиняется настоящему игровому времени и, если "сбитое время" тебе мешает иль помогает играть, то ... мне это не понять. И если нервирует ранняя ночь иль день то, как сказано выше - нужно именно сместить циклы погоды, а не стрелки на своих часах переводить. Изменено 4 Ноября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Jein 12 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Вообще- то по жизни я очень дотошный. Поэтому видя на худе время 21:00, а в игре еще светло как днем то меня это начинает раздражать. Вот по этому весь этот сыр-бор из-за времени завелся. А потом по рысскав по теме моддинга, я наткнулся на твою же функцию времени (которую ты создал года два назад) и увидел как с помощью этой функции легко реализуется время на худе - ну и загорелся. А Ирбис кстати твою функцию и заюзал, в ЛВР через нее реализовал время на худ. Я то и решил что это можно будет сделать самому. Мне ведь и не в домек что разница между ХУДом и ПДА или ИНвентарем ой как велика. Хотя спасибо Ирбису, он в своем моде скриптами достаточно много переработал функций ПДА - чего и в помине нет в чистом СТалкере. Я вообще был удивлен что в чистом Сталкере нет даже скриптов ПДА Изменено 4 Ноября 2012 пользователем Jein Ссылка на комментарий
Artos 99 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Jein, пора прекращать оффтопик... Сочувствую твоей дотошности, но ... тут или твоя дотошность должна быть подкреплена твоими же действиями или ... не такой уж ты и дотошный Упомянутая старенькая функция выполняет именно то, что должна, т.е. отображать действительное время, и не предназначена для "смещения" (о том как врет при смещении - уже упоминал). Так что именно дотошность и должна заставить делать как нужно, а не как 'можется'. И, если всего-то раздражает светлый вечер иль темное утро - то именно дотошность должна направить в сторону изменения временных циклов погоды, а не "замазывать" время, надевая себе шоры. Ведь, даже преодолев трудности со скриптами, ты то будешь видеть искаженное время, но боты в игре и все остальные события - все одно по действительному в игре времени будут работать. Меня бы гораздо больше раздражало бы, если я что-то видел/сделал в 7 часов вечера, а в том же ПДА была бы запись, что это было в 21:00 ... Изменено 4 Ноября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Viнt@rь 50 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Jein, только скриптами, только ХардКор :grin2: :grin2: :crazy: ПДА - чего и в помине нет в чистом СТалкере. Я вообще был удивлен что в чистом Сталкере нет даже скриптов ПДАх Потому что он вшит в двигло! Изменено 4 Ноября 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Jein 12 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Ладно ребята, не буду больше офтопить, Спасибо вам за подсказки - придется как-нибудь самому вариться. А по-поводу шор, Artos, так это твое было предложение, сдвинуть время с помощью подмены. Вот этот пост http://www.amk-team....460#entry734985 Ну а я за твой совет и ухватился. Еще раз спсибо за советы. Извините если что не так. Изменено 4 Ноября 2012 пользователем Jein Ссылка на комментарий
Artos 99 Опубликовано 4 Ноября 2012 Поделиться Опубликовано 4 Ноября 2012 (изменено) Ответ соответствовал вопросу и уже там же было сказано не просто так: Вот только как и в реальной жизни, человеко-монстры все одно живут в Зоне по "солнечным" часам...Поэтому, или без "правки погодных конфигов" невозможно "сдвинуть время, что бы позже светало и раньше темнело" или ты надеваешь игроку шоры и он играет по "своему сдвинутому" времени, а игра идет по своему. Изменено 4 Ноября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти