PDA

Просмотр полной версии : [Вопрос] Помогите с реализацией



Killer
13.05.2017, 13:21
По какому принципу можно реализовать такое,

Вверху есть тексдрав (он мигнул), затем под ним ещё тексдрав, нужно чтобы игрок нажимал именно на это, то что внизу.
И таких несколько,

Подскажите как проще реализовать

DeimoS
13.05.2017, 14:19
const COUNT_BOX = 4;
new
Text:td_FlashBox[COUNT_BOX],
Text:td_SelectableBox[COUNT_BOX];


public OnGameModeInit()
{
td_FlashBox[0] = TextDrawCreate(0.0, 0.0, "Текстдрав, который будет мигать №1");
td_FlashBox[1] = TextDrawCreate(0.0, 0.0, "Текстдрав, который будет мигать №2");
td_FlashBox[2] = TextDrawCreate(0.0, 0.0, "Текстдрав, который будет мигать №3");
td_FlashBox[3] = TextDrawCreate(0.0, 0.0, "Текстдрав, который будет мигать №4");

td_SelectableBox[0] = TextDrawCreate(0.0, 0.0, "Текстдрав, который будет выбирать игрок №1");
td_SelectableBox[1] = TextDrawCreate(0.0, 0.0, "Текстдрав, который будет выбирать игрок №2");
td_SelectableBox[2] = TextDrawCreate(0.0, 0.0, "Текстдрав, который будет выбирать игрок №3");
td_SelectableBox[3] = TextDrawCreate(0.0, 0.0, "Текстдрав, который будет выбирать игрок №4");
}

public OnPlayerConnect(playerid)
{
TextDrawShowForPlayer(playerid, td_FlashBox[0]);
TextDrawShowForPlayer(playerid, td_FlashBox[1]);
TextDrawShowForPlayer(playerid, td_FlashBox[2]);
TextDrawShowForPlayer(playerid, td_FlashBox[3]);
TextDrawShowForPlayer(playerid, td_SelectableBox[0]);
TextDrawShowForPlayer(playerid, td_SelectableBox[1]);
TextDrawShowForPlayer(playerid, td_SelectableBox[2]);
TextDrawShowForPlayer(playerid, td_SelectableBox[3]);
SetPVarInt(playerid, "TextDrawSelectionMode", 1);
return 1;
}

public OnPlayerCommandText(...)
{
if(!strcmp("/test", cmdtext, true))
{
new idx = random(COUNT_BOX);
TextDrawColor(td_FlashBox[idx], 0x000000FF);//Изменили цвет
TextDrawShowForPlayer(playerid, td_FlashBox[idx]);
TextDrawColor(td_FlashBox[idx], 0xFFFFFFFFF);//Вернули назад (потребуется таймер, скорее всего)
TextDrawShowForPlayer(playerid, td_FlashBox[idx]);
SetPVarInt(playerid, "ExpectedSelectionTD", idx);
return 1;
}
}

public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
if(GetPVarInt(playerid, "TextDrawSelectionMode"))
{
new idx = GetPVarInt(playerid, "ExpectedSelectionTD");
DeletePVar(playerid, "ExpectedSelectionTD");
if(clickedid == td_SelectableBox[idx])
{
//Игрок выбрал правильно
}
else
{
//Игрок выбрал неправильно
}
}
return 1;
}

Killer
13.05.2017, 15:33
Огромнейшее тебе спасибо!
Но как таймер поставить? Я с ними плохо дружу.


//PlayerTextDrawColor(playerid, td_FlashBox[playerid][idx], 0xFFFFFFFFF);//Вернули назад (потребуется таймер, скорее всего)
PlayerTextDrawShow(playerid, td_FlashBox[playerid][idx]);

;-)

DeimoS
13.05.2017, 15:58
Ну так подружись :) SetTimerEx (http://wiki.sa-mp.com/wiki/SetTimerEx)

Killer
13.05.2017, 16:13
А как сделать чтобы рандом не повторялся? Ибо иногда сразу же повтор берет.

DeimoS
13.05.2017, 16:42
public OnPlayerCommandText(...)
{
if(!strcmp("/test", cmdtext, true))
{
new idx;
_random_repeat:
idx = random(COUNT_BOX);
if(GetPVarType(playerid, "ExpectedSelectionTD") != PLAYER_VARTYPE_NONE && GetPVarInt(playerid, "ExpectedSelectionTD") == idx)
goto _random_repeat;
TextDrawColor(td_FlashBox[idx], 0x000000FF);//Изменили цвет
TextDrawShowForPlayer(playerid, td_FlashBox[idx]);
TextDrawColor(td_FlashBox[idx], 0xFFFFFFFFF);//Вернули назад (потребуется таймер, скорее всего)
TextDrawShowForPlayer(playerid, td_FlashBox[idx]);
SetPVarInt(playerid, "ExpectedSelectionTD", idx);
return 1;
}
}

- - - Добавлено - - -

И да, не забудь удалить pVar когда текстдравы скроешь

Killer
13.05.2017, 17:02
Ошибка ещё одна, не знаю что такое.

Например td_SelectableBox[playerid][0], используется ячейка (0)

В клике принимается ячейка эта 0.


if(playertextid == td_SelectableBox[playerid][idx])
{

PVar присваивает 0 значение при удалении.


DeletePVar(playerid, "ExpectedSelectionTD");

Баг получается такой, то что выбирать я могу всегда 0 тексдрав, без зависимости можно или нет.

DeimoS
13.05.2017, 17:14
Эмм, во-первых зачем там индивидуальные текстдравы? Можно и глобальными обойтись.
Во-вторых, покажи код, который получился у тебя

Killer
13.05.2017, 18:42
На индивидуальных тексдравах мне удобнее, проще говоря. Это плохо?


if(GetPVarInt(playerid, "TextDrawSelectionMode"))
{
new idx = GetPVarInt(playerid, "ExpectedSelectionTD");
PlayerTextDrawColor(playerid, td_FlashBox[playerid][idx], 0xFFFFFFFFF);
PlayerTextDrawShow(playerid, td_FlashBox[playerid][idx]);
if(playertextid == td_SelectableBox[playerid][idx])
{
DeletePVar(playerid, "ExpectedSelectionTD");
new rand; _random_repeat:
rand = random(COUNT_BOX);
if(GetPVarType(playerid, "ExpectedSelectionTD") != PLAYER_VARTYPE_NONE && GetPVarInt(playerid, "ExpectedSelectionTD") == rand)
goto _random_repeat;
PlayerTextDrawColor(playerid, td_FlashBox[playerid][rand], 0xfCD5C5Cff);//Èçìåíèëè öâåò
PlayerTextDrawShow(playerid, td_FlashBox[playerid][rand]);
SetPVarInt(playerid, "ExpectedSelectionTD", rand);
}
else
{
SendClientMessage(playerid,-1,"Âûáðàë íåïðàâèëüíî");
DeletePVar(playerid, "ExpectedSelectionTD");
return true;
}
}