SA-MP Forums Archive
TextDrawSetString ?! - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: TextDrawSetString ?! (/showthread.php?tid=266822)



TextDrawSetString ?! - Johnny_Xayc - 06.07.2011

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

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


Re: TextDrawSetString ?! - -Stranger- - 06.07.2011

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


Re: TextDrawSetString ?! - Johnny_Xayc - 06.07.2011

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


Re: TextDrawSetString ?! - Johnny_Xayc - 06.07.2011

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


Re: TextDrawSetString ?! - DANGER1979 - 06.07.2011

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

Quote:

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

это верное решение и единственное


Re: TextDrawSetString ?! - -Stranger- - 07.07.2011

Вот код который я делал сначала в 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


Re: TextDrawSetString ?! - Johnny_Xayc - 07.07.2011

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


Re: TextDrawSetString ?! - DANGER1979 - 07.07.2011

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

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

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


Re: TextDrawSetString ?! - Johnny_Xayc - 07.07.2011

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

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

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

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


Re: TextDrawSetString ?! - -Stranger- - 07.07.2011

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

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