# Класс шрифта (CFont)

Класс **CFont**, как и класс **CMessages**, предназначен для вывода текста в игре. При этом, "сообщения" выводятся на указанное время, а рисование через "шрифт" нужно производить в каждом кадре. Рассмотрим функции, которые принадлежат этому классу. Для этого можно открыть файл `CFont.h`, или же в исходном файле начать вводить `CFont::`, и получить доступ к списку переменных и функций класса:

![Список переменных и функций класса](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/2/83606737.png)

Мы рассмотрим только функции, которые можно использовать непосредственно для вывода текста. Например, функция `CFont::Initialise` вызывается игрой при старте, а `CFont::Shutdown` — при закрытии игры. Вряд ли нам понадобятся эти функции в коде плагинов.

```cpp
// Обработка тегов в строке (например, ~r~, ~n~). Вызывается в функциях вывода, так что если мы выводим текст через PrintString(), вызывать эту функцию не нужно. 
static char *ParseToken(char *text, CRGBA & color, bool isBlip, char *tag); 

// Установка размера текста 
static void SetScale(float w, float h); 

// Установка размера текста, но с учётом языка игры 
static void SetScaleForCurrentlanguage(float w, float h); 

// Использовалось в Vice City для поворота текста. В SA работает криво. 
static void SetSlantRefPoint(float x, float y); 

// Использовалось в Vice City для поворота текста. В SA работает криво. 
static void SetSlant(float value); 

// Установка цвета текста 
static void SetColor(CRGBA color); 

// Установка стиля текста (доступные стили перечислены в перечислении eFontStyle) 
static void SetFontStyle(short style); 

// Установка длины строки при выводе текста слева 
static void SetWrapx(float value); 

// Установка длины строки при выводе текста по центру 
static void SetCentreSize(float value); 

// Установка длины строки при выводе текста справа 
static void SetRightJustifyWrap(float value); 

// Установка значения прозрачности всех текстов в игре 
static void SetAlphaFade(float alpha); 

// Установка цвета тени или обводки (одновременно может использоваться либо тень, либо обводка) 
static void SetDropColor(CRGBA color); 

// Установка размера тени 
static void SetDropShadowPosition(short value); 

// Установка размера обводки 
static void SetOutlinePosition(short value); 

// Включение/отключении пропорциональности букв в шрифте 
static void SetProp(bool on); 

// Установка фона для текста 
static void SetBackground(bool background, bool backgroundOnlyText); 

// Установка цвета фона 
static void SetBackgroundColor(CRGBA color); 

// Использовать выравнивание текста по длине строки (все слова в строке "растягиваются" в длину строки) 
static void SetJustify(bool on); 

// Установка выравнивания по стороне (перечисление eFontAlignment) 
static void SetAlignment(eFontAlignment alignment); 

// Получить длину строки. Параметры неизвестны. 
static float GetStringWidth(char *string, bool unk1, bool unk2); 

// Отрисовать тексты в рендер-буфере 
static void DrawFonts(); 

// Вывести текст 
static void PrintString(float x, float y, char *text);
```

Для примера выведем на экран информацию об игроке.

```cpp
#include "plugin.h"
#include "CFont.h" // класс CFont и его функции
#include "CWeaponInfo.h" // класс CWeaponInfo и переменная ms_aWeaponNames
#include "common.h" // функция FindPlayerPed(), подключение CPed.h
#include "stdio.h" // функция sprintf()

using namespace plugin;

class TestPlugin {
public:
    TestPlugin() {
        Events::drawingEvent += [] {
            CPed *playa = FindPlayerPed(); // находим педа игрока
            if (playa) { // если пед найден
                CFont::SetAlignment(ALIGN_LEFT); // выравние текста по левой стороне
                CFont::SetColor(CRGBA(255, 255, 255, 255)); // цвет текста
                CFont::SetOutlinePosition(1); // устанавливаем обводку текста
                CFont::SetBackground(true, true); // включаем бокс
                CFont::SetWrapx(500.0f); // устанавливаем ширину строки
                CFont::SetBackgroundColor(CRGBA(0, 0, 0, 180)); // устанавливаем цвет бокса
                CFont::SetScale(0.7f, 1.0f); // размер шрифта
                CFont::SetFontStyle(FONT_SUBTITLES); // стиль шрифта
                CFont::SetProp(true); // включаем пропорциональность шрифта
                CWeapon &playaWep = playa->m_aWeapons[playa->m_nActiveWeaponSlot]; // Создаём ссылку на поточное оружие игрока
                // форматируем строку для вывода
                char string[256];
                sprintf(string, "Player Info:~n~Health: ~r~%.2f/%.2f ~w~Armour: ~b~%.2f~n~~w~Weapon: ~y~%s ~w~Ammo: ~g~%d/%d~n~~w~ModelId: ~p~%d",
                playa->m_fHealth, playa->m_fMaxHealth, playa->m_fArmour, CWeaponInfo::ms_aWeaponNames[playaWep.m_nType],
                playaWep.m_nAmmoInClip, playaWep.m_nTotalAmmo - playaWep.m_nAmmoInClip, playa->m_wModelIndex);
                CFont::PrintString(15.0f, 15.0f, string); // выводим текст, указаываем координаты
            }
        };
    }
} test;
```

Результат:

![Результат работы плагина](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/2/03060901.png)

***

Автор: **DK22Pac**


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00100/00700/000500.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
