[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
[Кординаты] Урок 1: Периметр
Дата: 20.01.2011, Четверг, 07:42:28 | Сообщение # $NUMBER
Группа: Удаленные
Сообщений:
Репутация: +
Решил расказать о том, как находить, в периметре квадрата ли игрок или нет. Не знаю, продолжу ли я эту серию уроков, но это я опишу.
И так, для того что бы узнать в переметре квадрата ли игрок, нам нужно вспомнить математику. Квадрат, имеет четыре стороны, чтобы узнать в периметре ли игрок квадрата, нужно найти кординаты углов квадрата, дабы разметить его площать, и если игрок находится в нутри квадрата (его площади), то он в периметре квадрата.
И так, ищем углы, у меня будет проверка только на X и Y, то есть это будет именно квадрат. Дабы найти в кубе, нужно будет еще найти высоту (минимальную и максимальную). И так, я сейчас беру из головы кординаты углов, у меня это будет... Допустим 1.5 X минимальный, 5.0 X максимальный, -5.3 Y минемальный, 3.253 Y максимальный. Сейчас если изобразить это в виде рисунка, соеденив все точки по методу "X min с X max, Y min с Y max", у нас получатся две паралельных прямых, но если соеденить еще и X min с Y min, и Y max с X max, мы получим квадрат. Собственно, по этому методу мы и находим граници периметра, и то что в них и является зоной периметра, площадью.

Дальше все просто, нам нужно определить по кординатом игрока, что не одна из указаных кординат, не выходит за рамки нашего периметра:

Code
new Float:x,Float:y,Float:z;
GetPlayerPos(playerid,x,y,z);
if(x > 1.5 && x < 5.0 && y > -5.3 && y < 3.253)
{
     // Вот здесь будет выполнятся условие, если игрок находится в периметре
     // моего квадрата. То есть:
     // Если кордината X у игрока больше 1.5 (X min), X
     // меньше 5.0 (X max), и кордината Y больше -5.3 (Y min) и Y меньше 3,253
     // (Y max), условие выполняется.
}

Проверять это можно везде, но если делать какую либо зону, в которую игрок может просто войти, без каких либо команд, то нужно использовать это в паблике OnPlayerUpdate.

Так же можно проверить окружность игрока стандартной функцией, но если нужен именно квадрат и радиус покрытия большой (к примеру нужно узнать что игрок находится на военной базе 51), то погрешность стандартной функции будет слишком велика, т.к. она проверяет на окружность. В этом случае следует использовать мой пример.

Теперь довайте сделаем функцию, которая будет првоерять это, она будет возвращать 1 если игрок в периметре, 0 если вне периметра.

Code
stock IsPlayerInZone(playerid,Float:xmin,Float:xmax,Float:yminFloat:ymax)
{
new Float:x,Float:y,Float:z;
GetPlayerPos(playerid,x,y,z);
if(x > xmin && x < xmax && y > ymin && y < ymax) return 1;
else return 0;
}

Вот такой просто, но очень важный код. Использовать его можно так:

Code
if(IsPlayerInZone(playerid,0.0,4.4,5.0,33.33))

Естественно, если надо проверить что игрок вне периметра, то используем так:
Code
if(!IsPlayerInZone(playerid,0.0,4.4,5.0,33.33))

Дабы узнать, в периметре куба ли, находится игрок, нужно добавить проверку на zmin и zmax.

Собсно все.

Дата: 20.01.2011, Четверг, 12:55:55 | Сообщение # $NUMBER
Группа: VIP
Сообщений: 1021
Репутация: 815+
красиво оформил, ну я все равно не пойму для чего это?!
Дата: 20.01.2011, Четверг, 13:12:26 | Сообщение # $NUMBER
Группа: Удаленные
Сообщений:
Репутация: +
IsPlayerInRangeOfPoint берет шар, а это берет квадрат. Конешно шаром можно найти, находится ли игрок в определенном растоянии от объекта, но если нужно найти зону, то у стандартной функции слишком большая погрешность, ну если зона не шар))
К примеру, мне надо было проверить что игрок находится в ринге, при этом не запрещая ему его покидать. Я долго мучался чтобы найти радиус шара, а потом вечно появлялись баги, из за того что игрок иногда встовал в угол боксерского ринга, а до туда радиус не достает.
Вот для таких ситуаций, очень хороша эта функция. Или если нужно определить что игрок в ганг зоне, у стандартной функции будет слишком большая погрешность по углам, а у мой нет. Да и не надо радиус находить, надо знать только кординаты углов))
Дата: 20.01.2011, Четверг, 15:27:10 | Сообщение # $NUMBER
Группа: VIP
Сообщений: 1021
Репутация: 815+
Xe[N]o, хм, точно, и удобно делать. а если игрок в этой зоне можно сделать типо умерает, или тпшет к выходу. ?
Дата: 20.01.2011, Четверг, 15:36:20 | Сообщение # $NUMBER
Группа: Удаленные
Сообщений:
Репутация: +
да, вот к примеру по моей функции с теми же кординатоми:
В OnPlayerUpdate
Code
if(IsPlayerInZone(playerid,0.0,4.4,5.0,32.33))
{
SetPlayerHealth(playerid,0.0);
}

Аналогично с телепортом на выход.

Дата: 20.01.2011, Четверг, 15:50:04 | Сообщение # $NUMBER
Группа: VIP
Сообщений: 1021
Репутация: 815+
Xe[N]o, Блин точноче то я тупонул smile
Эт получается как бы ограничение игрового мира типо того?
Дата: 20.01.2011, Четверг, 16:12:22 | Сообщение # $NUMBER
Группа: Удаленные
Сообщений:
Репутация: +
Ну примерно, только там тебя выбрасывает когда ды выходишь за зону)
  • Страница 1 из 1
  • 1
Поиск: