PDA

Просмотр полной версии : [Вопрос] GetPlayerTargetPlayer();



somebodies
08.01.2017, 03:36
Всем привет в очередной раз.
Вопросик такой возник. Допустим, я себе назначил на клавишу KEY_SUBMISSION определенное действие,а именно


new targetid = GetPlayerTargetPlayer(playerid);
if(targetid != INVALID_PLAYER_ID) function_name(targetid,params);
return 1;

Собсно,выделяю игрока через ПКМ,нажимаю клавишу - нихрена не происходит. пробовал "дебажить" через printf,так он вообще молчит,как будто я нихрена и не делаю. прошу помощи с этой функцией

VVWVV
08.01.2017, 03:45
Как вы определяете событие KEY_SUBMISSION. Покажите код.

somebodies
08.01.2017, 03:52
В паблике OnPlayerKeyStateChange(playerid,newkeys,oldkeys)


else if(newkeys == KEY_SUBMISSION) // конструкция else if т.к до этого есть также клавиши
{
// код который в топик старте
}

VVWVV
08.01.2017, 03:55
В паблике OnPlayerKeyStateChange(playerid,newkeys,oldkeys)


else if(newkeys == KEY_SUBMISSION) // конструкция else if т.к до этого есть также клавиши
{
// код который в топик старте
}


В этом и проблема, вы используете сравнение, а нужно побитовое И.


else if(newkeys & KEY_SUBMISSION)
{
// код который в топик старте
}

somebodies
08.01.2017, 04:05
Т.е "побитовое И" нужно использовать в любых проверках на нажатые клавиши в паблике OnPlayerKeyStateChange(); ?

VVWVV
08.01.2017, 04:18
Т.е "побитовое И" нужно использовать в любых проверках на нажатые клавиши в паблике OnPlayerKeyStateChange(); ?

Да, ведь в newkeys передаются значения всех нажатых игроком клавиш. Хотя, если вы хотите проверить нажатие только одной клавиши, то используйте оператора сравнения.

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


if (newkeys & (KEY_JUMP | KEY_ACTION)) {
// Код
}

somebodies
08.01.2017, 04:20
Да, ведь в newkeys передаются значения всех нажатых игроком клавиш.

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


if (newkeys & (KEY_JUMP | KEY_ACTION)) {
// Код
}


Самое странное это то,что у меня используется далеко не одна клавиша. Однако,в проверках на другие клавиши я использовал именно сравнение ("=="),а не побитовые "и"/"или",и все прекрасно работало. очень странно. ну ладно,спасибо за помощь Вам.

ziggi
08.01.2017, 04:31
Самое странное это то,что у меня используется далеко не одна клавиша. Однако,в проверках на другие клавиши я использовал именно сравнение ("=="),а не побитовые "и"/"или",и все прекрасно работало. очень странно. ну ладно,спасибо за помощь Вам.

Сравнение клавиши с == сработает только при нажатии какой-то определённой клавиши и никаких других. Тогда как сравнение через & сработает при нажатии определённой клавиши и любых других. Ты пытаешься использовать две клавиши одновременно (KEY_SUBMISSION и KEY_HANDBRAKE (клавиша выделения игрока)), но проверяешь на нажатие только KEY_SUBMISSION и никаких других, поэтому ничего и не работает.

Поэтому, если хочется исключить нажатие лишних клавиш, в данном случае нужно использовать следующую конструкцию:


if (newkeys == (KEY_SUBMISSION | KEY_HANDBRAKE)) {

VVWVV
08.01.2017, 04:57
Сравнение клавиши с == сработает только при нажатии какой-то определённой клавиши и никаких других. Тогда как сравнение через & сработает при нажатии определённой клавиши и любых других. Ты пытаешься использовать две клавиши одновременно (KEY_SUBMISSION и KEY_HANDBRAKE (клавиша выделения игрока)), но проверяешь на нажатие только KEY_SUBMISSION и никаких других, поэтому ничего и не работает.

Поэтому, если хочется исключить нажатие лишних клавиш, в данном случае нужно использовать следующую конструкцию:


if (newkeys == (KEY_SUBMISSION | KEY_HANDBRAKE)) {


Да, так лучше. Но выше предложенный код также сработал бы, ведь используется функция GetPlayerTargetPlayer. Она, как ни странно, проверяет выделение игрока игроком. Хотя это, пожалуй, испортит читаемость и восприятие кода.

ziggi
08.01.2017, 05:10
Да, так лучше. Но выше предложенный код также сработал бы, ведь используется функция GetPlayerTargetPlayer. Она, как ни странно, проверяет выделение игрока игроком. Хотя это, пожалуй, испортит читаемость и восприятие кода.

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

VVWVV
08.01.2017, 05:15
Нельзя сказать лучше или хуже, просто один способ исключает нажатие других клавиш, а другой - нет. И что выбрать - это решать самому, разным людям нужны разные вещи. Я лишь хотел показать, почему == не работает для этого случая, а для других работает и причём здесь GetPlayerTargetPlayer я не понял

Видимо я не понял суть твоего высказывания.

Я говорил о том, что код ниже также будет работать.


if (newkeys & KEY_SUBMISSION) {
new targetid = GetPlayerTargetPlayer(playerid);
if (targetid != INVALID_PLAYER_ID) {

}
}

vovandolg
08.01.2017, 15:37
GetPlayerTargetPlayer вроде как хакают для анти аимов на стороне клиента,
так что не взрывайся если увидишь что кто то не выделяется :rofl: