Система TextDraw в Pawn: создание интерфейса

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

TextDraw позволяет создавать графические элементы интерфейса. Разберем работу с ними.

Создание TextDraw
Код:
new Text:healthText;
new Text:armourText;

public OnGameModeInit()
{
    // Создание TextDraw для здоровья
    healthText = TextDrawCreate(100.0, 100.0, "Health: 100");
    TextDrawFont(healthText, 1);
    TextDrawLetterSize(healthText, 0.4, 1.5);
    TextDrawColor(healthText, 0xFF0000FF);
    TextDrawSetOutline(healthText, 1);
    TextDrawSetShadow(healthText, 1);
    TextDrawShowForAll(healthText);
    
    // Создание TextDraw для брони
    armourText = TextDrawCreate(100.0, 120.0, "Armour: 0");
    TextDrawFont(armourText, 1);
    TextDrawLetterSize(armourText, 0.4, 1.5);
    TextDrawColor(armourText, 0x0000FFFF);
    TextDrawSetOutline(armourText, 1);
    TextDrawSetShadow(armourText, 1);
    TextDrawShowForAll(armourText);
    
    // Обновление каждую секунду
    SetTimer("UpdateTextDraws", 1000, true);
    
    return 1;
}

forward UpdateTextDraws();
public UpdateTextDraws()
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i))
        {
            new Float:health, Float:armour;
            GetPlayerHealth(i, health);
            GetPlayerArmour(i, armour);
            
            new string[32];
            format(string, sizeof(string), "Health: %.0f", health);
            TextDrawSetString(healthText, string);
            
            format(string, sizeof(string), "Armour: %.0f", armour);
            TextDrawSetString(armourText, string);
        }
    }
}

Свойства TextDraw
Код:
new Text:myTextDraw = TextDrawCreate(320.0, 240.0, "Text");

// Шрифт (0-3)
TextDrawFont(myTextDraw, 1);

// Размер букв
TextDrawLetterSize(myTextDraw, 0.5, 2.0);

// Цвет текста
TextDrawColor(myTextDraw, 0xFFFFFFFF);

// Цвет фона (для шрифта 0)
TextDrawBackgroundColor(myTextDraw, 0x000000FF);

// Выравнивание (0-3)
TextDrawAlignment(myTextDraw, 2); // по центру

// Ширина и высота (для шрифта 0)
TextDrawTextSize(myTextDraw, 100.0, 50.0);

// Обводка
TextDrawSetOutline(myTextDraw, 1);

// Тень
TextDrawSetShadow(myTextDraw, 1);

// Использование ящика
TextDrawUseBox(myTextDraw, 1);
TextDrawBoxColor(myTextDraw, 0x000000AA);

// Пропорциональность (для шрифта 0)
TextDrawSetProportional(myTextDraw, 1);

// Выбор стиля (для шрифта 1-3)
TextDrawSetSelectable(myTextDraw, 1);

Показ и скрытие
Код:
// Показать всем
TextDrawShowForAll(myTextDraw);

// Показать игроку
TextDrawShowForPlayer(playerid, myTextDraw);

// Скрыть у всех
TextDrawHideForAll(myTextDraw);

// Скрыть у игрока
TextDrawHideForPlayer(playerid, myTextDraw);

Пример: HUD интерфейс
Код:
new Text:healthBar;
new Text:armourBar;
new Text:moneyText;
new Text:levelText;

