sanstv
  • Blog

Анимация В Делфи Без Directx Скачать Пример

12/24/2016

0 Comments

 

Direct X Рё Delphi.

Использование Direct. D с высокоуровневыми библиотеками компонентов VCL/LCL / Хабрахабр. Данная публикация адресуется новичкам в области программирования компьютерной графики, желающим использовать графическую библиотеку Microsoft Direct.

Желательно иметь некоторое представление о WinAPI (тогда, кстати, и DirectX будет легче изучать), ну и собственно Delphi. В принципе, это возможно (в примере Mosquito таким образом сделана анимация комара, благо кадров анимации всего три), но в.

X. Сразу оговорюсь. Open. GL, но я это не проверял опытным путём (созданием приложений под Open. GL), поэтому в заголовке упоминаю только Direct. D. — приводимые здесь примеры кода относятся к языкам Delphi/Free. Pascal, но перечисленные «рецепты» по большому счету универсальны в пределах целевой ОС (Windows) — их можно применять к любому языку программирования и, с высокой вероятностью — к любой высокоуровневой библиотеке компонентов, помимо VCL (Delphi) и LCL (Lazarus).

Direct. 3D и методов работы с графическими библиотеками Direct. X и Open. GL; все эти вещи хорошо освещены в других источниках, и мне практически нечего к этому добавлять. Итак, ближе к теме. При разработке приложений с трёхмерной графикой для построения каркаса учебного (а тем более — рабочего) приложения обычно рекомендуется использовать чистый Win. API. В их недрах уже имеется, в том или ином виде, реализация такого цикла, поэтому возникает вопрос: как реализовать бесконечный цикл отрисовки, не нарушая принципов работы с этими библиотеками, и при этом обеспечить корректную работу всего обвязочного кода этих библиотек?

Читать онлайн книгу Графика DirectX в Delphi скачать бесплатно fb2, о том, как создавать в Delphi приложения без вызова библиотеки классов VCL. Поясню смысл этого понятия на примере анимации, которую можно. Но тем не менее, вполне себе работающая почти без глюков игра вдохновляла. Скачан последний DirectX SDK, смотрим в примеры. Главная » Статьи » Графика и Игры » DirectX и DelphiX. Наконец то мы приблизились к самому интересному. Пожалуй, пришло время попробовать все это на практике. Посмотрите на мой пример (DDrawPrimer3.zip 80K). Читать онлайн книгу Графика DirectX в Delphi скачать бесплатно fb2, Михаил Краснов. Http:// Direct X и Delphi. И еще один адрес, по которому можно скачать компонент DelphiX: сделал немало (честное слово не нарочно :-)) Оговорка без номера - я пишу эти строки в те времена. Описанный в статье пример Вы можете скачать здесь (198К). Blitting, Спрайты и Анимация.

Именно этот вопрос я и намерен в дальнейшем осветить в меру своего собственного понимания. Отступление по поводу маскировки исключений. Я был удивлен, когда не смог нормально запустить откомпилированный в Lazarus проект с использованием Direct. D, стабильно получая при запуске программы исключения, «кивающие» на вычисления с плавающей запятой. Потратив некоторое время на изучение проблемы, так и не нашел в интернете прямых сведений об этой проблеме, но обратил внимание, что если компилировать проект в Delphi для 6. Изучение содержимого окон Debug- режима в Delphi показало, что для FPU- расширения процессора регистр маскировки исключений MXCSR имеет различные значения во всех рассмотренных случаях. Даже после этого нагуглить ничего стоящего тоже не удалось, кроме упоминания о том, что модуль Open.

GL из стандартной поставки Delphi содержит в секции «initialization» строку, которая устанавливает маскировку исключений на все возможные случаи. Маскировка исключений FPU не относится к теме этой публикации, поэтому не буду сильно заострять на ней внимание. Приведу только самый простой пример: когда умножение очень больших чисел с плавающей запятой приводит к переполнению, то в этом случае происходит одно из двух: результат умножения становится равным INFINITY (или - INFINITY), если включена маскировка соответствующего исключения; либо процессор генерирует исключительную ситуацию «floating point overflow» (которая должна быть обработана программой в блоке «try except»), если маскировка соответствующего исключения отключена.

Построение анимированных сцен на Delphi. Создаем Анимацию на Delphi. Скачать исходники к примеру два можно здесь. Сайт автора basicsprog.ucoz.ru. A: Официальной версии DelphiX для Delphi 6 не выходило, т.к. В примере используются статичные спрайты (без анимации), т.е. Изучение содержимого окон Debug-режима в Delphi показало, что для. Что же касается библиотеки VCL в Delphi, то она умеет обходиться без. Скриншот моего примера по теме, ссылка для скачать есть на 2 поста выше. Для компиляции примера - Delphi, предположительно начиная с 4-го (проверено.

В итоге, попробовав установить в своих проектах маскировку исключений так, как это сделано в стандартном модуле Open. GL, я добился того, чтобы мои Direct. D- приложения работали как в Lazarus, так и в Delphi (включая 6. К сожалению, мне не удалось найти в MSDN или других источниках (может, плохо искал?) указаний на то, что нужно делать именно так и никак иначе, но тем не менее, рекомендую читателям в своих Direct. D- проектах прописывать следующий код: uses Math.

Например, становится «возможным» деление на ноль (с такой проблемой люди столкнулись, например, здесь), поэтому при выполнении вычислений с плавающей запятой нужно обязательно проверять промежуточные результаты. Впрочем, если вы хотите получать исключительные ситуации при вычислениях с плавающей запятой, как привыкли ранее, то ничто не мешает в нужных местах использовать конструкцию примерно такого вида: var. TArithmetic. Exception. Mask. mask : = Set.

Exception. Mask(? Например, отладка каких- то моментов, таких как шейдеры и эффекты. А может быть, вы создаёте собственный 3.

D- движок и нуждаетесь в редакторе файлов определений, на основе которых движок будет выполнять загрузку ресурсов и отрисовку сцен? В таких случаях хотелось бы иметь возможность видеть сразу результат, а при необходимости — редактировать что- то и «на лету» при помощи «вменяемого» пользовательского интерфейса со строками меню, модальными диалогами и т. Для этого понадобилось поместить на главную форму приложения необходимый набор компонентов — многострочное поле ввода и кнопку. Сразу предупреждаю — программа исключительно демонстрационная (для данной публикации), поэтому не следует от неё ожидать чего- то особенного. Ссылка на исходные коды приводится в конце текста данной публикации. На этом отступления заканчиваются, и я перехожу к основной теме. Способ тривиальный — событие TForm.

On. Paint, функция Windows. Invalidate. Rect(). Программисты, знакомые не только с высокоуровневыми библиотеками компонентов, но и с чистым Win. API, наверняка уже сложили в голове простую схему: «надо отрисовывать Direct. D- сцену в обработчике события формы (или другого компонента), именуемом On. Paint, и там же, по окончанию отрисовки, вызывать функцию Invalidate. Rect() из Win. 32 API, чтобы спровоцировать систему на отправку нового сообщения WM.

Давайте посмотрим, что получится (напоминаю, что в конце текста будет ссылка на исходные коды — скачав их, читатель может найти подкаталог «0. On. Paint + Invalidate. Rect», скомпилировать и запустить программы и убедиться в не очень корректной работе примера). Проблема 1: при компиляции приложения в Delphi и последующем запуске, Direct. D- сцена отрисовывается как ожидается, но контролы пользовательского интерфейса нормально отображаться не хотят. Пока не изменишь расположение или размер окна программы, не хотят нормально отображаться ни надписи, ни содержимое многострочного поля редактирования, ни статус- бар, ни кнопка.

А если программа в процессе работы открывает диалоговые окна (или хотя бы примитивный Message. Box), то они либо закрываться нормально не хотят, либо отображаться на экране (Message. Box можно закрыть и вслепую кнопкой «пробел», но диалоговое окно, унаследованное от TForm, закрыть у меня уже никак не получается). Для наглядной демонстрации этой проблемы я добавил в главное меню программы- примера пункты «Дополнительно - > О программе (Message. Box)» и «Дополнительно - > О программе (TForm)».

Проблема 2: при компиляции приложения в Lazarus и последующем запуске, впридачу к описанным выше проблемам (как будто их недостаточно), добавляется невозможность завершить работу программы — она не реагирует ни на стандартную кнопку закрытия в заголовке (“X”), ни на пункт меню «Выход». Если и не во всех версия ОС, то как минимум в популярной ныне операционной системе Windows 7 (в которой я запускал все приложенные к публикации программы- примеры), ситуация с приоритетом в обработке сообщения WM. В библиотеке VCL его вызов сводится к вызову вышеозначенной функции Invalidate. Rect() чистого Win. API, но в общем случае поведение этого метода зависит от реализации в конкретной библиотеке. Так, в LCL этот метод приводит к вызову другой функции Win. API, имеющей имя Redraw.

Window() — эта функция даёт примерно тот же результат (будет выполнена новая отрисовка окна), но кое- какие нюансы отличаются. Поэтому, чтобы не акцентировать внимание на нюансах, я сразу предложил обратиться к функции Invalidate. Rect() из Win. 32 API. Способ более удачный — задействуем событие Application. On. Idle. Раз предыдущий способ неудачен, поскольку нарушает нормальную работу очереди оконных сообщений Windows, то логично попытаться сделать так, чтобы отрисовка окна приложения выполнялась строго после обработки всех остальных оконных приложений. На первый взгляд (по крайней мере, если детально не вглядываться во внутренности библиотек) эта задача может показаться невозможной без модификации цикла обработки оконных сообщений, скрытого в недрах библиотек VCL и LCL, но на самом деле это не так. У объекта Application есть событие On.

Idle, которое вызывается каждый раз, когда обнаруживается факт отсутствия новых оконных сообщений, и более того — обработчик этого события может сообщить, что он хочет обрабатывать это событие повторно (в цикле) до тех пор, пока не появятся наконец новые сообщения. После того, как будут обработаны новые сообщения, будет снова вызван обработчик события Application. On. Idle. В общем, событие Application. On. Idle вполне подходит для организации бесконечного цикла отрисовки, хотя и со своими нюансами (для получения более подробной информации по этому событию, советую обращаться к справке в используемой Вами среде разработки). Теперь мы можем убрать из обработчика On. Paint вызов API- функции Invalidate.

Rect() и перенести его в обработчик события Application. On. Idle. В итоге получается код по примерно такой схеме: procedure TForm. Main. Form. Create(Sender: TObject).

Application. On. Idle : = On. Application. Idle. Если вы хотите, чтобы ваша программа уступала ресурсы CPU другим приложениям в подобных случаях, а также не вызывала глюков в открытых модальных окнах (я такое видел только в Lazarus), то можно модифицировать обработчик события Application. On. Idle следующим способом: procedure TForm. Main. On. Application.

Idle(Sender: TObject; var Done: Boolean). Application. Terminated ) // выполняется завершение работы приложения. Application. Modal. Level > 0 ) // открыты модальные окна. Self. Window. State = ws. Minimized ) // окно программы свернуто.

Например, когда открыто главное меню окна, то в процессе навигации по нему событие Application. On. Idle не будет вызываться и, соответственно, анимация Direct. D- сцены «остановится». То же самое произойдёт и в случае открытия программой модального диалога или окна Message.

Box. Конечно, с такими проблемками тоже можно побороться. Например, положить на форму объект TTimer, настроить его на срабатывание каждые 5.

0 Comments



Leave a Reply.

    Author

    Write something about yourself. No need to be fancy, just an overview.

    Archives

    November 2016

    Categories

    All

    RSS Feed

Powered by Create your own unique website with customizable templates.
  • Blog