| | 18.10.2011, 01:41
Первая часть реализации транспортных объектов, можно сказать, закончена. Реализован 11-ый тип объектов, это всякие лифты, эскалаторы и т.п. Сюда в том числе входит и метро из Сторма в Айрон.
Самое важное достижение состоит в том, что мы научились точно определять где в пространстве находится объект в любой момент времени. Это позволило нам "перемещать" объекты по карте вместе с пассажирами, а реализованная ранее апдейсистема, как оказалось, отлично справляется с функцией определения видимости объектов. Грубо говоря, когда вы проезжаете центральную "аквариумную" часть метро, мы можете наблюдать соседний проходящий мимо в обратном направлении поезд и всех его пассажиров, прыгающих, стоящих, сидячих, каких угодно. Ну и конечно же окружающий по дороге мир. Это очень важное замечание, подчеркивающее значимость грамотно спроектированной апдейтсистемы.
Но возникло одно но :)
Заключается оно в том, что по умолчанию область видимости объектов у нас равна float 100.0, и уходящие вагоны метро не скрываются в подземке, а дестроятся буквально въехав в тоннель (ровно на расстоянии 100.0 от наблюдающего плеера). Стало понятно, что нужно уметь как то управлять дистанцией видимости объектов.
Была разработана уникальная с точки зрения вов-серверо-строения (такого еще нигде нет или мне об этом неизвестно, обязательно дайте знать, если знаете где) система динамически изменяемой дистанции видимости. Звучит умно, но на самом деле всё очень и очень просто: каждый объект в своих свойствах (где же еще) имеет float поле, задающее эту дистанцию. По умолчанию она равна значению по умолчанию данного Мира, для Миров 0 и 1 оно равно 100.0 (для инстов чуть меньше). В то же время область видимости объектов может изменяться в зависимости от игровых ситуаций, например видимость Роги или видимость объектов-ловушек может быть изменена в меньшую сторону (это зависит от многих игровых факторов, например как от уровня объектов, наложенных аур и т.п.). И конечно же эта область может быть расширена в большую сторону. Например, это может быть применительно как раз к вагонам метро, а так же к летящему на грифоне плееру, расширяя его кругозор с высоты, так сказать, птичьего полета.
Кстати говоря о грифонах. В данный момент у нас реализован фокус, что плеер летит как бы немного впереди своего реального расположения в Мире, поэтому он видит впереди объекты на довольно большом расстоянии, в то время как сзади они практически сразу дестроятся, как он их пролетел. С пристрастием наблюдая за оффом, можно с уверенностью сказать, что там такая же картина и это можно объяснить только подобной реализацией. Теперь же можно немного расширить визуальные возможности.
Итак, 21 спринт посвящен реализации (напомню, она только спроектирована) Dynamic Visible Area. Ну и разумеется имплементации ее использования в существующих на данных момент системах. Начнем с главного - с транспорта.
#1 RomanRom2, 11.11.2011, 13:01
| Полный цикл одного вагона Метро и наблюдающего плеера.
Вводные данные:
1. размер ячейки Миров: 100.0f
2. зона видимости плееров: 100.0f
3. зона видимости вагона Метро: 300.0f
4. wo - передвигающийся объект, в нашем случае вагон Метро
5. w[] - объект из списка наблюдаемых, в нашем случае стоящий на пероне плеер
6. после времени два флоата - расстояние между объектами, расчитанное двумя способами: первый - наш метод, методом двух вычитаний, второй (в скобках) стандартным методом с плавающей точкой
11.11.2011, 12:50:22: 410.349854 (410.392334): NEW: wo(out): do nothing; w[](out): PLAYER: do nothing;
11.11.2011, 12:50:23: 381.421387 (381.467072): NEW: wo(out): do nothing; w[](out): PLAYER: do nothing;
11.11.2011, 12:50:23: 352.493164 (352.542603): NEW: wo(out): do nothing; w[](out): PLAYER: do nothing;
11.11.2011, 12:50:24: 352.493164 (352.542603): NEW: wo(out): do nothing; w[](out): PLAYER: do nothing;
11.11.2011, 12:50:24: 320.901855 (320.956177): NEW: wo(out): do nothing; w[](out): PLAYER: do nothing;
11.11.2011, 12:50:25: 294.820313 (294.879425): NEW: wo(out): do nothing; w[](in): PLAYER: create;
11.11.2011, 12:50:25: TAccount.SendCreateFrom: woType=5, UpdateFlags=0x52, self[0000002A], from[00020000]
11.11.2011, 12:50:25: 268.739014 (268.803864): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:26: 268.739014 (268.803864): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:26: 242.657715 (242.729538): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:27: 216.576416 (216.656891): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:27: 209.229492 (209.312790): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:28: 179.230957 (179.328186): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:28: 149.232422 (149.349182): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:29: 119.234131 (119.380234): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:29: 89.235596 (89.430717): NEW: wo(in): GAMEOBJECT: create; w[](in): PLAYER: update;
11.11.2011, 12:50:30: 59.237061 (59.530586): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:30: 29.238525 (29.828728): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:31: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:31: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:32: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:32: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:33: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:33: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:34: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:34: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:35: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:35: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:36: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:36: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:37: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:37: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:38: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:38: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:39: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:39: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:40: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:40: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:41: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:41: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:42: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:42: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:43: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:43: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:44: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:44: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:44: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:45: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:45: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:46: 5.904366 (5.953079): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:46: 29.238525 (29.828728): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:47: 59.237061 (59.530586): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:47: 59.237061 (59.530586): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:48: 89.235596 (89.430717): OLD: wo(in): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:48: 119.234131 (119.380234): OLD: wo(out): GAMEOBJECT: delete; w[](in): PLAYER: update;
11.11.2011, 12:50:49: 149.232422 (149.349182): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:49: 179.230957 (179.328186): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:50: 209.229492 (209.312790): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:50: 209.229492 (209.312790): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:51: 242.657715 (242.729538): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:51: 268.739014 (268.803864): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:52: 294.820313 (294.879425): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:52: 294.820313 (294.879425): NEW: wo(out): do nothing; w[](in): PLAYER: update;
11.11.2011, 12:50:53: 320.901855 (320.956177): NEW: wo(out): do nothing; w[](out): PLAYER: delete;
11.11.2011, 12:50:53: TAccount.SendDestroyFrom: self 0000002A destroy from 5, 00020000
11.11.2011, 12:50:53: 346.983154 (347.033386): NEW: wo(out): do nothing; w[](out): PLAYER: do nothing;
11.11.2011, 12:50:54: 381.421387 (381.467072): NEW: wo(out): do nothing; w[](out): PLAYER: do nothing;
11.11.2011, 12:50:54: 381.421387 (381.467072): NEW: wo(out): do nothing; w[](out): PLAYER: do nothing;
11.11.2011, 12:50:55: 410.349854 (410.392334): NEW: wo(out): do nothing; w[](out): PLAYER: do nothing; |
|
| |
|
| |