Головна

I. ОСНОВНІ Богословська ПОЛОЖЕННЯ

  1.  C) при переведенні результатів підприємства та його фінансового становища в валюту подання звітності.
  2.  Event-менеджмент - поняття, основні методи.
  3.  I. Загальні положення
  4.  I. Загальні положення
  5.  I. Основні богословські положення
  6.  I. Основні завдання та напрямки роботи бібліотеки

перше: Приклад MainExample у вікні в відеорежимах HighColor або TrueColor на всіх комп'ютерах з відеокартами GeForce2 MX 400, де я його тестував, чомусь не функціонує належним чином. Спостерігається дивна поведінка всієї операційної системи у вигляді загального уповільнення роботи. Це можна було б зі зловтіхою віднести до помилок движка, АЛЕ:

  1. На відеокарті S3 Trid3D / 2X движок працює нормально в будь-якому режимі!
  2. На відеокарті GeForce все працює нормально в режимі 256 кольорів!

Ось так. Саме дивно - приклади з MS SDK працюють у мене коректно на обох відкритих. Взагалі, коли така помилка виявилася, я був у великому подиві і повністю розгублений. Для "чистоти експерименту" я навіть написав окрему програму (не так на движку), яка також працювала в віконному режимі. На жаль, і вона працювала некоректно, але ж програмний код був мінімальний і помилку просто ніде було сховатися. Поміркувавши, я прийшов до висновку, що має місце некоректне взаємодія програм, написаних на Delphi і драйверів Detonator. Звучить дико, але інших пояснень я не знаходжу.

Друге: Я переробив функцію збереження зображення у файлі, тепер вона працює коректно для відеокарти S3. На жаль, на GeForce в 16-бітовому режимі вона виходить спотвореної, причину я так не знайшов. Для режиму 32 біта все працює правильно.

Думки вголос:

  1. Якщо планується писати якусь гру або мультимедійне додаток, краще написати спочатку движок для неї.
  2. Розробка більш-менш великої програми після маленьких розв'язує руки, дозволяє "розгорнутися" програмісту, реалізувати деякі правила свої амбіції.
  3. Разом з тим робота з ловлі помилок досить клопітно і іноді дратує.
  4. Приділіть належну увагу організації виведення повідомлень про помилки - це окупиться сторицею в процесі розробки.
  5. Іноді зустрічаються ніяк, абсолютно, ну абсолютно необ'янімие "bugs"! Це може здорово зіпсувати життя.
  6. Іноді (тільки іноді) такі баги пропадають самі собою, якщо їх "заморозити" тижнів на два заглушкою, а потім зняти%)
  7. Власна (!) Реалізація будь-яких ефектів на кшталт прозорості і повороту радує око, однак надто вже вони повільні і непоказні, їх якість часто бажає залишати кращого. До того ж, DirectDraw API поступово стає застарілою технологією, її развите корпорацією Microsoft вже давно зупинено. Можливо, захотівши мати в своїй програмі барвисті спецефекти, слід звернути свою увагу на двовимірне малювання за допомогою таких API, як Direct3D і OpenGL.
 DirectX для початківців
 Sprite
 Повернутися до розділу Hello, World! DirectX для початківців  Автор Віктор Коду, дата публікації 8 квітня 2002р.

Цей приклад демонструє виведення зображення засобами DirectDraw. Він побудований без використання VCL, але я сподіваюся це не завадить вам. Ось файли проекту:

Після реєстрації класу вікна і його відображення проводиться ініціалізація DirectDraw. За це відповідає функція InitDirectDraw (). Розглянемо її роботу докладніше.

Насамперед необхідно створити об'єкт DirectDraw. На сьогоднішній момент його потрібно створювати функцією DirectDrawCreateEx (), а не DirectDrawCreate (), як це було в попередніх версіях. Перший параметр є покажчик на унікальний ідентифікатор драйвера відеоадаптера, але т. К. В більшості випадків комп'ютери оснащуються одним відеоадаптером, то можна передати nil. Другий параметр є покажчиком на інтерфейс IDirectDraw7.

Параметр iid може приймати тільки одне значення - IID_IDIRECTDRAW7. Будь-яке інше значення приведе до помилки DDERR_INVALPARAMS. Останній параметр в описуваної функції на даний момент не використовується і призначений для майбутніх версій. Результат, що повертається функцією (так само як і будь-який інший в DirectX), має тип HRESULT, т. Е. Може мати безліч кодів завершення. У DirectDraw успішна робота функції визначається константою DD_OK, а помилкова - безліччю інших, залежних від типу помилки. Крім згадуваної константи DDERR_INVALPARAMS функція може повернути DDERR_UNSUPPORTED, повідомивши тим самим, що об'єкт DirectDraw НЕ инициализирован. Щоб уникнути мороки з перевіркою поверненого результату, рекомендується застосовувати макроси (в Delphi практично функції) FAILED () і SUCCEEDED (), певні в windows.pas. Справа в тому, що 31-й біт значення, що повертається містить прапор критичності, який вказує, чи відбулася помилка чи ні. Якщо біт дорівнює 0, то помилки не було, а якщо він дорівнює 1, то помилка мала місце. Це як раз і перевіряють вищевказані макроси. Звичайно, ніхто не забороняє написати так:

If DirectDrawCreateEx (nil, lpDD7, IID_IDIRECTDRAW7, nil) <> DD_OK then ...

Але професіонали використовують виключно макроси FAILED () і SUCCEEDED ().

Після створення об'єкта необхідно встановити режим кооперації - т. Е. Визначити, віконний або повноекранний режим буде використовувати DirectDraw. Треба відразу "брати бика за роги" і програмувати повноекранні програми. Режим кооперації учтанавлівается методом IDirectDraw7.SetCooperativeLevel (). Першим параметром передається ідентифікатор вікна типу HWND. Другий являє собою комбінацію прапорів. Встановимо такі:

Наступним дією є установка режиму відео. Це робить метод
 IDirectDraw7.SetDisplayMode (). Перші три параметри вказують ширину і висоту екрану, а також глибину палітри (8, 16, 24, 32). Останні два параметри використовуються рідко. Подробиці про них можна дізнатися з SDK.

Отже, ми створили об'єкт DirectDraw і змінили дозвіл екрана. У цей момент роботи програми наше вікно моментально затуляє всі об'єкти на Робочому столі, включаючи панель завдань. Якщо ви ще не звернули увагу, для створення вікна я використовував структуру WNDCLASSEX, а не WNDCALSS. Справа в тому, що вікно, побудоване на базі останньої, не відразу закриває весь екран - 1-1,5 секунди продовжує красуватися Панель завдань. Можливо, вся справа в прапорі WS_EX_TOPMOST, який можна використовувати тільки разом з WNDCLASSEX.

Не варто нехтувати даними перевагами - зто робить програму більш "професійної" при мінімумі зусиль. Спробуйте створювати вікно на базі різних класів - самі відчуєте різницю. Наступним кроком створимо первинну поверхню. Фактично це область відеопам'яті, яка буде використовуватися відеоадаптером для відображення картинки на екрані монітора.

Оскільки поверхні можуть бути різних типів (не тільки первинними, а й позаекранного), а метод для їх створення тільки один - lDirectDraw7.CreateSurface (), Необхідно якимось чином вказати, що ми хочемо створити саме первинну поверхню. Як це зробити?

Зверніть увагу, що перший параметр методу - це покажчик на структуру TDDSURFACEDESC2 (до речі, в SDK 8 для З ++ цим параметром потрібно передавати адреса структури TDDSURFACEDESC, а не TDDSURFACEDESC2. Це помилка перекладу заголовків файлів C ++ на Pascal: проте, все працює коректно). Саме через цю структуру DirectDraw дізнається, який тип поверхні потрібно створити.

Перед використанням структури поширеною практикою є заповнення її нулями - на випадок будь-якого "сміття" в RAM, який може привести до помилки під час виконання. Я використовую функцію ZeroMemory (), але можна і FillChar (). Наступним дією є заповнення поля dwSize цієї структури розміром самої структури. Ця дія обов'язково!

Поле dwFlags визначає, які інші поля структури ми будемо використовувати. Мабуть, це зроблено для забезпечення найвищого швидкодії - тепер DirectDraw НЕ буде переглядати всі поля структури (а їх дуже багато), а "загляне" тільки в ті, які ми вказали. Ми будемо використовувати поля ddsCaps і dwBackBufferCount. Зазначимо це прапорами DDSD_CAPS і DDSD_BACKBUFFERCOUNT. Поле ddsCaps.dwCaps якраз і визначає тип створюваної поверхні - прапори DDSCAPS_PRIMARYSURFACE, DDSCAPS_FLIP і DDSCAPS_COMPLEX повідомлять DirectDraw, що ми хочемо створити первинну комплексну поверхню з можливістю перемикання буферів. Поле dwBackBufferCount вказує кількість задніх буферів, які ми підключимо до первинної поверхні - встановимо 1 (хоча можна підключити і більше).

викликаємо метод lDirectDraw7.CreateSurface (), Вказавши другим параметром потрібний інтерфейс. Третій параметр заразервірован і не використовується.

Тепер до первинної поверхні потрібно "пріаттачіть" задній буфер. Цей буфер виключно важливий для самого механізму виведення зображень і необхідний для позбавлення від мерехтіння спрайтів. Для створення заднього буфера використовується структура TDDSCAPS. Очищаємо її і задаємо прапор DDSCAPS_BACKBUFFER. методом IDirectDrawSurface.GetAttachedSurface () подсоединим задній буфер. Все, ініціалізація DirectDraw закінчена.

Тепер потрібно створити позаекранного поверхні і завантажити в них зображення. Позаекранного поверхні являють собою лінійні області даних в відео- або системної пам'яті, які призначені для зберігання графічних даних. За весь цей відповідає процедура LoadFiles (). Насамперед отримуємо ідентифікатор завантаженого функцією LoadImage () растра. Я не буду її описувати, т. К. До DirectDraw вона не має прямого відношення - за цим прошу в Help Win32 API. Скажу лише, чому я застосував саме цю функцію. Справа в тому, що часто виникає необхідність завантажувати не тільки файли формату bmp, але і файли інших форматів, наприклад gif або JPEG. Зазвичай для їх завантаження застосовуються різні бібліотеки DLL (наприклад, nViewLib.dll), результати роботи функцій в цих бібліотеках - величина типу HBITMAP. Її можна використовувати в однаковому методі завантаження файлів різних форматів. Рекомендую використовувати саме такий метод, якщо тільки ви не гуру в алгоритмах стиснення різних форматів файлів і не збираєтеся самостійно писати функції по перетворенню стислих файлів в растр - адже DirectDraw подібних рішень не надає. На жаль, брак такого способу в тому, що він трохи повільніше :-(. Втім, збільшений час зчитування має скільки-небудь істотно проявитися лише при завантаженні дуже великої кількості файлів (30-40 МБ і більше).

Тепер розглянемо процедуру CopyImage (). Першим параметром ми передаємо адресу інтерфейсу IDirectDrawSurface - саме на на цю поверхню і буде завантажений растр. Другим - ідентифікатор завантаженого растра. Взагалі, робота функції CopyImage () базується на GDI. Після створення контексту і вибору в нього растра ми отримуємо розміри цього растра функцією GetObject (). Тепер потрібно створити поверхню DirectDraw c отриманими шириною і висотою растра. За це відповідає ще одна функціяCreateSurface (). Механізм в ній схожий на той, що використовувався для створення первинної поверхні, тому докладно я його описувати не буду. Зверніть тільки увагу на прапор DDSCAPS_OFFSCREENPLAIN - він вказує, що ми хочемо створити саме позаекранного поверхню. На жаль, не можна динамічно змінювати розмір поверхні DirectDraw - для цього потрібно заново створити її і завантажити дані. Після успішного створення поверхні можна завантажити на неї растр - для цього існує зручний метод IDirectDrawSurface.GetDC (). Захопивши контекст пристрою, здійснюємо копіювання растра з одного контексту на інший, захоплений (а фактично на поверхню DirectDraw). Для цього використовується функція GDI BitBlt (). Перевагою методу можна вважати той факт, що тепер на поверхні DirectDraw можна малювати будь-якими функціями GDI, а не тільки BitBlt (), не вдаючись до прямого доступу до пам'яті, в якій розташована поверхню - наприклад, намалювати лінію або овал. А якщо виникне потреба вивести текст? Так що відмовлятися від GDI поки ще рано. Так, захоплений контекст потрібно звільнити методом IDirectDrawSurface.ReleaseDC ().

Ну ось, ще один крок позаду. Саме час повернутися в модуль .dpr і подивитися, що відбувається далі. Додаток починає здійснювати вибірку системних повідомлень, а при відсутності таких викликає функцію OnDraw (). У VCL цей алгоритм називається Application.OnIdle.

Розглянемо OnDraw () докладніше. Це - серце алгоритму виведення зображень на екран.
 Висновок зображення в повноекранному режимі здійснюється методом IDirectDrawSurface.BltFast (). Цей метод повинен викликатися для поверхні, створеної як задній буфер - саме на ньому ми й будемо малювати. Цей метод максимально швидкий, але обмежений функціонально, наприклад, він не в змозі стиснути по осях виведене зображення. Перші два параметри - координати лівого верхнього кута виведення спрайту. Третій - поверхня, вміст якої будемо виводити. Четвертий - адреса структури типу TRect, яка буде визначати облать виведення поверхні - її ініціалізацію я зробив перед викликом методу IDirectDrawSurface.BltFast (). Поексперементіруйте з функцією SetRect () і подивіться, як параметри в ній впливають на зміну в виведенні графіки. П'ятим параметром методу передамо константу DDBLTFAST_WAIT - вона потрібна для коректного виведення на екран.

Описані дії потрібно повторити для кожного виведеного спрайту. Останньою справою потрібно перемістити вміст заднього буфера на первинну поверхню, вміст якої, як я вже сказав, є поточне зображення на моніторі. Зробимо це методом IDirectDrawSurface.Flip (), вказавши першим параметром nil - адже у нас тільки один задній буфер. Константа DDFLIP_WAIT потрібна для коректного виведення на екран. Цей метод слід викликати тільки для первинної поверхні. Переміщення заднього буфера на екран - один з найшвидших методів DirectDraw.
 Тепер зображення з'явиться на екрані. Можете посувати спрайт за допомогою клавіатури - так цікавіше.

Після натискання на клавішу Escape відбувається вихід з циклу. Потім програма викликає нижчу функцію ReleaseDirectDraw (), Яка відновлює початкове дозвіл і видаляє створені поверхні і об'єкт DirectDraw. Зауважте, що виклик _Release () для відповідного інтерфейсу буде коректним тільки в тому випадку, якщо стався виклик _AddRef (). Взагалі, кажуть що виклики ці необов'язкові, але я все ж використовую їх для повної коректності роботи програм.

Останнім в ланцюжку дій руйнується вікно - дія не обов'язкова, але для коректного звільнення пам'яті бажане.

 DirectX для початківців
 Sound
 Повернутися до розділу Hello, World! DirectX для початківців  Автор Віктор Коду, дата публікації 8 квітня 2002р.

Одним з достоїнств компоненти DirectSound є те, що вона має прямий (ну, майже прямий) доступ до апаратного забезпечення звукової карти. Серед цікавих можливостей слід виділити розміщення даних в пам'яті звуковий плати, використання апаратного мікшування звуку, можливість створювати об'ємний звук, використовуючи спеціальні алгоритми (це потрібно для 3D-ігор) - все це мультимедіа-засоби Windows забезпечити не в змозі. Якщо як слід попрацювати з DirectSound API, можна створити дуже якісний движок для виведення звуку - такий, як у багатьох сучасних іграх. Зрозуміло, бажано і відповідне обладнання для виведення звуку.

Цей приклад використовує тільки загальні можливості компонента DirectSound (DirectXAudio), зокрема, не використовується механізм підкачки звукових даних, не використовуються тривимірні ефекти для додання "об'ємності" звуку і т. Д. Зате до безперечних достоїнств слід віднести універсальність алгоритму зчитування звукових даних з wav -файлів - читається будь-який формат. Нехай не ображаються Денис Гончаров і Тимур Саліхов, по книзі яких я і вивчав DirectSound, але постачати навчальні приклади в стадії "обмоченние дитячі пелюшки" просто соромно. Справа в тому, що навчальний приклад по відтворенню звукових файлів, який поставлявся разом в книгою, відкривав тільки ті wav-файли, які поставлялися на тому ж CD-ROM. З іншими, зокрема, з каталогу Windows \ Media, приклад працювати навідріз відмовлявся - програма просто "вилітала". Тому довелося вдатися до SDK і скористатися його прикладами - благо, вони працюють коректно з усіма wav-файлами в форматі PCM (я не зустрів жодного, який би викликав помилку). Все-таки хлопці з Microsoft знають, що роблять.

На жаль, за універсальність доводиться платити, а тому цей приклад за обсягом мало скидається на навчальний. До того ж, він недописаним до кінця :-( - сподіваюся, хтось допоможе мені здолати виниклі проблеми.

Ось файли проекту:

Отже, натискаємо два рази за формою - потрапляємо в процедуру FormCreate (). Певой викликається функція InitDirectSound () - звичайний підхід. У ній створюється головний об'єкт DirectSound і встановлюється рівень кооперації. Для установки ексклюзивного рівня кооперації в DirectX 7 використовувався прапор DSSCL_EXCLUSIVE. У документації SDK 8 сказано, що цей прапор уже застарів і не надасть додатком ексклюзивного режиму. Для цього тепер використовується прапор DSSCL_PRIORITY. Взагалі, ексклюзивний режим має на увазі приглушення всіх інших звуків, якщо наш додаток активно і саме відтворює будь-який звук. Я пробував встановлювати обидва прапора, і в обох випадках крім власного виведення було чути і висновок інших програм, що запускаються паралельно, навіть якщо вікно програми було активно. Що це, мої помилки або помилки в DirectSound - я не знаю. Якщо у вас все працює коректно, напишіть мені.

Тепер програма нічого не робить, а чекає, коли користувач натисне кнопку "Відкрити ...". Після клацання на ній відкривається діалогове вікно вибору звукового файлу. Після успішного вибору викликається функція CreateStaticBuffer (), єдиний параметр якої - ім'я відкривається wav-файлу. Ця функція створює спеціальний звуковий буфер.

Звуковий буфер - це область пам'яті, створювана в RAM або пам'яті звукової карти, в якій будуть розміщені семпли - звукові дані, лічені з wav-файлу. Використовуючи цей буфер, DirectSound зможе відтворити звук.

Для створення звукового буфера служить метод IDirectSound8.CreateSoundBuffer (). Перший параметр - адреса структури типу TDSBUFFERDESC. Її поля необхідно попередньо заповнити. Другий - покажчик на інтерфейс IDirectSoundBuffer, Третій - всюдисущий параметр агрегування - передаємо nil. Тепер розберемося зі структурою TDSBUFFERSDESC.

Вона вказує DirectSound, який тип буфера ми хочемо створити. Як завжди, системну пам'ять, де розташовані поля структури, необхідно заповнити нульове значення функцією ZeroMemory () (або FillChar ()). Поле dwSize повинно містити розмір самої структури в байтах. Поле dwFlags визначає тип створюваного звукового буфера. Ось деякі прапори:

Це тільки половина можливих прапорів. Детальніше про них можна дізнатися з довідки SDK.
 Тепер необхідно призначити необхідний розмір для буфера в байтах, щоб в ньому помістилися всі дані з wav-файлу - заповнити поле dwBufferBytes.

Вся робота по відкриттю wav-файлів, завантаження з них даних і завершення роботи з ними покладається на клас TWaveSoundRead - можна користуватися ним як "чорним ящиком" - нічого цікавого в реалізації методів класу немає - суцільні операції з покажчиками і виклик функцій з модуля lowfunc. pas. Взагалі DirectSound створювався лише для прямого доступу до звукової карти, і в його завдання не входить читання звукових даних з файлів, будь то навіть стиснені wav-файли - мультимедіа-стандартами Windows. Вся робота по завантаженню даних в буфер лягає на програміста. На жаль, це сильно ускладнює навіть найпростіші проекти, т. К. Функції для роботи з wav-файлами досить громіздкі, а про роботу з іншими форматами і говорити не доводиться. Про клас я ще згадаю, а зараз лише скажу, що при виклику методу TWaveSoundRead.Open () при успішному відкритті звукового файлу поле m_ckIn.cksize класу містить розмір прочитаних даних в байтах - це значення і вказуємо в полі dwBufferBytes структури TDSBUFFERDESC. Також необхідно вказати формат даних в звуковому файлі - адже запис може бути стерео або монофонічною, з різною частотою дискретизації і т. Д. Дізнатися це DirectSound зможе з поля lpwfxFormat типу TWAVEFORMATEX структури TDSBUFFERDESC. Його необхідно прирівняти до полю m_pwfx класу TWaveSoundRead - воно якраз і містить ці дані. Тут я допустив невелику помилку в программотехніке - ООП вимагає, щоб доступ до даних класу здійснювався тільки через методи цього класу - але я просто скопіював реалізацію класу з файлів SDK Microsoft.

На випадок, якщо DirectSound не зможе створити буфер заданого розміру - наприклад, велика частина пам'яті звукової карти або RAM зайнята - необхідно запам'ятати реальний розмір створеного буфера - він (розмір) буде поміщений в поле dwBufferBytes тієї ж струтури, що передавалася в метод IDirectSound8.CreateSoundBuffer ().

Отже, буфер створений, тепер необхідно його заповнити звуковими даними. У цьому знову допоможе клас TWaveSoundRead. Заповнення буфера даними відбувається в функції FillBuffer ().

Спершу необхідно прочитати дані з звукового файлу. Процедурою GetMem () виділяємо облать пам'яті потрібного розміру і отримуємо на неї покажчик - змінна pbWavData. Потім записуємо дані в пам'ять за допомогою методу TWaveSoundRead.Read (). Тепер необхідно скопіювати дані в буфер DirectSound.

Порядок дій досить простий: необхідно заблокувати пам'ять буфера, скопіювати в нього звукові дані і потім не забути розблокувати буфер. Блокування буфера відбувається методом IDirectSoundBuffer.Lock (). Перший параметр, dwWriteCursor, показує, з якої позиції мають бути заблоковані буфер. Позиція є просте зміщення від початку буфера. Якщо передати 0, то блокування буде відбуватися з самого початку буфера. Другий, dwWriteBytes, повідомляє розмір блокируемой області, він не повинен перевищувати реальний розмір буфера. Тут я передав значення змінної bbytes - в ній зберігається реальний розмір створеного звукового буфера. Далі необхідно передати адреси двох пар "покажчик-розмір", в які метод поміщає адреси блокованих областей і їх розмір. Останній параметр - 0.

Дані в буфер копіюються процедурою CopyMemory () - вказуємо, куди копіювати, звідки копіювати і скільки копіювати :-).

Тепер розблокуємо буфер методом IDirectSoundBuffer.Unlock () і видалимо область, звідки копіювали процедурою FreeMem ().

Ми створили звуковий буфер і завантажили в нього дані. Вся чорна робота позаду, тепер можна програмувати "із задоволенням". Програвання даних в буфері здійснюється методом IDirectSoundBuffer.Play (). Перший параметр зарезервований - потрібно вказати 0. Другий вказує на пріоритет звукового буфера - що це за звір, я і сам толком не знаю. Значення може змінюватися від 0 до $ FFFFFFFF. Якщо при створенні звукового буфера не вказувався прапор DSBCAPS_LOCDEFER, то необхідно передати 0. Останній параметр - комбінація прапорів, які вказують спосіб програвання буфера. Для простого відтворення просто передаємо 0, а при циклічному - прапор DSBPLAY_LOOPING. Про інших можна дізнатися з SDK.

У вікні є два регулятора TScrollBar. Лівий призначається для зміни гучності звуку, другий - для зміни балансу в колонках. Зміна гучності проводиться методом IDirectSoundBuffer.SetVolume (), Єдиним параметром якого є значення в інтервалі від 0 до -10000 - визначено константами DSBVOLUME_MAX і DSBVOLUME_MIN. Так-так, зміна гучності звуку проводиться тільки в сторону приглушення, навіть у восьмій версії цей недолік не усунутий: (Зміна балансу в колонках проводиться методом IDirectSoundBuffer.SetPan (), Єдиним параметром якого є значення в інтервалі від 10000 до -10000 - визначено константами DSBPAN_LEFT і DSBPAN_RIGHT. Розставте колонки (якщо вони є) ширше, запустіть приклад і спробуйте посувати скроллбар - слухайте самі. Звичайно, це не 3D-ефекти, але зате дуже просто.

Тепер саме час заглянути в файл wavread.pas - якщо у кого є бажання копатися з покажчиками, можете попрацювати з ним. Я не буду описувати його методи, т. К. Все це досить складно і вимагає кілька сторінок тексту. Цей клас гранично простий, але не він працює з wav-файлами - йде виклик функцій з lowfunc.pas. Ці два файли є МОЇМ перекладанням з DirectX SDK 7 для C ++ - в SDK 8 усе значно перероблено, і як мені здається, ускладнено. Тепер про не дуже приємне. Вважаю, що не дуже добре показувати людям, як працює DirectSound, не розібравшись з усім до кінця самому. Проблема в тому, що одна з функцій з lowfunc.pas не працює, а інша недописана до кінця. Я не зміг перевести деякі складні операції над покажчиками в контекст мови Object Pascal, тому довелося створити динамічну бібліотеку на C ++ для працездатності прикладу. Якщо хтось зможе допомогти мені перевести все на Pascal - буду щиро вдячний. Я залишив вихідний код з SDK в окремому каталозі.

I. ОСНОВНІ Богословська ПОЛОЖЕННЯ

I.1. Церква є зібрання віруючих у Христа, в яке Ним Самим закликається увійти кожен. У ній "все небесне і земне" треба з'єднати у Христі, бо Він - Глава "Церкви, яка є тіло, повня Того все всім наповняє" (Еф. 1. 22-23). У Церкви дією Святого Духа відбувається обоження творіння, виповнюється початковий задум Божий про світ і людину.

Церква являє результат спасенної подвигу Сина, посланого Отцем, і освячує дії Духа Святого, який зійшов у великий день П'ятидесятниці. За висловом святого Іринея Ліонського, Христос очолив Собою людство, став Главою оновленого людського єства - Його тіла, в якому знаходиться доступ до джерела Святого Духа. Церква - єдність "нової людини у Христі", "єдність Божої благодаті, що живе в безлічі розумних творінь, слухає благодаті" (А. с. Хом'яків). "Чоловіки, жінки, діти, глибоко розділені щодо раси, народу, мови, способу життя, праці, науки, звання, багатства ... - всіх їх Церква відтворює в Дусі ... Все отримують від неї єдину природу, недоступну руйнування, природу, на яку не впливають численні і глибокі відмінності, якими люди відрізняються один від одного ... у ній ніхто аж ніяк не відділений від загального, все як би розчиняються одна в одній простій і нероздільної силою віри "(святий Максим Сповідник).

I.2. Церква є боголюдський організм. Будучи тілом Христовим, вона поєднує в собі два єства - божеське і людське - з притаманними їм действованіі і вільний. Церква пов'язана зі світом за своєю людської, тварному природі. Однак вона взаємодіє з ним не як суто земної організм, але у всій своїй таємничої повноті. Саме богочеловеческая природа Церкви уможливлює благодатне преображення і очищення світу, що відбувається в історії в творчому співдіянні, "синергії" членів та Голови церковного тіла.

Церква - не від світу цього, так само, як її Господь, Христос - не від світу цього. Але Він прийшов в цей світ, "упокоривши" Себе до його умов, - в світ, який належало Йому врятувати і відновити. Церква повинна пройти через процес історичного кенозису, здійснюючи свою спокутну місію. Її метою є не тільки порятунок людей в цьому світі, але також порятунок і відновлення самого світу. Церква покликана діяти в світі за образом Христа, свідчити про Нього і Його Царстві. Члени Церкви покликані долучатися місії Христової, Його служінню світу, яке можливе для Церкви лише як служіння соборну, "щоб увірував світ" (Ін. 17. 21). Церква покликана служити порятунку світу, бо й Сам Син Людський "не для того прийшов, щоб Йому служили, але щоб послужити і віддати душу Свою дати на викуп багатьох" (Мк. 10. 45).

Спаситель говорить про Себе: "Я посеред вас, як службовець" (Лк 22. 27). Служіння в ім'я порятунку світу і людини не може обмежуватися національними або релігійними рамками, як ясно говорить про це Сам Господь у притчі про милосердного самарянина. Більш того, члени Церкви стикаються з Христом, які зазнали всі гріхи і страждання світу, зустрічаючи кожного голодного, бездомного, хворого, ув'язненого. Допомога стражденним є в повному розумінні допомогу Самому Христу, і з виконанням цієї заповіді пов'язана вічна доля кожної людини (Мф. 25. 31-46). Христос закликає Своїх учнів не гребувати світом, але бути "сіллю землі" і "світлом світу".

Церква, будучи тілом Боголюдини Христа, богочеловечности. Але якщо Христос є досконалий Богочоловік, то Церква ще не є досконале богочеловечество, бо на землі вона воює з гріхом, і її людство, хоча внутрішньо і пов'язане з Божеством, далеко не в усьому Його висловлює і Йому відповідає.

I.3. Життя в Церкві, до якої закликається кожна людина, є невпинне служіння Богу і людям. До цього служіння призивається весь народ Божий. Члени тіла Христового, беручи участь в спільному служінні, виконують і свої особливі функції. Кожному дається особливий дар для служіння всім. "Служіть один одному, кожен тим даром, якого отримав, як доморядники всілякої Божої" (1 Пет. 4. 10). "Одному бо Духом дається слово мудрости, а другому слово знання тим же Духом, а іншому віра тим же Духом, а іншому дари вздоровлення тим же Духом, а іншому роблення чуд, а іншому пророкування, а іншому розпізнавання духів, а тому різні мови, а іншому вияснення мов. Все ж оце чинить один і той Самий Дух, уділяючи кожному осібно, як Він хоче "(1 Кор. 12. 8-11). Дарунки всілякої Божої благодаті даються кожному окремо, але для спільного служіння народу Божого (в тому числі і для служіння миру). І це є спільне служіння Церкви, що здійснюється на основі не одного, а різних дарів. Різниця ж дарів створює і відмінність служінь, але "служіння різні, а Господь один і той же; різниця й між діями, але Бог той же, в усіх робить усе" (1 Кор. 12. 5-6).

Церква закликає своїх вірних чад і до участі в суспільному житті, яке повинно ґрунтуватися на принципах християнської моралі. У Первосвященицькій молитві Господь Ісус просив Небесного Отця про Своїх послідовників: "Не благаю, щоб Ти їх зо світу, але щоб зберіг їх від зла ... Як Ти послав Мене у світ, так і Я послав їх у світ" (Ін. 17. 15,18). Неприпустимо маніхейське гнушеніе життям навколишнього світу. Участь християнина в ній повинно ґрунтуватися на розумінні того, що світ, соціум, держава є об'єктом любові Божої, бо призначені до перетворенню і очищенню на засадах богозаповіданої любові. Християнин повинен бачити світ і суспільство в світлі його кінцевого призначення, в есхатологічному світлі Царства Божого. Розрізнення дарів в Церкві особливим чином проявляється в області її суспільного служіння. Нероздільний церковний організм бере участь в житті навколишнього світу у всій повноті, проте духовенство, чернецтво та миряни можуть по-різному і в різній мірі здійснювати таку участь.

I.4. Виконуючи місію порятунку роду людського, Церква робить це не тільки через пряму проповідь, а й через благі справи, спрямовані на поліпшення духовно-морального і матеріального стану навколишнього світу. Для цього вона вступає у взаємодію з державою, навіть якщо воно не носить християнського характеру, а також з різними громадськими асоціаціями та окремими людьми, навіть якщо вони не ідентифікують себе з християнською вірою. Не ставлячи прямої задачі звернення всіх в Православ'я в якості умови співпраці, Церква сподівається, що спільне благодіяння приведе її співпрацівників і оточуючих людей до пізнання Істини, допоможе їм зберегти або відновити вірність богоданним моральним нормам, спонукає їх до миру, злагоди і добробуту, в умовах яких Церква може найкращим чином виконувати своє спасительне діяння.

 




 III. ЦЕРКВА І ДЕРЖАВА |  IV. ХРИСТИЯНСЬКА ЕТИКА І СВІТСЬКЕ ПРАВО |  V. ЦЕРКВА І ПОЛІТИКА |  VI. ПРАЦЯ ТА ЙОГО ПЛОДИ |  VII. Власний |  VIII. ВІЙНА І МИР |  IX. ЗЛОЧИННІСТЬ, ПОКАРАННЯ, ВИПРАВЛЕННЯ |  XI. ЗДОРОВ'Я ОСОБИСТОСТІ І НАРОДУ |  XII. ПРОБЛЕМИ БІОЕТИКИ |  XIII. ЦЕРКВА І ПРОБЛЕМИ ЕКОЛОГІЇ |

© um.co.ua - учбові матеріали та реферати