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

Редактирование движка X-Ray


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

Это собственно отрисовка внитри игровых шрифтов.

В xray так устроено, что весь текст который игры хочет показать на экране, на самом деле сохраняется в объекте этого самого шрифта

И потом на рендеринге худа каждый объект шрифта выводит все надписи которые им "написали"

Ссылка на комментарий
24 минуты назад, lordmuzer сказал:

И потом на рендеринге худа каждый объект шрифта выводит все надписи которые им "написали"

Глядя на код, я было то же так подумал, но оказалось иначе. Я у себя решил добавить возможность использовать вновь добавленные шрифты без обязательной прописи их в движке. Получилось довольно элементарно:

xr_3da\xrGame\HUDManager.h

CGameFont*                InitializeCustomFont(LPCSTR section, u32 flags = 0);

xr_3da\xrGame\HUDManager.cpp

CGameFont* CFontManager::InitializeCustomFont(LPCSTR section, u32 flags)
{
    CGameFont* pFontAdd = NULL;
    InitializeFont(pFontAdd, section, flags);

    return pFontAdd;
}

xr_3da\xrGame\ui\UIXmlInit.cpp

Скрытый текст

 

bool CUIXmlInit::InitFont(CUIXml &xml_doc, LPCSTR path, int index, u32 &color, CGameFont *&pFnt)
{
    pFnt = NULL;
    color = GetColor(xml_doc, path, index, 0xff);

    shared_str font_name = xml_doc.ReadAttrib(path, index, "font", NULL);
    if(*font_name == NULL || xr_strlen(*font_name)<1)
    {
//        pFnt = NULL;
        return false;
    }

    if(*font_name)
    {
        if (!xr_strcmp(*font_name, ARIAL10_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontArial10Russian;
        }
        else if (!xr_strcmp(*font_name, ARIAL14_FONT_NAME))//"arial14"
        {
            pFnt = UI()->Font()->pFontArial14;
        }
        else if(!xr_strcmp(*font_name, GRAFFITI19_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontGraffiti19Russian;
        }
        else if(!xr_strcmp(*font_name, GRAFFITI22_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontGraffiti22Russian;
        }
        else if(!xr_strcmp(*font_name, GRAFFITI32_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontGraffiti32Russian;
        }
        else if(!xr_strcmp(*font_name, GRAFFITI50_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontGraffiti50Russian;
        }
        else if(!xr_strcmp(*font_name, MEDIUM_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontMedium;
        }
        else if(!xr_strcmp(*font_name, SMALL_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontStat;
        }
        else if(!xr_strcmp(*font_name, LETTERICA16_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontLetterica16Russian;
        }
        else if(!xr_strcmp(*font_name, LETTERICA18_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontLetterica18Russian;
        }
        else if(!xr_strcmp(*font_name, LETTERICA25_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontLetterica25;
        }
        else if(!xr_strcmp(*font_name, DI_FONT_NAME))
        {
            pFnt = UI()->Font()->pFontDI;
        }
        else
        {    // 
            pFnt = UI()->Font()->InitializeCustomFont(*font_name);
            if (!pFnt)
            {
                R_ASSERT3(0,"unknown font",*font_name);
                pFnt = NULL;
            }
        }
    }
    return true;
}

 

xr_3da\xrGame\ui\UIWindow_script.cpp

.....

CGameFont* GetFontCustom(LPCSTR section)
{return mngr().InitializeCustomFont(section);}

.....

def("GetFontCustom",            &GetFontCustom),

.....

Теперь просто указываем в xml-теге секцию шрифта из fonts.ltx, или в скриптовом вызове так же. Потестил - вроде все нормально. И как видно по коду, нигде m_all_fonts не задействован. Вот и хотел уточнить, на кой изначально инициализированные шрифты прогонялись через этот вектор и CFontManager::Render() ?

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

Оконная система это не весь движок.

Окна сами вызывают на своем шрифте OnRender(); потому и работают. Для UI этого будет достаточно.

Но сам движок выводит текст через OutI,Out и прочее - вот там важен этот цикл.

 

А сама идея интересная кстати.

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

Гм, товарищи. Возникла такая нужда - сделать круглую миникарту. В ТЧ. А как - фиг его знает. Не подскажет тут кто-нибудь, как её круглой сделать. Что-то в двигле, в классе самой миникарты... Но что?

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

В ТЧ круглую карту просто эмулируют. Сама карта - квадратная, а рамка поверх нее - круглая. И за счет ширины этой рамки прячут выступающие углы карты.

  • Спасибо 1
  • Полезно 1

Do what thou wilt shall be the whole of the Law.

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

@lordmuzer, нет, такая затычка мне не подходит. Рамка у меня тонкая очень, никак не перекроешь. Править надо именно двигло, кхе, там ведь всё. Ну по-крайней мере это нужно сделать в ЗП, чтобы она была квадратной(там даже вроде в самом классе параметр отдельный есть). Значит что? Аналогично надо сделать всё это дело через двигло и в ТЧ. Ну, разве что как-то по-другому, код то отличается во многом. Вот и пишу сюда, в эту тему. Может кто-то уже делал нормально, без вот этих вот "Ну не видно и ладно", или проблема была аналогичная - рамка слишком тонкая.

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

Вот как сделать ее круглой - я подсказал.

Дальше уже хотелки )

Вопрос - движок ogsr подходит для задачи или нет? Под него сделать могу я. Но нужно что бы кто то проверял.

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

@lordmuzer, ну что значит хотелки.. Вы ж затычку подсказали. Гм, огср... Мне лишь код нужен, поэтому собирать, если вы хотите править исходники, не обязательно.

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

@lordmuzer, поможете под ТЧ кодец заточить? Я пытался перенести класс минимапы полностью с ЗП, не получилось ничего. Игра запустилось, но карте было очень плохо.

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

Всем привет!

Ребята, очень нужна ваша профессиональная помощь! Движок ЗП. Нужно изменить цвет текста 100 советов. Или воткнуть возможность изменения цвета текста, но только для 100 советов, чтобы не затронуть другие надписи. Заранее спасибо!

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

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

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

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

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

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

Войти

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

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

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