TextDrawSetString ?!
#1

В общем проблема такова, делаю спидометр и в таймере(200мс) обновляю текстдрав,т.е.
pawn Код:
TextDrawSetString(textdraw1,"Text");
TextDrawShowForPlayer(playerid,textdraw1);
Но по мере езды по городу на экране появляется ещё текстдравы и бывает так, что эти текстдравы путаются местами или же вообще один встаёт на место другого,а другие исчезают, вся проблема в TextDrawSetString,но я делал и TextDrawDestroy,а потом занова TextDrawCreate, но при таком обновлении сервер начинает лагать, т.к. много данных отправляется клиенту,5 раз за 1 секунду.

Может быть есть какое-нибудь решение данной проблемы?
Reply
#2

Была аналогичная проблема, и вот тема, где она решилась : https://sampforum.blast.hk/showthread.php?tid=215378
Если в двух словах, нада текст создавать в OnGameModeInit и показывать когда нада. Тока так я озбавился от глюков.
Reply
#3

Quote:
Originally Posted by -Stranger-
Посмотреть сообщение
Была аналогичная проблема, и вот тема, где она решилась : https://sampforum.blast.hk/showthread.php?tid=215378
Если в двух словах, нада текст создавать в OnGameModeInit и показывать когда нада. Тока так я озбавился от глюков.
Спасибо за ответ, я тоже про это щас думал.
Reply
#4

Может быть кто-нибудь ещё подскажет? из той темы, что мне посоветовали, я ничего дельного не нашёл, можно же управлять как-то нормально динамическими текстдравами.
Reply
#5

Тема эта, что привели, не та. Основное обсуждение вроде было в курилке.
Я уже писал, но умники начали спорить, что типа я не прав.

Quote:

Если в двух словах, нада текст создавать в OnGameModeInit и показывать когда нада. Тока так я озбавился от глюков.

это верное решение и единственное
Reply
#6

Вот код который я делал сначала в FS, и потом переделывал на базе него весь мод. Думаю разберёшься...

