Форум Pawn.Wiki - Воплоти мечту в реальность!: TextDraw - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Other ]
TextDraw

#1
Пользователь офлайн   Kuara 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Вообщем, игрок вводит команду, условно /com, выводится текстдрав, и там есть типо стрелочка - след страница, когда игрок нажимает на эту стрелочку, скрывается первая страница, и выводится вторая.
К чему я это, при нажатии на стрелочку скрывается только первая страница, и всё, более ничего. вот код

if(playertextid == MEN_PG1_PTD[playerid][0])
{
CancelSelectTextDraw(playerid);


MEN_PG2_PTD[playerid][0] = CreatePlayerTextDraw(playerid, 183.6454, -0.7498, "Box"); // ïóñòî
PlayerTextDrawLetterSize(playerid, MEN_PG2_PTD[playerid][0], 0.0000, 49.7304);
PlayerTextDrawTextSize(playerid, MEN_PG2_PTD[playerid][0], 175.0000, 0.0000);
PlayerTextDrawAlignment(playerid, MEN_PG2_PTD[playerid][0], 1);
PlayerTextDrawColor(playerid, MEN_PG2_PTD[playerid][0], -1);
PlayerTextDrawUseBox(playerid, MEN_PG2_PTD[playerid][0], 1);
PlayerTextDrawBoxColor(playerid, MEN_PG2_PTD[playerid][0], 255);
PlayerTextDrawBackgroundColor(playerid, MEN_PG2_PTD[playerid][0], 255);
PlayerTextDrawFont(playerid, MEN_PG2_PTD[playerid][0], 1);
PlayerTextDrawSetProportional(playerid, MEN_PG2_PTD[playerid][0], 1);
PlayerTextDrawSetShadow(playerid, MEN_PG2_PTD[playerid][0], 0);

PlayerTextDrawShow(playerid, MEN_PG2_PTD[playerid][0]);

PlayerTextDrawHide(playerid, MEN_PG1_PTD[playerid][0]);




Сразу говорю, код не весь, там около 60-ти текстдравов, ну смысл такой же.
Создание
Показ
Скрытие(1 страницы)



Так же, если заменить первую старницу на вторую, то всё прекрасно работает!

Прошу, помогите

Сообщение отредактировал Kuara: 11 марта 2025 - 21:49

0

#2
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Если страницы все идентичны, а меняются только выводимые данные - используй PlayerTextDrawSetString и т.п. для изменения данных в текстдравах при переключении страниц. Хотя ты, как я понимаю, уже накостылил все страницы в виде отдельных текстдравов. Тогда просто создаёшь переменную, которая будет хранить номер страницы, и при нажатии на ту или иную стрелку изменяешь значение этой переменной. И уже исходя из значения показываешь нужные текстдравы.
0

#3
Пользователь офлайн   Kuara 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
А обычным hide/show при нажатии на стрелочку можно? Или лучше так, как ты сказал?
0

#4
Пользователь офлайн   Kuara 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
У меня там стоят модели в текстдравах, разве это можно сделать через PlayerTextDrawSetString?
0

#5
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Для "обычных hide/show", как я и писал ранее, придётся каждую страницу заранее создавать в виде отдельного текстдрава - что не практично, с учётом того, что количество текстдравов ограничено для создания.
Разумнее сделать одну копию текстдрава для каждой страницы с уникальным дизайном и далее уже всю нужную информацию подставлять через (Player)TextDrawSetString

Просмотр сообщенияKuara (12 марта 2025 - 12:35) писал:

У меня там стоят модели в текстдравах, разве это можно сделать через PlayerTextDrawSetString?


Почитай подробнее описание функций текстдравов. Они не только при создании использоваться могут. Так что в момент смены страницы ты просто выставляешь новые настройки текстдрава и далее обновляешь текстдрав для игрока через PlayerTextDrawShow
1

#6
Пользователь офлайн   Kuara 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
У меня осталось два вопроса. Я сделал так, как ты ссказал, спасибо, всё получилось. Но, на первой и на второй странице находятся модели, и при нажатии на опр. модели должно происходит действие, вопрос таков.. даже не знаю как сформулировать покажу кодом
if(playertextid == MEN_PG1_PTD[playerid][45]) ( это при нажатии на стрелочку вперёд, типо открытия второй страницы)
    {
       
        PlayerTextDrawSetPreviewModel(playerid, MEN_PG1_PTD[playerid][46], 531); 
        PlayerTextDrawSetPreviewRot(playerid,MEN_PG1_PTD[playerid][46], -10.0, 0.0, -20.0, 1.0); 
        PlayerTextDrawShow(playerid, MEN_PG1_PTD[playerid][46]); 
         }
        


Мне прямо туда пихать ещё раз
if(playertextid == MEN_PG1_PTD[playerid][46])
?

или как поступать ну типо так

if(playertextid == MEN_PG1_PTD[playerid][45]) ( это при нажатии на стрелочку вперёд, типо открытия второй страницы)
    {
       
        PlayerTextDrawSetPreviewModel(playerid, MEN_PG1_PTD[playerid][46], 531); 
        PlayerTextDrawSetPreviewRot(playerid,MEN_PG1_PTD[playerid][46], -10.0, 0.0, -20.0, 1.0); 
        PlayerTextDrawShow(playerid, MEN_PG1_PTD[playerid][46]); 

        if(playertextid == MEN_PG1_PTD[playerid][46]){

        SendClientMessage(playerid, -1, "Вы нажали сюда");
        }
}
        



Надо делать так? Или как поступать в таких ситуациях??




Следующий вопрос, как мне сделать, чтобы сузить зону кликабельности, это возможно?

Сообщение отредактировал Kuara: 12 марта 2025 - 21:22

0

#7
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
1. Нет. Условия должны идти друг за другом для разных текстдравов. Например:

if(playertextid == MEN_PG1_PTD[playerid][45])
{
    // Код обработки нажатия на текстдрав MEN_PG1_PTD[playerid][45]
}
else if(playertextid == MEN_PG1_PTD[playerid][46])
{
    // Код обработки нажатия на текстдрав MEN_PG1_PTD[playerid][46]
}
else if(playertextid == MEN_PG1_PTD[playerid][47])
{
    // Код обработки нажатия на текстдрав MEN_PG1_PTD[playerid][47]
}


Ну и лучше не напрямую к индексам обращаться, а использовать enum, а-ля:

enum e_MEN_PG1_PTD
{
	PlayerText:ptdMenPG1_BG, // Для текстдрава, который является фоном
	PlayerText:ptdMenPG1_Header, // Для текстдрава, в котором написан текст заголовка окна
	// ...
	PlayerText:ptdMenPG1_Key_NextPage, // Для текстдрава, который нужно нажать, чтоб переключить страницу вперёд
	PlayerText:ptdMenPG1_Key_PrevPage, // Для текстдрава, который нужно нажать, чтоб переключить страницу назад
	// И т.п. Так для каждого текстдрава, который ты будешь создавать в рамках этой системы в том порядке, в котором они будут создаваться (это важно!)
}
new ptd_MenPG1[MAX_PLAYERS][e_MEN_PG1_PTD]; // И Сам массив, в который будут записываться ID текстдравов



Это займёт немного времени для того, чтоб все текстдравы "подписать", но зато теперь обработка будет выглядеть так:

if(playertextid == ptd_MenPG1[playerid][ptdMenPG1_Key_NextPage])
{
    // Код обработки нажатия на текстдрав ptd_MenPG1[playerid][ptdMenPG1_Key_NextPage]
}
else if(playertextid == ptd_MenPG1[playerid][ptdMenPG1_Key_PrevPage])
{
    // Код обработки нажатия на текстдрав ptd_MenPG1[playerid][ptdMenPG1_Key_PrevPage]
}


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




2. Нужно правильные значения подобрать для PlayerTextDrawTextSize

Изображение

Сообщение отредактировал DeimoS: 13 марта 2025 - 10:39

1

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика