L1ghT
13.03.2014, 23:01 | Сообщение # 20
Пользователи
Сообщений: 36
|
Как мы знаем, большинство людей делает алгоритмы для входов и выходов (дома, бизнесы, дополнительные постройки и т.д) простыми: Код for(new i = 0; i < value; i++) { if(enterExitData[some_var] == i) { //... break; } } Просто, но долго, так как нужно пробежаться по всем существующим входам и выходам. Попробуем "облегчить" похожие алгоритмы с пробежкой, к примеру, у домов. На замены пикапам (или чекпоинтам, или еще чему-нибудь) воспользуемся динамическими зонами, которые возможно создать с помощью Incognito's Streamer Plugin. Для определения дома нам потребуется всего две глобальные переменные (или же массив с двумя элементами), а также парочка локальных в определенном месте. Создание зон будет попарно: сначала зона для входа, потом зона для выхода. Код new areaEX[2]; //дальше код при обработке домов for(new i = 0; i < value; i++) { new ph[2]; ph[0] = CreateDynamicSphere(hEXi,hEYi,hEZi,S); ph[1] = CreateDynamicSphere(hEEXi,hEEYi,hEEZi,S,i); if(i == 0) areaEX[0] = ph[0]; elseif(i == value-1) areaEX[1] = ph[1]; //... } Где hEXi,hEYi,hEZi - координаты входа; hEEXi, hEEYi, hEEZi - координаты выхода; S -размер сферы; под 'i' имеется ввиду виртуальный мир, дабы сферы выходов различных домов не совпадали, но это при условии, что игроку переназначается виртуальный мир при "входе" в дом. Теперь в areaEX хранятся предельные значения для динамических зон относительно домов. Пусть у нас хранятся дома в таком виде: Код new houseData[value][enumerator/fields]; Заранее нужно предупредить, что если были созданы динамические зоны ДО создания зон для домов - нас это не волнует. Теперь для обработки мы будем использовать OnPlayerEnterDynamicArea: Код public OnPlayerEnterDynamicArea(playerid, areaid) { //Проведем проверку, что зона принадлежит именно домам if(areaEX[0] <= areaid <= areaEX[1]) { //Теперь узнаем, выход это или вход new house = areaid-areaEX[0]; //Почему создали новую переменную? Чтобы не было косяков, если были созданы зоны до зон домов //При получении остатка деления на 2 получаем: 0 - вход, 1 - выход new houseIkd = house%2; house = (house-(house%2))/2; //ID дома теперь записан в house if(houseIkd == 0) { //при входе } else { //при выходе } } return 1; } Сложнее обычного пробега, но время выполнения будет намного меньше. Алгоритм можно переписать для схожих задач. Замечание: При указании игроку позиции при входе/выходе позиции выхода/входа, на котором существует динамическая зона, будет хоть и верной, но игроку будет вечно меняться позиция: вход-выход-вход-выход-... . Возможные решения: - "Спрятать" динамическую зону выхода/входа при входе/выходе игрока в/из зоны и восстановить её через некоторое время.
- Отвести отдельную переменную, указывающую на то, что игроку сменили позицию, но
выполнять обработку для зон не нужно. При выходе из зоны (OnPlayerLeaveDynamicArea) сбросить значение переменной.
Автор: SDraw
|
|
Пользователи
Сообщений: 1
|
Прошел недвано курс Павловых и партнеры по заработку на торгах по продаже недвижимости. Если чесно я просто в шоке) Мне рассказали о том, что можно купить даже гостиницу за одну зарплату а потом хоть продавай в 300 раз дороже, хоть делай что хочегь дело уже твое. Я бы не написал бы слюда если бы сам не проверил, толкьо я купил квартиру в центре за 35 000, оставил ее для своих пожилых родителей, а себе сейчас подыскиваю загородный домик. Это бомба просто, Павловы круто изменили мою жизнь
|
|