PDA

Просмотр полной версии : [Вопрос] Сбитая кликабельность текстдрава



SteveStage
28.11.2019, 21:41
В общем, вот видео:

https://vimeo.com/376220791

Проблема в том, что кликабельность кнопки "SELECT SKIN" выходит за рамки текста, как это можно исправить?

Вот код создания всех текстдравов:

stock TD_SelectSkin(playerid)
{
td_select_skin[playerid][td_right] = TextDrawCreate(397.306640, 340.666625, "LD_BEAT:right");
TextDrawLetterSize(td_select_skin[playerid][td_right], 0.000000, 0.000000);
TextDrawTextSize(td_select_skin[playerid][td_right], 33.733535, 44.916667);
TextDrawAlignment(td_select_skin[playerid][td_right], 2);
TextDrawColor(td_select_skin[playerid][td_right], -65281);
TextDrawSetShadow(td_select_skin[playerid][td_right], 0);
TextDrawSetOutline(td_select_skin[playerid][td_right], 0);
TextDrawBackgroundColor(td_select_skin[playerid][td_right], 255);
TextDrawFont(td_select_skin[playerid][td_right], 4);
TextDrawSetSelectable(td_select_skin[playerid][td_right], true);

td_select_skin[playerid][td_left] = TextDrawCreate(208.393585, 340.666625, "LD_BEAT:left");
TextDrawLetterSize(td_select_skin[playerid][td_left], 0.000000, 0.000000);
TextDrawTextSize(td_select_skin[playerid][td_left], 33.733535, 44.916667);
TextDrawAlignment(td_select_skin[playerid][td_left], 2);
TextDrawColor(td_select_skin[playerid][td_left], -65281);
TextDrawSetShadow(td_select_skin[playerid][td_left], 0);
TextDrawSetOutline(td_select_skin[playerid][td_left], 0);
TextDrawBackgroundColor(td_select_skin[playerid][td_left], 255);
TextDrawFont(td_select_skin[playerid][td_left], 4);
TextDrawSetSelectable(td_select_skin[playerid][td_left], true);

td_select_skin[playerid][td_select] = TextDrawCreate(315.314941, 349.999877, "SELECT SKIN");
TextDrawLetterSize(td_select_skin[playerid][td_select], 0.723146, 3.221665);
TextDrawAlignment(td_select_skin[playerid][td_select], 2);
TextDrawColor(td_select_skin[playerid][td_select], -65281);
TextDrawSetShadow(td_select_skin[playerid][td_select], 0);
TextDrawSetOutline(td_select_skin[playerid][td_select], 0);
TextDrawBackgroundColor(td_select_skin[playerid][td_select], 255);
TextDrawFont(td_select_skin[playerid][td_select], 0);
TextDrawSetProportional(td_select_skin[playerid][td_select], 1);
TextDrawSetSelectable(td_select_skin[playerid][td_select], true);
}

P.S. Использую для создания текстдравов плагин iTD

Kovshevoy
28.11.2019, 22:04
Во-первых, рекомендовал бы юзать TDeditor 2.3. А во-вторых, у тебя не настроена зона кликабельности, чтобы её настроить нужно включить UseBox (на фоне текста появится черный квадрат/прямоугольник) и вручную настраивать ширину/высоту. Но насколько я помню, высоту придется настраивать вручную, ибо в редакторах коорды показывает, а бокс не двигается. Может быть, у меня какие-то баги, но всё же.

DeimoS
28.11.2019, 22:21
Размер кликабельной зоны указывается в TextDrawTextSize. Так же со значением TextDrawAlignment поиграйся, если изменение TextDrawTextSize не даст результатов (не помню просто какое именно значение делает кликабельный текст нормальным).

Для TextDrawAlignment со значением 2 вот такое примечание есть на официальной wiki

For alignment 2 (center) the x and y values of TextSize need to be swapped, see notes at TextDrawTextSize, also position coordinate become position of center of textdraw and not left/top edges.

SteveStage
28.11.2019, 23:28
Игрался я с этой строкой:

TextDrawTextSize(td_select_skin[playerid][td_select], 33.733535, 44.916667);

А зона кликабельности не меняется(


Так же со значением TextDrawAlignment поиграйся, если изменение TextDrawTextSize не даст результатов (не помню просто какое именно значение делает кликабельный текст нормальным).

Так мне нужно, чтобы выравнивание текста было по центру

DeimoS
29.11.2019, 00:01
1) Создавать глобальные текстдравы для каждого игрока - такая себе идея. Лимит быстро иссякнет =) Ну либо непонятно зачем у тебя в массиве playerid. Тут вообще хватит одной глобальной копии текстдравов на всех игроков, ибо нет какой-либо индивидуальной информации.
2) Плохо игрался =)
TextDrawLetterSize(td_select_skin[playerid][td_select], 0.5000, 3.00000);
TextDrawTextSize(td_select_skin[playerid][td_select], 25.0000, 125.0000);
Старайся максимально округлять все координаты и значения, дабы при разных разрешениях экрана твои текстдравы меньше разъезжались.
И для TextDrawLetterSize лучше устанавливать значения 1 к 4. При таких значениях текст максимально корректно и красиво отображаться будет.
Всё это, к слову, описано в официальной wiki =)

Касаемо текста по центру - так а что тебе мешало бы его просто по центру расположить? Эта центровка имеет смысл когда у тебя в одном текстдраве и текст, и бокс, и тебе нужно разместить текст по центру бокса. А без бокса особых ограничений нет.

SteveStage
29.11.2019, 00:15
2) Плохо игрался =)
TextDrawLetterSize(td_select_skin[playerid][td_select], 0.5000, 3.00000);
TextDrawTextSize(td_select_skin[playerid][td_select], 25.0000, 125.0000);

Кликабельность слишком съехала влево и вправо, а по верху и низу норм

Ты мне не код давай, а покажи официальную документацию по текстдравам (или объясни, за что отвечает каждое значение в TextDrawLetterSize и TextDrawTextSize), пожалуйста

DeimoS
29.11.2019, 00:24
Ну так нажимаешь на название функций и переходишь на официальную wiki. Там, собственно, всё описано.

SteveStage
29.11.2019, 00:31
https://ibb.co/rmqcr8R

Например между центром и верхнею частью экрана по координате X координаты 160 или 480?

DeimoS
29.11.2019, 04:03
https://ibb.co/rmqcr8R

Например между центром и верхнею частью экрана по координате X координаты 160 или 480?

Эмм, ну там же чёрным по белому написано, что центр экрана - это координаты 320.0 по X и 240.0 по Y. Если это координаты центра, то логично предположить, что расстояние от 0.0 и цетральной точки - 320.0, не?)
Да и тебе это вообще, по сути, не нужно знать, ибо ты не будешь вручную координаты подбирать, а будешь работать через редактор. Тебе нужно прочитать про особенности работы функций при разных обстоятельствах: как та же TextDrawTextSize ведёт себя при разных значениях TextDrawAlignment и т.п. Либо методом тыка узнать всё то же самое, если описание в статьях wiki не понятно. А ещё есть такая штука, как гугл, с помощью которой ты можешь даже мои ответы найти на эту тему. Перед тобой открыт весь интернет :з

SteveStage
29.11.2019, 15:35
Эмм, ну там же чёрным по белому написано, что центр экрана - это координаты 320.0 по X и 240.0 по Y. Если это координаты центра, то логично предположить, что расстояние от 0.0 и цетральной точки - 320.0, не?)

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


Да и тебе это вообще, по сути, не нужно знать, ибо ты не будешь вручную координаты подбирать, а будешь работать через редактор. Тебе нужно прочитать про особенности работы функций при разных обстоятельствах: как та же TextDrawTextSize ведёт себя при разных значениях TextDrawAlignment и т.п. Либо методом тыка узнать всё то же самое, если описание в статьях wiki не понятно. А ещё есть такая штука, как гугл, с помощью которой ты можешь даже мои ответы найти на эту тему. Перед тобой открыт весь интернет :з

На вики об этом написанно максимум это:

The x and y have different meanings with different TextDrawAlignment values:
1 (left): they are the right-most corner of the box, absolute coordinates.
2 (center): they need to inverted (switch the two) and the x value is the overall width of the box.
3 (right): the x and y are the coordinates of the left-most corner of the box
Using font type 4 (sprite) and 5 (model preview) converts X and Y of this function from corner coordinates to WIDTH and HEIGHT (offsets).
The TextDraw box starts 10.0 units up and 5.0 to the left as the origin (TextDrawCreate coordinate).
This function defines the clickable area for use with TextDrawSetSelectable, whether a box is shown or not.


1) При аллигменте 2 координаты бокса кликабельности смещаются
2) Начинается с 10.0 5.0
2) Обязательно TextDrawSetSelectable true независимо от видимости бокса
4) Если текстдрав - бокс - смещает его, если же кликабельный текст - зону кликабельности

Change the size of a textdraw (box if TextDrawUseBox is enabled and/or clickable area for use with TextDrawSetSelectable)

execution
29.11.2019, 15:56
Эм... (как ты любишь говорить) Так это смотря, с какой стороны начинается отсчет координат - сверху или снизу?

Х - по горизонтали, Y - по вертикале.

SteveStage
29.11.2019, 16:22
Х - по горизонтали, Y - по вертикале.

С какой стороны. Х начинается снизу или сверху?

execution
29.11.2019, 17:21
С какой стороны. Х начинается снизу или сверху?

Что за вопросы то такие? Введи в интернете "Прямоугольная система координат" и поймёшь.

SteveStage
29.11.2019, 17:27
Во-первых, рекомендовал бы юзать TDeditor 2.3.

1. Там много не нужных мне инклудов
2. Он на SqlLite, а я работаю с MySql

Nexius_Tailer
29.11.2019, 19:29
1. Там много не нужных мне инклудов
2. Он на SqlLite, а я работаю с MySql
Его не обязательно использовать непосредственно со своим модом и сервером в принципе, можно просто завести ещё одну папку с отдельным чистым сервером и запускать локально его.

DeimoS
29.11.2019, 19:38
Так это смотря, с какой стороны начинается отсчет координат - сверху или снизу?

Во-первых, можно по надписи уже понять, что отсчёт начинается сверху для X и слева для Y.
Во-вторых, то же самое можно понять, если вспомнить, что в TextDrawCreate указываются координаты левого верхнего угла.
В-третьих, можно было просто создать обычный бокс на координатах "1.0, 1.0" и посмотреть где он будет расположен. Это заняло бы минут 5, вместо десятка часов, которые ты тут потратил.

SteveStage
29.11.2019, 20:10
Во-первых, можно по надписи уже понять, что отсчёт начинается сверху для X и слева для Y.
Во-вторых, то же самое можно понять, если вспомнить, что в TextDrawCreate указываются координаты левого верхнего угла.
В-третьих, можно было просто создать обычный бокс на координатах "1.0, 1.0" и посмотреть где он будет расположен. Это заняло бы минут 5, вместо десятка часов, которые ты тут потратил.

Так вопрос был не в этом. Я понял, как настраивать зону кликабельности, но когда ты ее настраиваешь - ты не видишь квадрат или что-то типо того, ты видишь мышку и текст (бокс выключен), и как так можно аккуратно и точно настроить какую-либо кликабельность?
И еще, я компилировал .pwn в .itd и засовывал этот проект (текстдрав) в папку scriptfiles, заходил в IPleoMax и, открывая этот проект - он обнулялся...

DeimoS
30.11.2019, 02:26
Так вопрос был не в этом. Я понял, как настраивать зону кликабельности, но когда ты ее настраиваешь - ты не видишь квадрат или что-то типо того, ты видишь мышку и текст (бокс выключен), и как так можно аккуратно и точно настроить какую-либо кликабельность?

Ну, во-первых, знание того, откуда начинается отсчёт тебе не поможет, ибо, опять же, TextDrawTextSize при разных значениях TextDrawAlignment воспринимает по разному "x" и "y" координаты.
Во-вторых, тебе никто не запрещает создавать второй текстдрав в виде бокса или же включать бокс и делать его прозрачным. Тогда кликабельность будет вести себя более предсказуемо.
Хотя, опять же, если разобраться как всё работает, то и зону кликабельности можно легко настроить. Можно даже не разбираться, а пойти по чуть сложному пути, написать простенькую команду:
CMD:set(playerid, params[])
{
new Float:x, Float:y;
if(sscanf(params, "P<,>ff", x, y))
return SendClientMessage(playerid, -1, "/set x, y");
TextDrawTextSize(td_select_skin[playerid][td_select], x, y);
TextDrawShowForAll(td_select_skin[playerid][td_select]);
SelectTextDraw(playerid, 0xFF0000FF);
return true;
}
и уже в игре быстро перебрать разные значения. Заодно и понимание принципов работы придёт, со временем.

А вообще добро пожаловать в жестокий мир скриптинга для SA-MP =)

UPD: Собственно, тебе никто не мешает взять исходники iPleoMax и доработать их, сделав визуальное отображение кликабельной зоны =) Это можно реализовать как созданием временного бокса при начале редактирования TextSize, так и просто добавлением диалога или кнопки, которые бы включали SelectTextDraw и активировали все кликабельные текстдравы, дабы можно было прямо в редакторе посмотреть насколько удачной вышла кликабельная зона. Сообщество тебя только поблагодарит (наверное) =)

SteveStage
30.11.2019, 15:21
Можно даже не разбираться, а пойти по чуть сложному пути, написать простенькую команду:
CMD:set(playerid, params[])
{
new Float:x, Float:y;
if(sscanf(params, "P<,>ff", x, y))
return SendClientMessage(playerid, -1, "/set x, y");
TextDrawTextSize(td_select_skin[playerid][td_select], x, y);
TextDrawShowForAll(td_select_skin[playerid][td_select]);
SelectTextDraw(playerid, 0xFF0000FF);
return true;
}
и уже в игре быстро перебрать разные значения. Заодно и понимание принципов работы придёт, со временем.

Вот этот способ мне реально помог, так быстро можно перебирать значения и сразу тестить


UPD: Собственно, тебе никто не мешает взять исходники iPleoMax и доработать их, сделав визуальное отображение кликабельной зоны =) Это можно реализовать как созданием временного бокса при начале редактирования TextSize, так и просто добавлением диалога или кнопки, которые бы включали SelectTextDraw и активировали все кликабельные текстдравы, дабы можно было прямо в редакторе посмотреть насколько удачной вышла кликабельная зона. Сообщество тебя только поблагодарит (наверное) =)

Ага, я смогу с исходниками .pwn и .cpp сразу написать улучшенную версию, конечно

Впринципе вопрос решён, используйте простенькую команду DeimoS'а, перебирая значения прямо в игре, но тему закрывать рановато, вдруг кто-нибудь предложит решение получше