SA-MP Forums Archive
TextDraw, Так как-же их правильно создавать? - 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: TextDraw, Так как-же их правильно создавать? (/showthread.php?tid=215378)

Pages: 1 2 3


Re: TextDraw, Так как-же их правильно создавать? - iEnemY - 10.02.2011

А мне вот интересно, как реализовано определение IsCarDrifting (или что у тебя там)... но это оффтоп) У меня такие глюки (у игроков отображаются чужие ТД) были когда я создавал не MAX_PLAYERS TD, а 1 тд. Для каждого игрока должен быть собственный ТД - в этом решение проблемы.


Re: TextDraw, Так как-же их правильно создавать? - Maccer - 10.02.2011

Quote:
Originally Posted by iEnemY
View Post
А мне вот интересно, как реализовано определение IsCarDrifting (или что у тебя там)...
pawn Code:
Float:GetVehicleDriftAngle(vehicleid)
{// by Maccer =)
    new Float:x, Float:y, Float:z;
    GetVehicleVelocity(vehicleid, x, y, z);
    new Float:unit_interval = floatsqroot(x*x + y*y);
    new Float:arcsin = asin( y/unit_interval );
    new Float:arccos = acos( x/unit_interval );
    new Float:angle;
   
    if(arcsin >= 0.0) angle = arccos;
    else angle = 360.0 - arccos;
   
    new Float:real_angle;
    GetVehicleZAngle(vehicleid, real_angle);
    real_angle += 90.0;
    if(real_angle >= 360.0) real_angle -= 360.0;
   
    if(angle > real_angle) return angle-real_angle;
    else return real_angle-angle;
}
Вот так я реализовал у себя =)


Re: TextDraw, Так как-же их правильно создавать? - iEnemY - 10.02.2011

Нда, видимо нужно начинать изучать математику... или понять эти основы.


Re: TextDraw, Так как-же их правильно создавать? - White_116 - 10.02.2011

Ы у меня по другому я с векторами работал. Я искал угол между 2 векторами: первый создавал (староя позиция машины,по Y+10) и его направлением движения (староя позиция, новая позиция).
реализуемо как с векторами так и обычная геометрия и немного знание векторов (это решилось когда я с векторами тупанул. Искал косинус, а не арккосинус).


Re: TextDraw, Так как-же их правильно создавать? - iEnemY - 10.02.2011

Какая блин геометрия, я по ней до сих пор зачёт не могу получить >_<
Эх, математика все таки сложная штука, хорошо что я с ней пока что не разу не сталкивался (а код уже под 60к строк без инкладов).
P.S. Метод векторов интересен)


Re: TextDraw, Так как-же их правильно создавать? - White_116 - 10.02.2011

вот осноная формула. С для дрифта не нужен.


Re: TextDraw, Так как-же их правильно создавать? - Stepashka - 11.02.2011

какие сложности О_о
Разница между углом движения и углом поворота корпуса машины + проверка скорости.
Все!


Re: TextDraw, Так как-же их правильно создавать? - TEKINQ - 18.02.2011

Подскажите пожалуйста где у меня ошибка
Пытался написать систему лвл или по другому Уровень за основу был взят скрипт pInfo
Проблема:
Захожу в игру играю все работает после выхожу и заного захожу фраги сохранились а лвл пишет 1
Code:
public OnGameModeInit() 
{
    EXPINFO = TextDrawCreate(259.000000, 385.000000, "TEST");
    TextDrawBackgroundColor(EXPINFO, 255);
    TextDrawFont(EXPINFO, 1);
    TextDrawLetterSize(EXPINFO, 0.490000, 1.200000);
    TextDrawColor(EXPINFO, -16776961);
    TextDrawSetOutline(EXPINFO, 0);
    TextDrawSetProportional(EXPINFO, 1);
    TextDrawSetShadow(EXPINFO, 1);
    
    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
    {
    Number[playerid] = TextDrawCreate(298.000000, 385.000000,"LVL: 1");
    TextDrawBackgroundColor(Number[playerid], 255);
    TextDrawFont(Number[playerid], 1);
    TextDrawLetterSize(Number[playerid], 0.490000, 1.200000);
    TextDrawColor(Number[playerid], -1);
    TextDrawSetOutline(Number[playerid], 0);
    TextDrawSetProportional(Number[playerid], 1);
    TextDrawSetShadow(Number[playerid], 1);
    }
    for(new g; g < MAX_PLAYERS; g ++)
    {
    if(IsPlayerConnected(g))
        {
    TextDrawShowForPlayer(g, EXPINFO);
    TextDrawShowForPlayer(g, Number[g]);

        }
    }
	return 1;
}

public OnPlayerConnect(playerid)
{
    TextDrawShowForPlayer(playerid, EXPINFO);
    TextDrawShowForPlayer(playerid, Number[playerid]);
	return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
        new msg[64];
 	new score = GetPlayerScore(killerid);
 	format(msg, sizeof(msg),"LVL: %d",score);
	TextDrawSetString(Number[killerid],msg);

    switch(GetPlayerScore(killerid))
    {
        case 1:
        {
        	if(GetPlayerScore(killerid)<5)
            TextDrawSetString(Number[killerid],"2");
        }
        case 2:
        {
        	if(GetPlayerScore(killerid)<10)
            TextDrawSetString(Number[killerid],"3");
        }
        case 3:
        {
        	if(GetPlayerScore(killerid)<15)
            TextDrawSetString(Number[killerid],"4");
        }
        case 4:
        {
        	if(GetPlayerScore(killerid)<20)
            TextDrawSetString(Number[killerid],"5");
        }
        case 5:
        {
        	if(GetPlayerScore(killerid)<25)
            TextDrawSetString(Number[killerid],"6");
        }
        case 6:
        {
        	if(GetPlayerScore(killerid)<30)
            TextDrawSetString(Number[killerid],"7");
        }
        case 7:
        {
        	if(GetPlayerScore(killerid)<35)
            TextDrawSetString(Number[killerid],"8");
        }
        case 8:
        {
        	if(GetPlayerScore(killerid)<40)
            TextDrawSetString(Number[killerid],"9");
        }
        case 9:
        {
        	if(GetPlayerScore(killerid)<45)
            TextDrawSetString(Number[killerid],"10");
        }
        case 10:
        {
        	if(GetPlayerScore(killerid)<50)
            TextDrawSetString(Number[killerid],"11");
        }
        case 11:
        {
        	if(GetPlayerScore(killerid)<55)
            TextDrawSetString(Number[killerid],"12");
        }
        case 12:
        {
        	if(GetPlayerScore(killerid)<60)
            TextDrawSetString(Number[killerid],"13");
        }

    }
    return 1;
}



Re: TextDraw, Так как-же их правильно создавать? - iEnemY - 18.02.2011

Чет я нигде тут не увидел даже намеков на систему сохранения уровня в файл\БД. Дык почему же ты тогда удивляешься что всегда 1 уровень?)


Re: TextDraw, Так как-же их правильно создавать? - OFFREAL - 14.03.2011

Quote:
Originally Posted by White_116
View Post
Я своё спидометр 8 раз переделывал-5 раза из-за этих самых текстдравов.
Выше я описал что и как из личного опыта. В итоге вот что получилось.
оО Мсье знает толк в извращениях! )))
Выглядит здорово, особенно панель под радаром! Сколько времени было убито на калибровку оформления? И не расползается ли оно если сменить разрешение экрана?
- - - - -
И чтобы не оффтопить, добавлю от себя по сабжу:
В процессе создания текстдравов для своего сервера я также сталкивался с кучей проблем! Методом проб и ошибок я выяснил следующее:
1. Самый первый созданный на сервере текстдрав баговый и начинает "заражать" остальные если к нему применять TextdrawSetString (было в прошлых версиях, не знаю как сейчас)
2. Перед ~n~ лучше всегда ставить пробел
3. Не превышать максимальную длину текста текстдрава (чтобы превысить 1024 надо, конечно, постараться)
4. При format строки перед обновлением текстдрава не жалейте символов и делайте всегда с запасом (не забывая про пункт 3)
- - - - -


Re: TextDraw, Так как-же их правильно создавать? - -Stranger- - 05.01.2012

eakwarp, тотоже =)


Re: TextDraw, Так как-же их правильно создавать? - eakwarp - 05.01.2012

Хотя, по сути, можно и SetTimerEx...


Re: TextDraw, Так как-же их правильно создавать? - Diman777 - 03.02.2013

