Artos Stalk15 Немного не то. SetItemHeight() задаёт высоту каждой сроки, и никак не влияет на высоту листа. То
отредактировал(а) singapur22: 17-05-2011 14:24 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Не соглашусь с "Немного не то", это просто два равноправных варианта.
(Не)удобство выставлять нужные параметры в скриптах или xml'ках - дело вкуса и зависит от конкретного применения. При создании динамических меню/худов порою xml'ками не добьешься нужного результата.
В своем ответе сделал упор на скрипты, т.к. Stalk15 выложил именно скрипт и все можно сделать/поправить именно в нем.
По сути:
1. Базой является размер окна скролла и задается:
а) x="220" y="50" width="365" height="340" - в xml'ке
б) self.list_items:Init(220,50,265,340) - скриптом
2. Кол-во строк, которые будут отображаться вычисляется просто: высота окна делится на высоту стороки для итемов. Изменяя высоту строк:
а) item_height="20" - в xml'ке
б) self.list_items:SetItemHeight(20) - скриптом
- выбираем сколько строк хотим видеть в выбранном окне скролла, конечно же учитавая размер выбранного скрипта:
а) font="letterica18" - в xml'ке
б) self.list_items:SetFont( GetFontLetterica16Russian() ) - скриптом
Если учесть, что кто-то играет на разрешении 1024x768, а кто-то 1920x1200 - выбор использования фиксированных xml'ек или скриптов ... ;-)
Artos Вкусы вкусами, но я не считаю рациональным выводить в скрипты статические параметры. Другое дело, когда планируется динамическое использование. Вот представь, у меня щас на данный момент вкладка спавнера в проекте, при наличии 28 элементов, имеет размер в 613 строк. Где около 10% комменты. И это при том, что я стараюсь не использовать в скриптах то, что можно задать в xml. А теперь представь, какого размера был бы скрипт, если бы я вывел в него все возможные параметры. :blink Такой код явно бы тяжело читался. Статичные параметры просто напросто бы мешали.
И на счёт разрешения. Каким бы оно нибыло, в 90% случаев, лишь требуется изменять положение окна, что в скриптах занимает лишь одну строчку, так как сам размер окна обычно не превышает 900Х600 пикселей.
P.S.
Кстати, я играю на разрешении 1024x768. И это при мониторе ('19). А вся проблема в том, что любые другие разрешения в игре настроены некорректно. В итоге изображение или слишком растягивается, или чересчур сжимается. Разрешение 1024x768, нахожу самым оптимальным для монитора с соотношением (8/5).
отредактировал(а) singapur22: 17-05-2011 15:34 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
"я не считаю" - это и есть 'вкус' ...
А если кто-то, например я, считаю иначе? :-)
В таких случаях только аргументация может что-то разруливать.
Ты приводишь свою, я свою. Пока вроде бы НЕТ разноглачий в том, что можно использовать и xml'ки и скрипты.
Далее, ты критикуешь скрипты ... Позволю и я немного покритиковать xml'ки.
1. То, что можно сделать скриптами - порой невозможно в xml'ках.
2. Если можно сделать одним файлом (скриптом) - так ли уж нужно использовать второй (xml)?
3. О динамичности скрипта и статичности xml - уже упоминалось.
...
О спавнере:
1. Тоже писал спавнер, его упрощеный вариант (спавн-меню) можно посмотреть в пакете к NLC6.008. Начинал вероятно с того же, что и у тебя, кучка xml'ек и кучка скриптов. ... В итоге остался один скрипт + ltx'шка-конфиг. Избавился от всех xml'ек.
Тебе же хорошо известно, что кол-во кода, кол-во строк и пр. , в том числе и его читабельность, зависит в первую очередь от алгоритма!
2. Не в обиду (т.к. понимаю, что при написании черновика порой проще по-кусочкам), но взяв твой вариант"Mobile_Manager" решил посмотреть 'в работе'. Начал прикручивать ... в итоге получил один скрипт гораздо короче твоих исходных и небольшой файлик xml - остаток от твоих.
...
О разрешении: Можно вообще ничего не менять, но ... имея широкоформатник и используя 1920x1200 - я (особенно в инструментарии) правлю и картинки, и кнопки, и шрифты, и многое прочее...
P.S. Считаю наоборот: следует не подстраиваться под разрешение которое лучше остальных доработали разрабы, а выжать из доступного все под то разрешение, в котором мне удобнее.
И если даже нам разрабы дали только 4:3 и 16:10, то в моде уже веду работы по автоподстройке под 5x4 и 16x9, т.к. немало уже игроков и на ноутах играются.
Кстати, хотел подсказат/напомнить: в твоем ММ часто используется конструкция:
SetText(game.translate_string(string)
которая эквивалентна:
SetTextST(string)
Artos Ну я вроде не критикую создание менюшек только через скрипт. Маленькие менюшки (с низким функционалом) вполне обходятся и без xml'ек. Но если меню с множеством страниц и элементов, тут без них просто не обойтись. Очень хорошо помогают авто-теги, для оформления статического визуала, которые не нужно инициализировать через скрипт, а достаточно прописать в xml'ке.
1. То, что можно сделать скриптами - порой невозможно в xml'ках.
Не спорю. Но есть ситуации и наоборот. Например класс CUIScrollView() просто требует наличие xml'ки, без неё он просто не инициализируется.
2. Не в обиду (т.к. понимаю, что при написании черновика порой проще по-кусочкам), но взяв твой вариант"Mobile_Manager" решил посмотреть 'в работе'. Начал прикручивать ... в итоге получил один скрипт гораздо короче твоих исходных и небольшой файлик xml - остаток от твоих.
Как ты сам сказал, это действительно пока черновая работа, и пишется с возможностями расширения в различных направлениях. А в некоторых случаях, просто на скорую руку. Улучшение и упрощение кода будет производиться в самую последнюю очередь. Когда всё задуманное будет реализовано в полной мере.
Считаю наоборот: следует не подстраиваться под разрешение которое лучше остальных доработали разрабы, а выжать из доступного все под то разрешение, в котором мне удобнее.
Ну тут уже бесполезно чтото изменять. Привык к данному формату уже на столько, что просто не смогу работать при другом. Стажа 3 года, не шутка. :-)
Кстати, хотел подсказат/напомнить: в твоем ММ часто используется конструкция:
SetText(game.translate_string(string)
которая эквивалентна:
SetTextST(string)
Огромное спасибо за Подсказку!!! А до меня всё никак не доходило, чем он вообще отличается?! ;-)
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
- по сути это выборка, пополнение листами/списками делается за 5 минут ... практически только в конфиге.
А это код (без хелпов) для худа, который все эти 15 листов-списков крутит:
[code]
--/ -----------------------------------------------------------------------------------------------
class "UI_SpawnMenu" (CUIScriptWnd)
--/ -----------------------------------------------------------------------------------------------
function UI_SpawnMenu:__init() super()
if not bInit then init() end
self.wide = device().width/device().height > 1.333
self:InitControls()
self:InitCallBacks()
end
function UI_SpawnMenu:InitCallBacks()
for i=1,#tSpawnMenu do
self["OnButton_"..i] = function() self:Get_MenuDlg(i) end
self:AddCallback("btn_"..i, ui_events.BUTTON_CLICKED, self["OnButton_"..i], self)
end
self:AddCallback("btn_pic", ui_events.BUTTON_CLICKED, self.OnList, self)
self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.OnQuit, self)
end
function UI_SpawnMenu:OnKeyboard(dik, keyboard_action)
local bRes = CUIScriptWnd.OnKeyboard(self, dik, keyboard_action)
if bRes == false then
local bind = dik_to_bind(dik)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
self:OnQuit()
end
end
end
return bRes --/>
end
function UI_SpawnMenu:OnQuit()
--/ возврат: закрываем окно диалога
if self:GetHolder() then
if self.owner then self:GetHolder():start_stop_menu(self.owner, true) end
self:GetHolder():start_stop_menu(self, true)
if self.owner then self.owner:Show(true) end
end
if this.Check_Game() then --/ если в игре
get_console():execute("main_menu off") --/ закрываем игровое меню
end
end
--/ -----------------------------------------------------------------
--/ Menu
--/ -----------------------------------------------------------------
function UI_SpawnMenu:Get_MenuDlg(iNum)
if not self.spawn_dlg then self.spawn_dlg = {} end
if not self.spawn_dlg[iNum] then
self.spawn_dlg[iNum] = UI_SpawnDlg(iNum)
self.spawn_dlg[iNum].owner = self
end
self:GetHolder():start_stop_menu(self.spawn_dlg[iNum], true)
self:GetHolder():start_stop_menu(self, true)
self:Show(false)
end
function UI_SpawnMenu:OnList()
this.Debug_Spawn()
self:OnQuit()
end
--/ -----------------------------------------------------------------------------------------------
class "UI_MySpawn" (CUIScriptWnd)
--/ -----------------------------------------------------------------------------------------------
function UI_MySpawn:__init(owner) super()
self.owner = owner
self.to_actor = nil
self:InitControls()
self:InitCallBacks()
end
function UI_MySpawn:InitCallBacks()
self:AddCallback("box_edt", ui_events.EDIT_TEXT_CHANGED, self.OnButton_change, self)
self:AddCallback("btn_act", ui_events.BUTTON_CLICKED, self.OnButton_spawn, self)
end
function UI_MySpawn:OnButton_change()
local sStr = self.box:GetText() or ""
local iClassId = sStr:len() >= 3 and this.Get_ClassId(sStr)
if iClassId then
self.note:SetTextST(this.Get_Name(sStr) or "")
self.note:SetTextColor(255,128,255,128)
self.act:Show(true)
local sInvName = this.Get_InvName(sStr) or ""
if sInvName ~= "" then
self.chk:Show(true)
if self.to_actor == nil then
self.to_actor = true
self.chk:SetCheck(true)
end
end
elseif self.act:IsShown() then
self.note:SetText("... или введите свою секцию объекта")
self.note:SetTextColor(255,255,255,128)
self.act:Show(false)
self.chk:Show(false)
end
end
function UI_MySpawn:OnButton_spawn()
local sSection = self.box:GetText() or ""
if this.Get_ClassId(sSection) then
local iDist = 8
if self.chk and self.chk:GetCheck() then
iDist = 0 --/ спавн актору
elseif this.Get_InvName(sStr) ~= "" then
iDist = 1.5 --/ предмет: спавн рядом
end
this.Make_Spawn(sSection,iDist)
end
end
--/ -----------------------------------------------------------------------------------------------
class "UI_SpawnDlg" (CUIScriptWnd)
--/ -----------------------------------------------------------------------------------------------
function UI_SpawnDlg:__init(iNum) super()
self.menu = iNum and tSpawnMenu[iNum]
if self.menu then
self:InitControls()
self:InitCallBacks()
end
end
function UI_SpawnDlg:Update()
CUIScriptWnd.Update(self)
if not self.first_upd then
self.first_upd = true
if self.btn_chk then
self.btn_chk:SetCheck(true)
end
end
end
function UI_SpawnDlg:__finalize() end
function UI_SpawnDlg:InitControls()
--self:SetWndRect(Frect():set(0,0,1024,768))
self:Init(25,25,540,460)
self:SetAutoDelete(true)
--/ текстура
local background = CUIStatic()
background:SetWndRect(0,0,540,461)
background:InitTexture("ui_menu_options_dlg")
background:SetStretchTexture(true)
background:SetAutoDelete(true)
self:AttachChild(background)
--/ заголовок
local title = CUIStatic()
title:SetWndRect(45,10,300,33) --/SHOC
title:SetFont(GetFontGraffiti19Russian()) --/GetFontLetterica18Russian()
title:SetTextColor(255,216,188,140)
title:SetTextAlign(0)
title:SetText(self.menu.title or "Error!")
title:SetAutoDelete(true)
self:AttachChild(title)
--/ кнопки
local btn
local tP = {x=45,y=35,w=117,h=29}
local tD = self.menu.data
for i=1,#tD do
local x = tP.x + 119*math.floor((i-1)/10)
local y = tP.y + 30*i - 300*math.floor((i-1)/10)
btn = this.Get_Button(x,y,tP.w,tP.h)
if not (tD.text and tD.text ~= "") then
tD.text = this.Get_Name(tD.sect)
end
btn:SetTextST(tD.text)
self:AttachChild(btn)
self:Register(btn,"btn_"..i)
end
if self.menu.inv then --/ признак 'инвентарности' предмета
--/ ческ-кнопка
self.btn_chk = this.Get_CheckButton(45,405,52,21)
self.btn_chk:SetCheck(true) --/#?# TODO: дефорт не работает - разобраться!
self.btn_chk:SetText("<~OnActor")
self.btn_chk:SetTextColor(255,231,153,022)
self:AttachChild(self.btn_chk)
self:Register(self.btn_chk,"btn_chk") --/#?# а нужно?
end
--/ кнопка назад
btn = this.Get_Button(283,400,117,29)
btn:SetTextST("ui_mm_back")
self:AttachChild(btn)
self:Register(btn,"btn_back")
--/ кнопка выхода
btn = this.Get_Button(402,400,117,29)
btn:SetTextST("ui_inv_exit")
self:AttachChild(btn)
self:Register(btn,"btn_quit")
end
function UI_SpawnDlg:InitCallBacks()
for i=1,#self.menu.data do
self["OnButton_"..i] = function() self:Get_Spawn(i) end
self:AddCallback("btn_"..i, ui_events.BUTTON_CLICKED, self["OnButton_"..i], self)
end
--/ quit&back
self:AddCallback("btn_back", ui_events.BUTTON_CLICKED, self.OnBack, self)
self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.OnQuit, self)
end
function UI_SpawnDlg:OnKeyboard(dik, keyboard_action)
local bRes = CUIScriptWnd.OnKeyboard(self, dik, keyboard_action)
if bRes == false then
local bind = dik_to_bind(dik)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
self:OnQuit()
end
end
end
return bRes --/>
end
--/ Back
function UI_SpawnDlg:OnBack()
--/ закрываем окно меню, возврат в предыдущее
self:GetHolder():start_stop_menu(self.owner, true)
self:GetHolder():start_stop_menu(self, true)
self:Show(false)
end
--/ Quit
function UI_SpawnDlg:OnQuit()
--/ закрываем окно меню, возврат в предыдущее (или возврат в игру)
self:GetHolder():start_stop_menu(self.owner, true)
self:GetHolder():start_stop_menu(self, true)
self.owner:Show(false)
if this.Check_Game() then --/ если в игре
get_console():execute("main_menu off") --/ закрываем игровое меню
end
end
function UI_SpawnDlg:Get_Spawn(iNum)
local sSection = self.menu.data[iNum].sect
local iDist = self.menu.data[iNum].dist or 8
if self.btn_chk and self.btn_chk:GetCheck() then
iDist = 0 --/ спавн актору
elseif self.menu.inv or this.Get_InvName(sStr) ~= "" then
iDist = 1.5 --/ предмет: спавн рядом
end
this.Make_Spawn(sSection,iDist)
end
--/ -----------------------------------------------------------------
--/ HELPERs
--/ -----------------------------------------------------------------
function get_ui_menu()
-- printf("get_ui_menu:[%s]", ">") --/#~#
if not spawn_menu then
spawn_menu = UI_SpawnMenu()
end
return spawn_menu --/>
end
--/ ---------------------------------------------
function Get_Button(x,y,w,h)
local btn = CUI3tButton()
btn:Init(x,y,w,h)
btn:InitTexture("ui_button_ordinary")
btn:SetStretchTexture(true)
btn:SetTextAlign(2) --/ Left|Right|Center: 0|1|2
btn:SetAutoDelete(true)
return btn --/>
end
function Get_CheckButton(x,y,w,h)
local btn = CUICheckButton()
btn:Init(x,y,w,h)
btn:InitTexture("ui_checker")
btn:SetTextureOffset(5,0)
btn:SetTextAlign(0)
btn:SetAutoDelete(true)
return btn --/>
end
[/code]
- и все это без xml под ТЧ/ЧН/ЗП (списки в конфигах конечно имеют различия).
Stalk15
1. Ты определяешь и активируешь окно для списка, выставляя область активности:
210" stretch="1">
т.е. высота активного окна равна 210
В то же время, кнопки управления, которые приаттачены к этому окну:
self:Register(xml:Init3tButton("list:btn_select", self), "btn_select")
расположил по координатам: 230" width="117" height="29">
Stalk15 А для какой цели ты дважды инициализируешь список,**5001618d69873ce82a42**инициализация
self.list_items:Init(27,20,255,150) --вторая инициализация[/code]
Второе, не зачем задавать размер окна через Frect(), если нет на то причины. Метод SetWndRect() вполне может принимать и прямое указание координат: self:SetWndRect(200,177,400,400)
И третье, раз работаешь со писком, где нужно выбрать оконечный результат, то добавь ещё колбэк на дабл-клик выбранного элемента:
[code]...
self:Register(self.list_items, "list_select")
...
self:AddCallback("list_select", ui_events.WINDOW_LBUTTON_DB_CLICK, self.btn_select, self)[/code]
В данном случае, функция будет вызываться как при нажатии на кнопку "ОК", так и при дабл-клике элемента списка. (Точнее, при дабл-клике самого листа)
Как уже сообщил Artos, кнопки не работают, потому что находятся за пределами активной зоны окна. Это же очевидно, и бросается в глаза сразу.
Высота активной зоны у тебя указана 210пикселей, но при этом кнопки находятна на высоте 230пиксклей. Научись работать с координатами.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
Есть ли способ для респавна мутантов на новых локациях? Да и вообще. как выглядит этот респавн, т.к на сколько я понял, одной секции "respawn" в all.spawn не достаточно.
вопрос всегда был такой в алайф (alife.ltx) Чезахрень? КГБ, наса, USA Research Laboratories, Japan_Lab и подобная фигня к чему это там? Это чё типо прикол такой?
добавлено спустя 1 минуту
#war1995 :
Парни подскажите плиз где находится параметр радиации?? я хочу убрать её вообщe.... SOL & DMX MOD
Я НУП))
Gamedata/creatures/actor.ltx думаю разберешся? Убери воздействие радиации на гг и все нет тебе радиации хотя так не интересно!
отредактировал(а) Strchi: 19-05-2011 11:06 GMT3 час.
Всем привет! Создал группировку, а катюмчиков для них нет, и возникают два вопроса
1) Может разробы сделали кучу броников и невключили половину в игру?и если это так то как прописать эти броники НПС?
2) Может кто знает статейку по созданию броньки?)
killer2203 Можно создать самому нечего сложного) Конфиги и иконки только сделать и все))) Ну если визуал хочешь уникальный то модельки или хотябы текстуры!
Strchi killer2203 Сложного (муторного) как раз предостаточно. Для полноценной настройки понадобится проделать:
1. Создать текстуру нового броника, для обвязки моделей сталкеров. (можно разукрасить по своему, копию наиболее подходящей уже существующей текстуры)
2. Создать несколько моделей сталкеров (с разными физиономиями) в новой текстуре броника.
3. Создать текстуру нового броника, для обвязки модели самого броника как физ-объекта.
4. Создать модель броника.
5. Создать иконку броника.
6. Создать иконки сталкеров в новом бронике (наиболее подходящий способ, через скриншоты с последующей их обработкой)
7. Создать конфиг броника.
8. Создать секции сталкеров с новыми визуалами. И использовать их как на спавне сталкеров новой группировки, так и на их респавнере.
И это только для одного типа брони. А ведь их должно быть как минимум три. "Обычная броня", "Броня с высокой защитой от аномалий и радиации (scientific)", "Экзо-броня".
Правда для двух последних понадобится только по одной модели сталкера.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
Всем привет! Я новичок на форуме! Вопрос:кто играл в New Level Changer?? Подскажите, как пройти на радар? Надо отключить антенны, что сделать для этого? :-(
Ded V Надо по квестам открыть переходЧувак на болоте
Введи в яндексе stalker_content и будет тебе обжектов билдовских и фикс ТЧ на сотню мегобайт
Кстати такой домик там присутствует в 3 где то разных обжектах (И префах)
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.