PHP код:
#include <a_samp>
#define max_players            222
new TextHUDTimer[max_players]; // HUD таймеры
new HUDTimerTimer;
new 
HUDTimerSet[max_players];
new 
HUDTimerIsActive[max_players];
public 
OnFilterScriptInit()
{
    
HUDTimerCreate();
    
HUDTimerTimer SetTimer("HUDTimerUpdate",1000,1);
    
    return 
1;
}
public 
OnFilterScriptExit()
{
    
KillTimer(HUDTimerTimer);
    
HUDTimerDestroy();
    
    return 
1;
}
HUDTimerCreate() // Создаём все HUD таймеры
{
    for(new 
i=0i<max_playersi++)
    {
        
HUDTimer[i] = TextDrawCreate(300.0,200.0," "); // (550.0,23.0," ")
        
TextDrawLetterSize(HUDTimer[i],0.4,0.6);
        
TextDrawSetOutline(HUDTimer[i],1);
        
TextDrawSetShadow(HUDTimer[i],0);
        
TextDrawColor(HUDTimer[i],0xFFFFFFFF);
        
TextDrawUseBox(HUDTimer[i],0);
        
TextDrawFont(HUDTimer[i],1);
        
TextDrawBackgroundColor(HUDTimer[i],0xFF0000FF);
    }
}
HUDTimerDestroy() // Удаляем все HUD таймеры
{
    for(new 
i=0i<max_playersi++)
    {
        
TextDrawDestroy(HUDTimer[i]);
        
HUDTimerIsActive[i] = 0;
    }
}
HUDTimerShow(pid// Показываем HUD таймер игроку
{
    if(
HUDTimerIsActive[pid]) return;
    
TextDrawSetString(HUDTimer[pid]," ");
    
TextDrawShowForPlayer(pid,HUDTimer[pid]);
    
HUDTimerIsActive[pid] = 1;
}
HUDTimerHide(pid//Прячем HUD таймер игроку
{
    if(!
HUDTimerIsActive[pid]) return;
    
TextDrawHideForPlayer(pid,HUDTimer[pid]);
    
TextDrawSetString(HUDTimer[pid]," ");
    
HUDTimerIsActive[pid] = 0;
}
forward HUDTimerUpdate();
public 
HUDTimerUpdate() // Обновляем все HUD таймеры (каждую секунду)
{
    for(new 
i=0i<max_playersi++)
    {
        if(!
IsPlayerConnected(i)) continue;
        if(
HUDTimerSet[i] && !HUDTimerIsActive[i]) HUDTimerShow(i); // Показываем таймер
        
if(!HUDTimerSet[i] && HUDTimerIsActive[i]) HUDTimerHide(i); // Прячем таймер
        
        
if(HUDTimerSet[i])
        {
            new 
tmp[255];
            
format(tmp,255,"~r~TEST~n~~w~%i",HUDTimerSet[i]);
            
            
TextDrawSetString(HUDTimer[i],tmp);
            
HUDTimerSet[i]--;
        }
        
// Место для обработки функций связанных с таймером
        
        // Место для обработки функций связанных с таймером
    
}
}
// Массив хранящий время таймера - HUDTimerSet[playerid] 
Естественно, если у тебя спидометр, то включай-выключай его в OnPlayerStateChange
Reply
#7

Но если создавать все эти худы при запуске, то я боюсь выйду из лимита как таковых текстдравов, и раньше у меня было и сейчас есть динамические текстдравы, можно ли как-нибудь совместить динамические текстдравы с SetString меня это интересует.
Reply
#8

Вот про эту проблему я писал раньше.
Так что делай текстдровы для каждого игрока в исключительном случаи.
А типа как текстдров времени - это 1 текстдров.
текстдров чата - это 1 текстдров.

текстдровы ввиде квадратов без текста, тоже делай один общий текстдров.

Т.е. всё что выводится для всех одинаковый текст, делай один текстдров.
Reply
#9

Quote:
Originally Posted by DANGER1979
Посмотреть сообщение
Вот про эту проблему я писал раньше.
Так что делай текстдровы для каждого игрока в исключительном случаи.
А типа как текстдров времени - это 1 текстдров.
текстдров чата - это 1 текстдров.

текстдровы ввиде квадратов без текста, тоже делай один общий текстдров.

Т.е. всё что выводится для всех одинаковый текст, делай один текстдров.
Не ну это - то понятно, я как бы не глупый и знаю толк в кодинге, просто вот эти все нюансы сампа убивают просто.

Опишу ситуацию занова:
У меня есть спидометр,отдельный для каждого игрока
в OnPlayerStateChange если newstate == PLAYER_STATE_DRIVER , то мы создаём текстдрав спидометра, если игрок выходит с сервера или State игрока меняется на какой-либо другой, то мы удаляем текстдрав, но при таком алгоритме и начинают лагать все текстдравы из-за спидометра.
Reply
#10

Quote:
Originally Posted by Johnny_Xayc
Посмотреть сообщение
Опишу ситуацию занова:
У меня есть спидометр,отдельный для каждого игрока
в OnPlayerStateChange если newstate == PLAYER_STATE_DRIVER , то мы создаём текстдрав спидометра, если игрок выходит с сервера или State игрока меняется на какой-либо другой, то мы удаляем текстдрав, но при таком алгоритме и начинают лагать все текстдравы из-за спидометра.
Тебе же говорят, если будешь делать так, от лагов не избавишься. Я свой спидометр переписывал раз 20, и единственный рабочий вариант я описал выше...

А про лимиты, считаем (из расчёта 500 человек онлайна):
500 спидометров, 500 таймеров(Ну допустим тюрьма), 1 Часы, 1 Чат, 1 Адрес сайта. Итого: 1003 созданных текста, из 2000 доступных...
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)