DizzyAge по-русски
http://dizzyage.flybb.ru/

Купаем Диззи
http://dizzyage.flybb.ru/topic225.html
Страница 4 из 4

Автор:  Verm-V [ 25 июн 2017, 21:54 ]
Заголовок сообщения:  Re: Купаем Диззи

trz писал(а):
Verm-V, ты обращал внимание как ведут себя пузыри? Я особо и не замечал ранее, ибо водных процедур не было в проектах на модифицированном движке, а буквально только начал более подробно разбирать их механику и тестировать и сразу обратил внимание на небольшой нюанс при переходе с экрана на экран. Не могу сказать, что это прям бросается в глаза, но тем не менее уже бросается :mrgreen:

А какой ньюанс? Если брать пузыри которые в waterplay_techdemo, то там оригинальная(старая) процедура для пузырей. Там они непокадровые и выглядят дергано. Но при переходе с экрана на экран ничего особого не увидел.
Вообще я потихоньку пытаюсь AIUpdateBubbles() переделать, чтобы все было плавнее и сейчас это выглядит примерно вот так:
Изображение

Автор:  trz [ 26 июн 2017, 00:05 ]
Заголовок сообщения:  Re: Купаем Диззи

Старые или часть исчезают при пересечении границы комнаты, и начинают появляться новые.

Автор:  Verm-V [ 15 июл 2017, 04:55 ]
Заголовок сообщения:  Re: Купаем Диззи

trz писал(а):
Старые или часть исчезают при пересечении границы комнаты, и начинают появляться новые.

Да, поэкспериментировав всячески увидел. При переходе границ некоторых (не всех) комнат, все пузыри которые есть на экране пропадают. Причем происходит это обычно при переходе в одну сторону, а в обратную такого нет. Еще заметил, что в некоторых комнатах, когда диззи стоит под водой на какой-нибудь поверхности, то все пузыри исчезают почти сразу после появления. Пока не разобрался почему так - буду копать.
Еще заметил, что иногда предметы двигающиеся по AIUpdateTrain через несколько комнат, исчезают и появляются, только при переходе в другую комнату (хотя похоже продолжают двигаться в невидимом состоянии) - тоже загадка пока почему.

Автор:  Verm-V [ 17 июл 2017, 19:24 ]
Заголовок сообщения:  Re: Купаем Диззи

Ага. Нашел в чем проблема с пузырями. Там просто не учитывалось, что игра может находится в режиме скроллинга, и координаты пузырей рассчитывались как для центральной комнаты (даже если пузырь был в соседней) и если в текущей комнаты не было материала воды на этом месте, то пузырь исчезал.
Чтобы поправить это дело, нужно в начале функции AIUpdateBubbles() добавить две строки:
Код:
roomx = GameGet(G_ROOMX);
roomy = GameGet(G_ROOMY);
и заменить строчку:
Код:
if( MaterialRead(x%roomw+ofs,y%roomh+ofs,1,1)!=(1<<MAT_WATER) )
на такую:
Код:
if( MaterialRead(x-(roomw*roomx)+ofs,y-(roomh*roomy)+ofs,1,1)!=(1<<MAT_WATER) )
Теперь координаты пузырей будут рассчитываться из рассчета матрицы 3х3 комнат и не должны неожиданно пропадать.

Автор:  trz [ 20 июл 2017, 23:57 ]
Заголовок сообщения:  Re: Купаем Диззи

Verm-V писал(а):
Чтобы поправить это дело, нужно

Спасибо за решение. Был занят, только руки дошли попробовать и проверить (не подумай, что не доверяю :mrgreen: ) - все прекрасно работает.

Автор:  trz [ 01 авг 2017, 01:19 ]
Заголовок сообщения:  Re: Купаем Диззи

Verm-V писал(а):
Еще заметил, что иногда предметы двигающиеся по AIUpdateTrain через несколько комнат, исчезают и появляются, только при переходе в другую комнату (хотя похоже продолжают двигаться в невидимом состоянии) - тоже загадка пока почему.

Эээ.. копал свое нечто подобное, вспомнил про твое :) В DizzyAGE практически не проверял, но по коду пробежался, так что в теории...

(DizGame.cpp/Update())

При пересечении границы комнаты срабатывает SetRoom( rx, ry );
Код:
      // room tranzit
      if( rx!=Get(G_ROOMX) ||   ry!=Get(G_ROOMY) )
      {
         g_script.CallHandler(HANDLER_ROOMCLOSE);
         SetRoom( rx, ry );
         g_script.CallHandler(HANDLER_ROOMOPEN);
      }


SetRoom обновляет координаты комнаты, карту материалов и заносит ObjGather() текущие динамические объекты в m_obj

Если глянуть там же чуть ниже в Draw()
Код:
      // objects present
      R9_SetClipping( rect );
      for( i=0; i<m_objcount; i++ )
      {
         tBrush* obj = g_map.m_obj.Get( m_obj[i] );
         if( obj->Get(BRUSH_LAYER)!=layer ) continue;
         if( obj->Get(BRUSH_DISABLE)!=0 ) continue;
         if((obj->Get(BRUSH_DRAW) & 1)==0 ) continue;
         ObjDraw(obj);
      }

то объект, который с каких-то делов будет пролетать над Диззи, принудительно не запихнуть в текущий список
Цитата:
ObjPresent ( int idx ); // add object to present list if not in it already

попросту не будет отрисовываться на текущем экране.

Да в общем ты и сам можешь пробежаться и проверить, если я чего упустил (DizGame.h и DizGame.cpp)

Автор:  Verm-V [ 01 авг 2017, 20:19 ]
Заголовок сообщения:  Re: Купаем Диззи

О, спасибо. Я совсем забыл про команду ObjPresent. При том что однажды уже была похожая проблема и я ее применял. :)
Вставил сейчас в AiUpdateTrain и вроде глюка больше нет.

Страница 4 из 4 Часовой пояс: UTC + 4 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/