Хотел поинтересоваться. Создал персонализированный текстдрав в OnGameModeInit(), пример:
PHP Code:
new Texttextdraw_test[MAX_PLAYERS]; 
PHP Code:
public OnGameModeInit() {
    for(new 
0GetMaxPlayers(); i++) {
        
textdraw_test[i] = TextDrawCreate(499.0109.0"_");
        
TextDrawBackgroundColor(textdraw_test[i], 255);
        
TextDrawFont(textdraw_test[i], 2);
        
TextDrawLetterSize(textdraw_test[i], 0.331.40);
        
TextDrawColor(textdraw_test[i], -1);
        
TextDrawSetOutline(textdraw_test[i], 1);
        
TextDrawSetProportional(textdraw_test[i], 1);
    }
    return 
1;

Удаляю в:
PHP Code:
public OnGameModeExit() {
    for(new 
0GetMaxPlayers(); i++) {
        
TextDrawDestroy(textdraw_test[i]);
    }
    return 
1;

Показываю и скрываю там где мне нужно:
PHP Code:
stock text_show(playerid) {
    
TextDrawShowForPlayer(playeridtextdraw_test[playerid]);
    
format(stringsizeof(string), "ping: %d"GetPlayerPing(playerid));
    
TextDrawSetString(textdraw_test[playerid], string);
}
stock text_hide(playerid) {
    
TextDrawHideForPlayer(playeridtextdraw_test[playerid]);

Вопрос. Его обязательно скрывать при дисконнекте в OnPlayerDisconnect(playerid, reason) функцией TextDrawHideForPlayer(playerid, Text:text); ?
PHP Code:
public OnPlayerDisconnect(playeridreason) {
    
text_hide(playerid);
    return 
1;

Т.е. если у игрока создан текст и в этот момент - он отключается от сервера, то необходимо скрыть текст?)


Re: TextDraw, Так как-же их правильно создавать? - Alexander_Petrov - 03.02.2013

Quote:
Originally Posted by Diman777
View Post
Хотел поинтересоваться. Создал персонализированный текстдрав в OnGameModeInit(), пример:
PHP Code:
new Texttextdraw_test[MAX_PLAYERS]; 
PHP Code:
public OnGameModeInit() {
    for(new 
0GetMaxPlayers(); i++) {
        
textdraw_test[i] = TextDrawCreate(499.0109.0"_");
        
TextDrawBackgroundColor(textdraw_test[i], 255);
        
TextDrawFont(textdraw_test[i], 2);
        
TextDrawLetterSize(textdraw_test[i], 0.331.40);
        
TextDrawColor(textdraw_test[i], -1);
        
TextDrawSetOutline(textdraw_test[i], 1);
        
TextDrawSetProportional(textdraw_test[i], 1);
    }
    return 
1;

Удаляю в:
PHP Code:
public OnGameModeExit() {
    for(new 
0GetMaxPlayers(); i++) {
        
TextDrawDestroy(textdraw_test[i]);
    }
    return 
1;

Показываю и скрываю там где мне нужно:
PHP Code:
stock text_show(playerid) {
    
TextDrawShowForPlayer(playeridtextdraw_test[playerid]);
    
format(stringsizeof(string), "ping: %d"GetPlayerPing(playerid));
    
TextDrawSetString(textdraw_test[playerid], string);
}
stock text_hide(playerid) {
    
TextDrawHideForPlayer(playeridtextdraw_test[playerid]);

Вопрос. Его обязательно скрывать при дисконнекте в OnPlayerDisconnect(playerid, reason) функцией TextDrawHideForPlayer(playerid, Text:text); ?
PHP Code:
public OnPlayerDisconnect(playeridreason) {
    
TextDrawHideForPlayer(playeridtextdraw_test[playerid]);
    return 
1;

Т.е. если у игрока создан текст и в этот момент - он отключается от сервера, то необходимо скрыть текст?)
Используй PlayerTextDraw и создавай в OnPlayerConnect для каждого игрока, удалять не нужно.


Re: TextDraw, Так как-же их правильно создавать? - Diman777 - 03.02.2013

Не юзал ещё CreatePlayerTextDraw, надо бы потестить эти функции)


Re: TextDraw, Так как-же их правильно создавать? - SDraw - 03.02.2013

-Stranger-, напишите в следующем посте проблему и код...Я уже не могу разобрать ничего из-за оффтопа...


Re: TextDraw, Так как-же их правильно создавать? - Nikid - 03.02.2013

Я вот юзал CreatePlayerTextDraw вместе с TextDrawCreate, у меня при использование команды бьет ошибку Анкноут команд, но команда используется. Вот почему появляется эта ошибка не пойму. Кто-то может сталкивался? Тоже самое, что скрипт vspawner в мод сунуть, где есть уже TextDrawCreate при среднем онли начинается анкноут команд у меня.


Re: TextDraw, Так как-же их правильно создавать? - Alexander_Petrov - 03.02.2013

Quote:
Originally Posted by Nikid
View Post
Я вот юзал CreatePlayerTextDraw вместе с TextDrawCreate, у меня при использование команды бьет ошибку Анкноут команд, но команда используется. Вот почему появляется эта ошибка не пойму. Кто-то может сталкивался? Тоже самое, что скрипт vspawner в мод сунуть, где есть уже TextDrawCreate при среднем онли начинается анкноут команд у меня.
Ошибка в коде, очевидно же.


Re: TextDraw, Так как-же их правильно создавать? - AirKite - 03.02.2013

Quote:
Originally Posted by White_116
View Post
-Stranger- не мучайся, не исправляй а лучше офни и заново всё напиши с вниманием. Я своё спидометр 8 раз переделывал-5 раза из-за этих самых текстдравов.
Выше я описал что и как из личного опыта. В итоге вот что получилось.

new TextTNos[23];-балон нитрухи реализировано как в НФС
new Text:TDClock[10];-измерительная сетка(фон)
new Text:TDHud[MAX_PL][6];-всё что меняется.
1 таймер, стоит 100 мс.
анти спидхак
анти починка
уменьшает хп при аварии (как в Мафии но ослабленно).
дрифтер и спидометр можно отключить.(отдельно можно дрифтер вырубить если и спидометр то дрифтер тоже оффается)
Похвально. Хотя конечно в игре это скорее всего смотрится убого... но дрифтбокс это конечно похвально ))

Quote:
Originally Posted by Stepashka
View Post
какие сложности О_о
Разница между углом движения и углом поворота корпуса машины + проверка скорости.
Все!
Вот вот... приведённый выше код, так и тянет блевануть...
Особенно непонятно где там нужны знания математики. Сложения вычитания, первый класс. Какие сложности то 0_o

Quote:
Originally Posted by Stepashka
View Post
Прежде чем редактировать тексдро его нужно скрывать.
Quote:
Originally Posted by iEnemY
View Post
Никакая это не чушь! Например, для смены цвета текста или бэкграунда, нужно сначала спрятать ТД, изменить цвет, а уже потом показать. Сам проверь!
А вот текст обновляется нормально.
Достаточно повторно показать без скрытия.

Quote:
Originally Posted by Mutha_X
View Post
Правильнее создавать при первой нужде показать и удалять по первой нужде скрывания)
не обязательно при коннекте/дисконнекте
На создание текстдрава уходит время. Лучше его создавать там (по возможности), где эта задержка незначительна. Например при загрузке сервера. Персональные соответственно в OnPlayerConnect.

Quote:
Originally Posted by DANGER1979
View Post
человек может не совсем правильно выразился, но суть он изложил верно.

TextDrawCreate в OnPlayerSpawn(playerid) ни когда не будет нормально работать.

TextDrawCreate должно находиться только в public OnGameModeInit() и ни где больше.
Нарушение этого правил - жди пропадания и путания ИД текстдровов.

Если счас мне начнут говорить, что мол у меня не в OnGameModeInit и всё прекрасно работает, то я отвечу.
Правда если у вас на экране у игрока только 1-2 текстдрова, то можно не париться.
Всё зависит насколько много используется текстдровов и на сколько много игроков к вам заходит в игру.
Т.е. сервер с онлайном в 1 человек не будет страдать этими глюками.
Ничего текстдравы не глючат. Их можно создавать где угодно, учите мануалы (см вики).

Quote:
Originally Posted by OKStyle
View Post
DANGER1979, глобальные текстдравы (которые не персонализированы) должны создаваться при старте мода/скрипта, это верно. Но делать создание персональных текстдравов циклом там же - тупость. Это нужно делать при коннекте игрока, и удалять при выходе. Всё просто.
Это не то что бы тупость, это особенность SAMP. Персональные TD работают иначе и удаляются при дисконнекте АВТОМАТИЧЕСКИ. В противном случае можно было бы сэкономить производительность


Re: TextDraw, Так как-же их правильно создавать? - Nikid - 04.02.2013

Quote:
Originally Posted by Alexander_Petrov
View Post
Ошибка в коде, очевидно же.
Да вот не на все команды это выдает, а на 3-6. А эти новые текстдрав для игрока не используются в командах не где.