OKStyle
| Дата: Вторник, 23.12.2014, 17:15 | Сообщение # 1 |
 Архивариус
Группа: Администраторы
Зарегистрирован: 19.02.2011
Сообщений: 125
Репутация: 8
Статус: Offline
| В канун Нового Года данная тема как нельзя лучше пригодится держателям серверов. Конечно, а кто не хочет снег зимой? Изучив много тем про снег я понял, что вариантов масса. Предлагаю рассмотреть самые распространённые 4 из них.
Заведём переменную, отвечающую за этот объект: Код new snowobj[MAX_PLAYERS];
Теперь разберём 3 случая реализации снегопада. Я думаю, каждый подберёт вариант по себе.
Вариант № 1 - Перемещающийся объект
Данный вид показал Kwarde 13.11.2011 на оф. форуме и модифицировал спустя год, 26.11.2012. Суть этого варианта заключается в том, что снегу нативно устанавливается позиция по таймеру. Создаётся 8 объектов снега на каждого игрока (всего до 8000) и переменная таймера: Код new snowObject[MAX_PLAYERS][8], updateTimer[MAX_PLAYERS];
Затем, в нужный момент, создаётся сам снег: Код new Float:pPos[3]; GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]); for(new i = 0; i < MAX_SNOW_OBJECTS; i++) snowObject[playerid][i] = CreateDynamicObject(18864, pPos[0] + random(25), pPos[1] + random (25), pPos[2] - 5 + random(10), random(280), random(280), 0, -1, -1, playerid); updateTimer[playerid] = SetTimerEx("UpdateSnow", 750, true, "i", playerid);
Снег создан, таймер запущен. По этому таймеру будет меняться позиция, в зависимости от позиции игрока: Код forward UpdateSnow(playerid); public UpdateSnow(playerid) { new Float:pPos[3]; GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]); for(new i = 0; i < 8; i++) SetDynamicObjectPos(snowObject[playerid][i], pPos[0] + random(25), pPos[1] + random(25), pPos[2] - 5 + random(10)); return 1; }
Строго говоря, с такой частотой обновления, я бы лучше использовал OnPlayerUpdate, чтобы не было лишних таймеров.
Плюсы: объекты не зависят от игрока и присутствуют на сервере нативно. Минусы: необходим стример, жутко лагает от такого кол-ва объектов.
Вариант № 2 - Движущийся объект
Предложен Dav1dBlane 12.12.2010 на форуме SRC. Его суть заключается в том, что объект снега двигается туда, куда смотрит камера игрока.
Создаём объект по положению камеры: Код new Float:pPos[3]; GetPlayerCameraPos(playerid, pPos[0], pPos[1], pPos[2]); snowobj[playerid] = CreatePlayerObject(playerid, 18864, pPos[0], pPos[1], pPos[2] - 5.0, 0.0, 0.0, 0.0, 300.0);
А затем двигаем туда, куда смотрит камера игрока: Код public OnPlayerUpdate(playerid) { new Float:pPos[3]; GetPlayerCameraPos(playerid, pPos[0], pPos[1], pPos[2); MovePlayerObject(playerid, snowobj[playerid], pPos[0], pPos[1], pPos[2] - 5.0, 9999.0); return 1; }
Плюсы: нет большой нагрузки на клиента. Минусы: снижается кол-во возможных объектов для игрока на 1 (с 1000 до 999).
Третий способ - Приаттаченный объект. Есть информация, что автор способа - Xenus. Упомянут способ 22.01.2011 на PI.
Выбираем кость (я советую торс) и аттачим снег: Код SetPlayerAttachedObject(playerid, 9, 18864, 1, 1.5, 0.5, 0.0, 0.0, 0.0, 1.5, 1.0, 1.0, 1.0, 0, 0);
И всё. Обновлять ничего не нужно.
Плюсы: нет большой нагрузки на клиента, снег "ходит" вместе с игроком. Минусы: число возможных приаттаченных объектов уменьшается на 1, вместо 10 станет 9.
Последний вариант вообще не зависит от игроков - Глобальный объект. По разным данным AnGeL был его инициатором. Если у вас есть более полная информация - пишите, исправим. В этом методе мы просто создадим 3600(!) динамических объектов (т.к. статических создать можно только 1000).
Код for(new x = -3000; x < 3000; x += 100) for(new y = -3000; y < 3000; y += 100) CreateDynamicObject(18864, x, y, 2.0, 0.0, 0.0, 1.0);
Плюсы: нет участия игроков в процессе, проверок и таймеров. Минусы: очень много объектов, ужасно лагает.
К сообщению прикладываю ФС, где в равных условиях (по 1 объекту) были добавлены все 3 варианта - пробуйте и забирайте тот, который для вас более комфортный и/или интересный.
P.S. Советую при снегопаде ставить погоду № 9.
Автор: OKStyle
|
|
| |