18 сентября 2010

Lazarus, чтоб его!

Давно не писал сюда, так как загружен довольно сильно. Да и хочется всех порадовать какими-то радостными известиями, скринами, новостями и т.д... А пока все "делаем", "еще много работы", что не есть позитив... Так что не так давно я начал писать небольшой обзор еще одного юнита, что использую. Называется он uScriptManager, сам из себя довольно прост, в обращении - тоже. Может кому и пригодится. Сделал несколько демо, показывающих работу с ним, но пока не оформил описание в виде текста, так что придется чуточку подождать. Это я к тому, чтобы пояснить, что журнал не умер - будет много чего интересного.
По поводу основного проекта - правлю баги, которых, как оказалось, довольно много. Также все ищем музыканта, как это ни смешно звучит - поиски ведутся с мая. Игра переведена на английский, осталось сделать локализацию на немецкий и польский. И... всё)) Уровни, графика, геймплей - все готово. Еще раз, осталось только: исправить баги (коих 30), найти музыканта и локализовать еще на два языка.
Собственно сейчас занимаюсь багами. Есть мелкие, которые уже поправил. Но есть и серьезные, вроде падения при отключенном звуковом адаптере. Какие-то лечатся проверками, условиями, какие-то небольшими изменениями в скриптах. Но есть фантомы, загадочные вещи, которые напрягают мозг по полной. К таким я отношу также мистику, связанную с тем, что финальная версия компилируется в Lazarus'е. Описываю на примере. Скомпилировался в delphi, все работает, все отлично. Провел последние тесты, никаких проблем... Гружу Лазарус, билд проходит без ошибок, запускаю - работает. Перехожу между оконным и полноэкранным режимами игры - баг, программа выставляет неверные размеры игровых объектов, видно, что физические границы расходятся с графическими... Смотрю в чем дело - меняю с полноэкранного на оконный, заходит в OnResize, как и нужно, глазею размеры и почти падаю в обморок - неверно! Штука вот в чем, в оконном режиме я выставляю форме размеры Width=1024, Height=768... Захожу в OnResize, смотрю ClientWidth=1024, ClientHeight=768. То есть как будто у формы бордеров и caption'а и в помине нет! Клиентская область полностью равна общей области с системными бордюрами! В общем, я тогда до трёх ночи с бубном бегал. В итоге помогло что-то вроде:
SetWindowPos(fMainForm.Handle, HWND_TOP, fMainForm.Left, fMainForm.Top, fMainForm.Width, fMainForm.Height, SWP_SHOWWINDOW or SWP_FRAMECHANGED or SWP_NOZORDER);
после этого в OnResize приходим с верными значениями. С тех пор стараюсь не трогать этот кусок кода, ибо совсем неясно, с чем связана эта проблема. Хотя натыкался в гугле на подобное обращение к разработчикам вроде "да поправьте наконец, ClientWidth не должно быть равно Width"! Видимо, с тех пор разработчики багу не поправили...
А сегодня полвечера бьюсь над другой задачей. Баг выглядит так:
1. загружаем программу, сворачиваем ее в панель задач
2. открываем диспетчер задач
3. находим в диспетчере наше приложение, нажимаем "Переключиться"
4. ловим баг - диспетчер сворачивается, а вот программа так и осталась свернутой в панели задач. Программа, скомпилированная в delphi ведет себя абсолютно нормально, разворачиваясь как надо. Причем баг наблюдается даже на пустом приложении, созданном в Лазарусе - одна форма и больше ничего, но с таким вот заковыристым багом. Начал рыть Лазарус, нашел у формы интересное событие OnWindowStateChange (в delphi7 такого нет), вызвав в нем Application.Restore при неминимизоранном состоянии (в событие приходим уже после изменения его на wsNormal) - вроде стало получше, окно разворачивается. Но встречаем новый баг - теперь окно, изначально максимизированное на весь экран, вообще странно себя ведет при попытке восстановить его из панели задач. Перемаргивает, пропадает, появляется и в итоге сворачивается обратно. Мистика одним словом!
Вот с такими багами и борюсь каждый день... но на сегодня хватит - ложусь спать, всем удачи!

Сообщения, схожие по тематике:

2 коммент.:

  1. Спасибо большое за обзор, есть что для себя подчерпнуть.

    p.s. if ClientWidth=Width then ?

    ОтветитьУдалить
  2. да не за что... я как бы душу излил, мне не сложно)))))..

    насчет условия "if ClientWidth=Width"... мне ведь нужно само значение, размер вьюера, чтобы рассчитать физические размеры уровня, положение камеры, правильно расположить hud-объекты. Все эти действия происходят в OnResize с учетом новых размеров видимой области. Если ты про вариант высчитывать самому клиентскую область руками (ClientWidth), исходя из общих размеров (Width) - то это довольно нетривиальная задача... насколько я помню, нужно как-то тягать системные метрики (причем даже для разных видов окон ToolWindow/Single, они берутся из разных мест), из них строить итоговое значение - для меня это не вариант... ошибешься где-то, а потом придется ставить Windows Vista, Windows 7, и остальные творения мелкомягких, чтобы отыскать, почему именно в этой версии windows проявился баг с подсчетом метрик... в общем, я рад, что сейчас хоть эта часть работает =)

    ОтветитьУдалить