CreateHUD()
{
    // Полоса здоровья
    healthBar = TextDrawCreate(548.0, 63.0, "LD_SPAC:white");
    TextDrawTextSize(healthBar, 52.0, 4.0);
    TextDrawAlignment(healthBar, 1);
    TextDrawColor(healthBar, 0xFF0000FF);
    TextDrawUseBox(healthBar, 1);
    TextDrawBoxColor(healthBar, 0x000000FF);
    TextDrawSetShadow(healthBar, 0);
    TextDrawSetOutline(healthBar, 0);
    TextDrawFont(healthBar, 4);
    TextDrawSetProportional(healthBar, 1);
    TextDrawShowForAll(healthBar);
    
    // Полоса брони
    armourBar = TextDrawCreate(548.0, 70.0, "LD_SPAC:white");
    TextDrawTextSize(armourBar, 52.0, 4.0);
    TextDrawAlignment(armourBar, 1);
    TextDrawColor(armourBar, 0x0000FFFF);
    TextDrawUseBox(armourBar, 1);
    TextDrawBoxColor(armourBar, 0x000000FF);
    TextDrawSetShadow(armourBar, 0);
    TextDrawSetOutline(armourBar, 0);
    TextDrawFont(armourBar, 4);
    TextDrawSetProportional(armourBar, 1);
    TextDrawShowForAll(armourBar);
    
    // Текст денег
    moneyText = TextDrawCreate(548.0, 80.0, "$0");
    TextDrawFont(moneyText, 3);
    TextDrawLetterSize(moneyText, 0.3, 1.2);
    TextDrawColor(moneyText, 0x00FF00FF);
    TextDrawSetOutline(moneyText, 1);
    TextDrawSetShadow(moneyText, 1);
    TextDrawAlignment(moneyText, 1);
    TextDrawShowForAll(moneyText);
    
    // Текст уровня
    levelText = TextDrawCreate(548.0, 95.0, "Level: 1");
    TextDrawFont(levelText, 1);
    TextDrawLetterSize(levelText, 0.3, 1.2);
    TextDrawColor(levelText, 0xFFFFFFFF);
    TextDrawSetOutline(levelText, 1);
    TextDrawSetShadow(levelText, 1);
    TextDrawAlignment(levelText, 1);
    TextDrawShowForAll(levelText);
}

UpdateHUD(playerid)
{
    new Float:health, Float:armour;
    GetPlayerHealth(playerid, health);
    GetPlayerArmour(playerid, armour);
    
    // Обновление полосы здоровья
    new healthWidth = floatround((health / 100.0) * 52.0);
    TextDrawTextSize(healthBar, float(healthWidth), 4.0);
    TextDrawShowForPlayer(playerid, healthBar);
    
    // Обновление полосы брони
    new armourWidth = floatround((armour / 100.0) * 52.0);
    TextDrawTextSize(armourBar, float(armourWidth), 4.0);
    TextDrawShowForPlayer(playerid, armourBar);
    
    // Обновление денег
    new string[32];
    format(string, sizeof(string), "$%d", GetPlayerMoney(playerid));
    TextDrawSetString(moneyText, string);
    TextDrawShowForPlayer(playerid, moneyText);
    
    // Обновление уровня
    format(string, sizeof(string), "Level: %d", PlayerInfo[playerid][pLevel]);
    TextDrawSetString(levelText, string);
    TextDrawShowForPlayer(playerid, levelText);
}

public OnPlayerUpdate(playerid)
{
    UpdateHUD(playerid);
    return 1;
}

Кликабельные TextDraw
Код:
new Text:buttonText;

public OnGameModeInit()
{
    buttonText = TextDrawCreate(320.0, 300.0, "Нажмите здесь");
    TextDrawFont(buttonText, 1);
    TextDrawLetterSize(buttonText, 0.5, 2.0);
    TextDrawColor(buttonText, 0xFFFFFFFF);
    TextDrawSetOutline(buttonText, 1);
    TextDrawSetShadow(buttonText, 1);
    TextDrawSetSelectable(buttonText, 1);
    TextDrawShowForAll(buttonText);
    return 1;
}

public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
    if(clickedid == buttonText)
    {
        SendClientMessage(playerid, -1, "Вы нажали на кнопку!");
        CancelSelectTextDraw(playerid);
    }
    return 1;
}

public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
{
    // Обработка клика по персональному TextDraw
    return 1;
}

Персональные TextDraw
Код:
new PlayerText:playerHUD[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
    playerHUD[playerid] = CreatePlayerTextDraw(playerid, 100.0, 100.0, "Text");
    PlayerTextDrawFont(playerid, playerHUD[playerid], 1);
    PlayerTextDrawLetterSize(playerid, playerHUD[playerid], 0.5, 2.0);
    PlayerTextDrawColor(playerid, playerHUD[playerid], 0xFFFFFFFF);
    PlayerTextDrawSetOutline(playerid, playerHUD[playerid], 1);
    PlayerTextDrawShow(playerid, playerHUD[playerid]);
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    PlayerTextDrawDestroy(playerid, playerHUD[playerid]);
    return 1;
}

Важные моменты:
- Уничтожайте TextDraw при выходе игрока
- Обновляйте TextDraw регулярно для динамических данных
- Используйте персональные TextDraw для индивидуальных данных
- Оптимизируйте количество TextDraw для производительности

TextDraw создает красивый и функциональный интерфейс!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху