книги хакеры / журнал хакер / специальные выпуски / Специальный выпуск 4_compressed
.pdf
|
|
КОНСТРУКТОР |
|
|
|
>СПЕЦВЫПУСК #4 |
0063 |
99 |
|
|
ÈÇÍÈ Î DIRECT3D
|
|
|
|
Kit - как следует из перевода, набор для созда- |
но ответить на этот нелегкий вопрос. Если будут |
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
ния прог. В него входит документация (именно |
еще окна, просто игнорируй их ОК’ом. Вот ты и |
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
она почему-то чаще всего и имеется ввиду под |
создал пустой проект. Теперь надо создать |
|
|
|
|
|
|||||||||
|
|
|
|
аббревиатурой SDK), заголовки, библиотеки и, |
файл, где и будет расположен твой исходник. |
|
|
|
|
|
|||||||||
|
|
|
|
реже, примеры. Оное SDK к DX’у 7 тебе и при- |
Опять жми File->New. Но на этот раз выбирай |
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
дется торжественно заполучить с сайта мелко- |
вкладку Files. Тип файла - C++ Source File. На- |
|
|
|
|
|
|||||||||
|
|
|
|
мягких, а конкретнее с msdn.micro- |
зови его как-нибудь, например, Main - главный. |
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
soft.com/directx - официального сайта разработ- |
Теперь перейдем к набиванию самого текста |
|
|
|
|
|
|||||||||
|
|
|
|
чиков DirectX. Там в разделе DirectX Downloads |
проги. |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
ткнешь на пимпы DirectX Documentation и DirectX |
Пытка ¹2 - трепанация черепа. |
|
|
|
|
|
|||||||||
|
|
|
|
Headers and Libraries èëè ÷òî-òî òèïà òîãî. Íî ÿ |
|
|
|
|
|
||||||||||
|
|
|
|
|
Для начала нам нужен windows.h - |
виндовский |
|
|
|||||||||||
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
тебе не советую жать на Download DirectX SDK - |
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
ты ведь не хочешь качать 127 метров?! |
Зачем мы это делаем?!? А так до мозгов легче |
|
заголовок. ddraw.h - заголовок DirectDraw. d3d.h |
|
|||||||||||
|
|
|
|
|
|
|
|
|
добраться. Помнишь, мы когда-то копировали |
|
- заголовок Direct3D. Сто-о-о-п! Чуть не забыл, |
|
|||||||
|
|
|
|
Когда ты закончишь качать, распакуй этот тро- |
файлы в INCLUDE и LIB. Настал их черед. Для |
|
в самом начале надо объявить D3D_OVERLOADS. |
|
|||||||||||
|
|
|
|
фей куда-нибудь и скопируй с замещением все |
начала подключим библиотеки. Жми Projects- |
|
Это значительно упростит нам жизнь - там |
|
|||||||||||
|
|
|
|
файлы из папок INCLUDE и LIB в соответствую- |
>Settings. |
|
|
|
|
|
|
объявлены перегруженные операторы и вспомо- |
|
||||||
|
|
|
|
щие папки твоей VisualC++. Вот, а теперь зай- |
|
|
|
|
|
|
|
гательные функции. Да, кстати, что такое перег- |
|
||||||
|
|
|
|
мемся пытками. |
|
|
|
|
|
|
|
|
|
руженные операторы, ты у меня не спрашивай - |
|
||||
|
Пытка ¹1 - А! Мы его подвесим под |
|
|
|
|
|
|
|
|
тебе лучше не знать (кошмары ночью сниться |
|
||||||||
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
будут). Дальше нам надо подключить tchar.h - |
|
|||||||||
|
потолком, а снизу подложим шипы. |
|
|
|
|
|
|
|
|
библиотека, работающая с типами LPSTR, |
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TCHAR и т.д. И time.h - для работы со временем |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
Äëÿ |
начала надо создать пустой Win32 проект. |
|
|
|
|
|
|
|
- пригодится потом. В общем, это должно выг- |
|
|||||
|
|
|
|
Åñëè |
ты еще не работал в VisualC, то это делает- |
|
|
|
|
|
|
|
лядеть так: |
|
|||||
|
|
|
|
ñÿ |
очень хитрым образом. Загружай C++. Дави |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
ñî |
всей силы на File->New. Если в появившемся |
|
|
|
|
|
|
Таким образом мы уже имеем 6 строк нашей |
|
|
|||||
|
|
|
|
îêíå |
еще не выбрана вкладка Projects, то сделай |
|
|
|
|
|
|
проги (скажу тебе по секрету, их будет 219 :))! |
|
|
|||||
|
|
|
|
ýòî |
сам. Тип проекта: Win32 Application. Имя, ну, |
|
|
|
|
|
|
|
Далее надо объявить указатели на интерфейсы |
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Листинг ¹1 - main.cpp, подключение заголовков. |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
#define D3D_OVERLOADS //Разрешаем использование специальных функций и перегруженных |
операторов, облегчающих работу с Direct3D |
|
|||||||||||||
|
|
|
|
#include <windows.h> //Подключаем виндовский заголовок для работы с окнами и т.д. |
|
|
|
|
|
|
|
||||||||
|
|
|
|
#include <ddraw.h> |
//Подключаем заголовок DirectDraw’а, он нужен для Direct3D |
|
|
|
|
|
|
|
|||||||
|
|
|
|
#include <d3d.h> |
//Ну и самое главное - заголовок Direct3D |
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
#include <tchar.h> |
//Заголовок, в котором определены такие функции, как _T и т.д. |
|
|
|
|
|
|
|
|||||||
|
|
|
|
#include <time.h> |
//В этом заголовке объявлены некоторые временные функции (например, |
для получения FPS) |
|
||||||||||||
|
|
|
|
например, XAKEP3D. В общем, выглядеть это |
В появившемся окне жми на вкладку Link. |
 ïî- |
|
DirectX. Нам нужен один указатель IDirectDraw7, |
|
||||||||||
|
|
|
|
|
|||||||||||||||
|
|
|
должно примерно так: |
|
ле Object/library modules вводи такие странные |
|
îäèí - IDirect3D7, îäèí - IDirect3DDevice7 (èìåí- |
|
|||||||||||
|
|
|
|
|
|
|
|
|
слова, через пробел: dxguid.lib ddraw.lib |
|
но этот интерфейс и работает с 3D графикой), |
|
|||||||
|
|
|
|
|
|
|
|
|
d3dim.lib. Зачем ты это сделал, я сейчас пояс- |
|
два - IDirectDrawSurface7 (этот интерфейс яв- |
|
|||||||
|
|
|
|
|
|
|
|
|
ню. dxguid.lib - библиотека гидов (от аббревиа- |
|
ляется “хранителем” аппаратно-зависимых |
|
|||||||
|
|
|
|
|
|
|
|
|
òóðû GUID - Globally Unique IDentifier |
- Глобаль- |
|
изображений, а два их нужно для двойной буфе- |
|
||||||
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
ный Уникальный ИДентификатор - ГУИД, но гид |
|
ризации, один - экранный буфер, другой - |
|
|||||||
|
|
|
|
|
|
|
|
|
- проще :)) различных DirectX - классов. Ты пом- |
|
внеэкранный). Еще надо объявить переменные: |
|
|||||||
|
|
|
|
|
|
|
|
|
íèøü |
â |
реестре |
такой |
раздел: |
|
массив на 6 элементов типа D3DVERTEX (эта |
|
|||
|
|
|
|
|
|
|
|
|
HKEY_CLASSES_ROOT\CLSID\, а там такие |
|
структура описывает точку в 3D, 6 их нужно, т.к. |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
странные слова, как {58DA8D96-9D6A-101B- |
|
3 - точки полигона, два же по три - для “двухсто- |
||||||||
|
|
|
|
|
|
|
|
|
AFC0-4210102A8DA7}? Íåò? À îíè òàì! Ýòî è åñ- |
|
ронности” - помнишь рендеринг по часовой и |
||||||||
|
|
|
|
|
|
|
|
|
ть пресловутые гиды. ddraw.lib - библиотека, ис- |
|
против часовой стрелки - кажется глупо и неу- |
||||||||
|
|
|
|
|
|
|
|
|
пользующая DirectDraw. d3dim.lib - библиотека |
|
добно, хотя в большинстве случаев это совсем |
||||||||
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
Direct3D Immediate Mode. Вот. Теперь надо под- |
|
наоборот), одна - D3DMATERIAL7 (описание цве- |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ключить заголовки. Если ты еще не раздавил |
|
та, отражаемости и т.д.), одна - D3DLIGHT7 |
||||||||
|
|
|
|
Тыкай в |
ОК. В следующем окне выбирай An |
ОК, то сейчас самое время это сделать. Теперь |
|
(описание источников света) и одна - HWND |
|||||||||||
|
|
|
|
empty project и спроси себя - а почему бы и не |
в файле Main.cpp (или как ты его там назвал) на- |
(описание окна). |
|
|
|
||||||||||
|
|
|
|
нажать на Finish? Я тебе посоветую положитель- |
до подключить заголовки. |
|
|
|
Гхм... Сейчас будет уже интереснее... |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
0064 |
КОНСТРУКТОР |
|
|
>СПЕЦВЫПУСК #4 |
|
|
||||||
|
|
|
|
|
|
|
Пытка ¹3 - выковыривание мозгов. |
(флаг DDSCL_FULLSCREEN), раз так, значит у |
другую при буферизации в полноэкранном ре- |
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
нас эксклюзивный режим (DDSCL_EXCLUSIVE), |
æèìå). DDSCAPS_PRIMARYSURFACE - ýòà ñåð- |
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
Опять же, а зачем?!? Ответ очень похож на воп- |
и если вдруг повиснет, будет работать |
файса - главная. DDSCAPS_3DDEVICE - на ней |
|||||||||||||||||||||||||||||
рос: а зачем ему мозги??!? |
|
|
Ctrl+Alt+Del :) (DDSCL_ALLOWREBOOT), è ôàê- |
рисует Direct3D девайс |
(ddsd2.ddsCaps.dwCaps |
|
|
||||||||||||||||||||||||
Листинг ¹2 - main.cpp, объявление переменных. |
|
|
|
|
|
|
|
|
= DDSCAPS_COMPLEX |
|
| |
DDSCAPS_FLIP |
|
| |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
DDSCAPS_PRIMARYSURFACE |
| DDSCAPS_3DDE- |
|
|||||||||||||||||||||
LPDIRECTDRAW7 lpDD; //Интерфейс IDirectDraw7 |
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
VICE;). |
Дальше осталось |
добавить, что |
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
LPDIRECT3D7 lpD3D; //IDirect3D7 |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
внеэкранный |
буфер |
|
|
ó |
серфайсы |
|
1 |
|
|
|
|||||||||||
LPDIRECT3DDEVICE7 lpD3DD; //IDirect3DDevice7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
(ddsd2.dwBackBufferCount = 1;). Äëÿ òîãî |
чтобы |
|
|
|
|||||||||||||||||||
LPDIRECTDRAWSURFACE7 lpBB; //IDirectDrawSurface7 - “задний” буфер |
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
LPDIRECTDRAWSURFACE7 lpM; //IDirectDrawSurface7 - буфер экрана |
|
|
|
|
|
|
непосредственно создать серфайсу, надо |
âîñ- |
|
||||||||||||||||||||||
|
|
|
|
|
|
пользоваться методом CreateSurface все |
òîãî |
|
|||||||||||||||||||||||
D3DMATERIAL7 mat; //Так называемый материал - данные о цвете |
|
|
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
D3DVERTEX vtx[6]; //Данные о вершинах |
|
|
|
|
|
|
|
|
же интерфейса IDirectDraw7. Первый его пара- |
|
|||||||||||||||||||||
D3DLIGHT7 d3dLight; //”Лампа” - освещение |
|
|
|
|
|
|
|
|
ìåòð - DDSURFACEDESC* |
|
(т.е. - указатель), |
òàê |
|
|
|
||||||||||||||||
HWND hWnd; //Структура, описывающая окно |
|
|
|
|
|
|
|
|
и пишем: &ddsd2. Второй параметр - указатель |
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
на создаваемую серфайсу, нацарапаем |
|
|
&lpM. |
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
Отныне мы будем ее инициализировать. Всю |
тически вторым параметром |
будет являться |
Последний параметр |
значит то же, |
÷òî |
è ó |
|
|
|
||||||||||||||||||||||
инициализацию мы запихнем в огромную фун- |
DDSC_FULLSCREEN | DDSCL_EXCLUSIVE | |
DirectDrawCreateEx, |
NULL. Вот теперь мы |
созда- |
|
|
|||||||||||||||||||||||||
кцию типа HRESULT InitializeD3D(), она будет |
DDSCL_ALLOWREBOOT. Теперь пора уже и по- |
дим внеэкранный буфер. Для его создания нам |
|
||||||||||||||||||||||||||||
возвращать ошибки D3D, если они возникнут. |
менять разрешение экрана на 1280x1024x24, |
понадобится лишь переменная типа DDSCAPS2, |
|
||||||||||||||||||||||||||||
Для начала мы создадим интерфейс |
хотя нет, 24 - слишком жирно. Пусть будет 16. |
пусть будет ddscaps. В нее мы запишем |
|
||||||||||||||||||||||||||||
IDirectDraw7. |
Вызовем |
|
функцию |
Давай-ка вызовем метод SetDisplayMode все |
DDSCAPS_BACKB.UFFER - эта серфайса - |
|
|||||||||||||||||||||||||
DirectDrawCreateEx (в старых версиях DX, до |
того же интерфейса. Первые два параметра - |
внеэкранный буфер. DDSCAPS_3DDEVICE - на |
|
||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
седьмой, вместо нее была DirectDrawCreate, но, |
разрешение (1280х1024). Третий - глубина цве- |
него рисует Direct3D девайс. DDSCAPS_FLIP - |
|
||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
благодаря большим |
изменениям в DX7, появи- |
та (16), четвертый - FPS (0 - пусть какое угодно |
разрешить метод Flip. Больше нам ничего дель- |
|
|
||||||||||||||||||||||||||
лась вышеуказанная). Ее первый параметр - гид |
будет, все равно это работает хреново), пятый - |
ного указывать в капсах не надо (DDSCAPS2 |
|||||||||||||||||||||||||||||
девайса, т.к. я не знаю, какой конкретно девайс |
флаги (ничего дельного тут нет, ставим 0). Сле- |
ddscaps = { DDSCAPS_BACKBUFFER | DDS- |
|||||||||||||||||||||||||||||
стоит на твоей машине, пишем туда NULL - пус- |
дующее место вызвало у меня в свое время |
CAPS_3DDEVICE | DDSCAPS_FLIP, 0, 0, 0 };). Òå- |
|
|
|||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
ть определяет сам. Второй параметр - указа- |
массу недовольств, но когда я понял что к чему, |
перь мы ее создадим. Но сделаем это хитро - |
|||||||||||||||||||||||||||||
тель, в который он запишет адрес созданного |
было противно, что я сразу не догадался. Дабы |
воспользовавшись методом GetAttachedSurface |
|
|
|||||||||||||||||||||||||||
нами интерфейса, торжественно впишем туда |
уберечь тебя от моей ошибки, я тебе все тут по- |
интерфейса IDirectDrawSur-face7. Первый пара- |
|
|
|||||||||||||||||||||||||||
(VOID**)&lpDD. Третий параметр является ги- |
корно расскажу. Итак, мы приступаем к созда- |
метр - DDSCAPS2* - наш любимый &ddscaps. |
|||||||||||||||||||||||||||||
дом IDirectDraw7, поэтому он ВСЕГДА должен |
нию серфайсов (IDirectDrawSurface7) - цепочки |
Второй - указатель на создаваемую серфайсу - |
|
|
|||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
быть IID_IDirectDraw7 (к чему такая тупость, я не |
двойной буферизации. Сначала надо создать |
&lpBB. Все, что мы сейчас натворили, можно |
|||||||||||||||||||||||||||||
понимаю). Последний, четвертый параметр за- |
главную серфайсу. Делается это так (в общем, |
увидеть в листинге: |
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
резервирован и предназначен для каких-то бу- |
при создании практически любой серфайсы это |
Здесь самое место (и нигде более) создать D3D |
|||||||||||||||||||||||||||||
дущих возможностей COM, а пока не исполь- |
делается так). Объявляем переменную типа |
||||||||||||||||||||||||||||||
зуется и глючит, если его значение не NULL. Да- |
DDSURFACEDESC2, например, ddsd2. Опусто- |
девайс. Делается это методом CreateDevice ин- |
|||||||||||||||||||||||||||||
лее надо создать интерфейс IDirect3D7. Благо- |
øàåì åå ZeroMemory(&ddsd2, sizeof(DDSUR- |
терфейса IDirect3D7, первым параметром кото- |
|||||||||||||||||||||||||||||
даря свирепым проискам COM, это сделать |
FACEDESC2)) - &ddsd2 - указатель на ddsd2, |
рого является гид создаваемого девайса, он мо- |
|||||||||||||||||||||||||||||
очень просто - его надо создать из IDirectDraw7, |
sizeof - размер (параметр - тип (класс, структу- |
жет быть одним из указанных: IID_IDi-rect3DTn- |
|||||||||||||||||||||||||||||
воспользовавшись методом QueryInterface, пер- |
ра и т.д.)). И давай заполнять параметры. Раз- |
LHalDevice, IID_IDirect3DHALDevice, IID_IDi- |
|||||||||||||||||||||||||||||
вым параметром которого является гид созда- |
мер dwSize будет равен sizeof(ddsd2) |
rect3DRGBDevice (первый работает, если на |
|||||||||||||||||||||||||||||
ваемого |
интерфейса (в |
данном |
случае - |
(ddsd2.dwSize = sizeof(ddsd2)). Дальше - флаги. |
компе стоит новый девайс, поддерживающий |
||||||||||||||||||||||||||
IID_IDirect3D7), а вторым - указатель |
Так как нам нужны дополнительные параметры |
все 3D фичи. Второй - если аксель держит толь- |
|
||||||||||||||||||||||||||||
((VOID**)&lpD3D). Íî ýòî åùå íå âñå, íàäî ïðî- |
(в капсах), нужен флаг DDSD_CAPS, и так как у |
ко часть возможностей. Третий - если акселя |
|||||||||||||||||||||||||||||
верять этот отстой на ошибки (поэтому у нас |
нас есть внеэкранные буферы, нужен флаг |
принципиально нет). Так как я опять же не знаю, |
|||||||||||||||||||||||||||||
функция типа HRESULT - мы будем все эти |
DDSD_BACKBUFFERCOUNT (ddsd2.dwFlags = |
какой у тебя девайс, тут придется перепробо- |
|
|
|||||||||||||||||||||||||||
ошибки возвращать). Для этого создадим сразу |
DDSD_CAPS | DDSD_BACKBUFFERCOUNT;). |
вать все: от TnLHal до RGB. Вторым параметром |
|||||||||||||||||||||||||||||
после объявления функции переменную hr типа |
Дальше - капсы. Нужен DDSCAPS_COMPLEX - |
- серфайса, на которую мы будем рендерить |
|
|
|||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
HRESULT и ей будем присваивать значение вы- |
серфайса не одна в цепочке буферизации, |
(оной будет внеэкранный буфер - lpBB). |
|||||||||||||||||||||||||||||
зываемого метода. А после будем проверять та- |
DDSCAPS_FLIP - разрешен метод Flip (метод ко- |
Третьим - указатель на интерфейс создаваемо- |
|||||||||||||||||||||||||||||
ким вот образом: if(FAILED(hr)) return hr;. Итак, а |
пирования изображения из одной серфайсы в |
го девайса. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
теперь листинг начала инициализации: |
Листинг ¹3 - Main.cpp, начало инициализации. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
Теперь надо поставить режим работы |
HRESULT InitializeD3D() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
DirectDraw. Делается это с помощью |
HRESULT hr; //Данные о результате выполнения процедуры |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
метода SetCooperativeLevel интерфей- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
hr = DirectDrawCreateEx(NULL, (VOID**)&lpDD, IID_IDirectDraw7, NULL); |
//Создадим интерфейс DirectDraw’а |
||||||||||||||||||||||||||||||
са IDirectDraw7. Первый |
параметр |
- |
|||||||||||||||||||||||||||||
|
if(FAILED(hr)) //Проверим на ошибки |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
окно, то есть HWND, вот и запишем ту- |
|
return hr; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
да hWnd. Второй параметр - преслову- hr = lpDD->QueryInterface(IID_IDirect3D7, (VOID**)&lpD3D); //Создадим интерфейс Direct3D |
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
тые особенности режима. Мы будем |
|
if(FAILED(hr)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
работать |
â |
полноэкранном режиме |
|
|
|
|
|
|
|
|
|
|
return |
hr; |
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
КОНСТРУКТОР |
|
|
|
>СПЕЦВЫПУСК #4 |
0065 |
101 |
|
|
|
|
|
|
|
Листинг ¹4 - Main.cpp, инициализация серфайсов. |
|
|
|
|
íèÿ, |
|
íàäî |
вызвать |
метод |
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
hr = lpDD->SetCooperativeLevel(hWnd , DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ |
ALLOWREBOOT); |
|
SetViewport |
|
|
|
интерфейса |
|
|
|
||||||||||||
|
|
|
|
|
|
//Важный момент. Устанавливаем параметры DirectDraw’а: |
|
|
|
|
IDirect3DDevice7 |
(теперь |
ïîä |
|
|
|
|||||||||||
|
|
|
|
|
|
//Эксклюзивный полноэкранный режим |
|
|
|
|
|
|
методами ты будешь понимать |
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
//Разрешить комбинацию Ctrl+Alt+Del (Если вдруг повиснет) |
|
|
|
|
методы именно этого интер- |
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
if(FAILED(hr)) |
|
|
|
|
|
|
фейса - дальше пойдут только |
|
|
||||||||||||
|
|
|
|
|
|
return |
hr; |
|
|
|
16 áèò |
|
|
îíè |
(çà |
небольшим |
исключе- |
|
|
||||||||
|
|
|
|
|
hr = lpDD->SetDisplayMode(1280, 1024, 16, 0, 0); //Режим экрана 1280х1024, глубина цвета |
|
|
нием - будет специально огово- |
|
|
|||||||||||||||||
|
|
|
|
|
|
if(FAILED(hr)) |
|
|
|
|
|
|
ðåíî), |
единственным |
|
парамет- |
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
return |
hr; |
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
ром которого будет указатель на |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
//Создаем “поверхности” экрана и буфера |
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
ýòîò |
самый |
D3DVIEWPORT |
(òî |
|
|
|
|||||||||
|
|
|
|
|
|
DDSURFACEDESC2 ddsd2; |
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
есть мы впишем туда &vp). Те- |
|
|
|||||||||||||
|
|
|
|
|
|
ZeroMemory(&ddsd2, sizeof(DDSURFACEDESC2)); |
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
перь любуйся листингом. |
|
|
|
|
|||||||||||||
|
|
|
|
|
|
ddsd2.dwSize = sizeof(ddsd2); |
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
ddsd2.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; //Есть внеэкранные буферы, есть |
доп. параметры |
|
Теперь |
íàäî |
создать |
|
вершины |
|
|
|
||||||||||||
|
|
|
|
|
ddsd2.ddsCaps.dwCaps = DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; |
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
нашего полигона и записать их в |
|||||||||||||||||||||
|
|
|
|
|
//Поверхность не одна в цепочке (двойная буферизация), разрешаем метод flip |
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
vtx |
óæå |
рендереспособными. |
|
|
|
|
||||||||||||
|
|
|
|
|
|
//Это - экранная главная поверхность, на ней рисует Direct3D устройство |
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
Все эти цифры я взял от балды |
|
|
|||||||||||||||
|
|
|
|
|
|
ddsd2.dwBackBufferCount = 1; // 1 внеэкранный буфер |
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
- они не имеют никакого прин- |
|
|
|||||||||||||||
|
|
|
|
|
|
hr = lpDD->CreateSurface(&ddsd2, &lpM, NULL); //Создание поверхности |
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
if(FAILED(hr)) |
|
|
|
|
|
|
ципиального смысла. И замечу, |
|
|
||||||||||||
|
|
|
|
|
|
return |
hr; |
|
|
|
|
|
|
÷òî |
â |
присваивании |
значений |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
//СОздаем внеэкранный буфер |
|
|
|
|
|
|
второй половины массива нару- |
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
DDSCAPS2 ddscaps = { DDSCAPS_BACKBUFFER | DDSCAPS_3DDEVICE | DDSCAPS_FLIP, 0, 0, 0 }; |
|
|
шен порядок - это все проделки |
|||||||||||||||||||
|
|
|
|
|
|
hr = lpM->GetAttachedSurface(&ddscaps, |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
паршивого задания |
вершин |
ïî |
|
|
|
||||||||||
|
|
|
|
|
|
&lpBB); //Подключаем к главной поверхности |
|
|
|
|
|
часовой стрелке. В общем - |
çðè |
|
|
|
|||||||||||
|
|
|
|
|
|
if(FAILED(hr)) |
|
|
|
|
|
|
в листинг. |
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
return |
hr; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vtx[0] = D3DVERTEX(D3DVECTOR(-2, |
0, |
0), -vNormal, 0, 0); |
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
vtx[1] = D3DVERTEX(D3DVECTOR( 0, -2, |
0), -vNormal, 0, 0); |
|
|
|
||||||||||||
|
|
|
|
|
Теперь |
будем |
пробовать создавать девайсы. |
го надо создать вупорт - ViewPort. Это |
|
|
|
||||||||||||||||
|
|
|
|
|
vtx[2] = D3DVERTEX(D3DVECTOR( 0, |
0, -2), -vNormal, 0, 0); |
|
|
|
||||||||||||||||||
|
|
|
|
|
Схема наших действий такова: 1. Пробуем соз- |
обыкновенный прямоугольник, в кото- |
|
|
|
||||||||||||||||||
|
|
|
|
|
vtx[5] = D3DVERTEX(D3DVECTOR(-2, |
0, |
0), vNormal, 0, 0); |
|
|
|
|||||||||||||||||
|
|
|
|
|
дать TnLHal девайс. Если проваливаем - идем на |
ром будет видно зарендеренное изоб- |
|
|
|
||||||||||||||||||
|
|
|
|
|
vtx[4] = D3DVERTEX(D3DVECTOR( 0, -2, |
0), vNormal, 0, 0); |
|
|
|
||||||||||||||||||
|
|
|
|
|
п.2, иначе идем на п.4. 2. Пробуем создать HAL |
ражение. Описывается он структурой |
vtx[3] = D3DVERTEX(D3DVECTOR( 0, |
0, -2), vNormal, 0, 0); |
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
девайс. Если проваливаем - идем на п.3, иначе |
D3DVIEWPORT7. Создай переменную |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
идем на п.4. 3. Пробуем создать RGB девайс. |
этого типа, например, vp. Присвой ей значение |
Пытка ¹4 - интересно, а какого |
цвета |
|
|
|
||||||||||||||||
|
|
|
|
|
Если проваливаем - сообщаем об ошибке и вы- |
{0, 0, 1280, 1024, 0.0f, 1.0f}. Первые две цифры |
у него кровь? |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
ходим. 4. Продолжаем... Из-за этой схемы дей- |
- координаты левого верхнего угла, вторые - |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
ствий кусок создания девайсов будет выглядеть |
правого нижнего. Последние - координаты по Z |
Как следует из названия, мы здесь будем зани- |
|
|
||||||||||||||||||
|
|
|
|
|
довольно забавно, но это в листинге. После это- |
(на хрен не нужны). Чтобы применить эти значе- |
маться цветом. То есть материалом и лампой. |
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Сначала проинициализируем материал. У него 5 |
|
|
|
|||||||||||
|
|
|
|
|
Листинг ¹5 - main.cpp, инициализация 3D девайсов |
|
|
параметров. |
4 |
|
(dcvDiffuse, |
dcvAmbient, |
|
|
|||||||||||||
|
|
|
|
|
hr = lpD3D->CreateDevice (IID_IDirect3DTnLHalDevice, //Полная акселерация |
|
|
dcvSpecular è dcvEmissive) èç íèõ òèïà D3DCOL- |
|
|
|||||||||||||||||
|
|
|
|
|
|
lpBB, |
&lpD3DD); |
|
|
|
|
ORVALUE - данные о цвете. Последний (dvPower) |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
- степень отражения цвета (блики). Параметры |
|
|
|||||||||||||
|
|
|
|
|
|
if(FAILED(hr)) //Проверка на ошибки |
|
|
|
|
dcvEmissive и dvPower нам не нужны - поэкспе- |
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
{ |
|
|
|
|
|
риментируешь |
ñ |
íèìè |
позже. |
Параметр |
|
|
|
|||||||||
|
|
|
|
|
|
|
|
hr = lpD3D->CreateDevice (IID_IDirect3DHALDevice, |
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
lpBB, |
|
|
dcvDiffuse реагирует с соответствующим пара- |
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
метром лампы (об этом позже) и является са- |
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
&lpD3DD); //По возможности акселим |
|
|
мым влиятельным |
íà |
öâåò |
параметром. |
|
|
|
||||||||||
|
|
|
|
|
|
|
|
if(FAILED(hr)) |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
dcvAmbient, |
êàê |
è |
предыдущий, |
реагирует с |
|
|
|
||||||||
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
соответствующим |
|
параметром |
|
лампы. |
|
|
|
||||||||
|
|
|
|
|
|
|
|
hr = lpD3D->CreateDevice (IID_IDirect3DRGBDevice, |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
lpBB, |
|
|
dcvSpecular |
- |
öâåò |
бликов. Вместе |
ñ |
dvPower |
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
можно добиться интересных результатов. Какой |
|
|
||||||||||||||
|
|
|
|
|
|
|
|
&lpD3DD); // Software Rendering |
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
цвет где поставить - увидишь в листинге. Чтобы |
|||||||||||||||||
|
|
|
|
|
|
|
|
if(FAILED(hr)) return hr; |
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
применить этот материал, надо воспользовать- |
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
ся методом SetMaterial с параметром - указате- |
|||||||||||||||||
|
|
|
|
|
} |
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
D3DVIEWPORT7 vp = { 0, 0, 1280, 1024, 0.0f, 1.0f }; |
|
|
лем на структуру D3DMATERIAL7 (то есть наца- |
||||||||||||||||||
|
|
|
|
|
|
hr = lpD3DD->SetViewport(&vp); //Создаем так называемый ViewPort - |
|
|
рапаешь там &mat - нашу переменную типа |
||||||||||||||||||
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
прямоугольник на серфайсе, |
|
|
D3DMATERIAL7). Теперь лампа. Это уже инте- |
||||||||||||||||
|
|
|
|
|
|
|
|
в который будем |
|
|
|
ресней. Правда, у нее куча параметров, что к че- |
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
рисовать |
|
|
|
|
му - объяснять долго - зри в SDK. Я объясню |
||||||||||||||
|
|
|
|
|
|
if(FAILED(hr)) |
|
|
|
|
только нужные нам сейчас. Это dcvDiffuse, |
||||||||||||||||
|
|
|
|
|
|
return |
hr; |
|
|
|
|
dcvAmbient, |
|
dcvSpecular, dvPosition, |
dltType, |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
0066 |
КОНСТРУКТОР |
|
|
>СПЕЦВЫПУСК #4 |
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dvAttenuation0, dvRange. Первые три объяснять |
Листинг ¹ 7 - Main.cpp, материал и свет. |
|
|
Его обязательно |
|
надо распола- |
|
||||||||||||||||||||
|
|
|
|
|
|
|
не надо, они просто реагируют с соответствую- |
mat.dcvDiffuse.r = (D3DVALUE)0.7; |
|
|
ãàòü |
между |
вызовами |
методов |
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
щими параметрами материала. dvPosition - по- |
mat.dcvDiffuse.g = (D3DVALUE)1.0; |
|
|
BeginScene |
è |
|
EndScene, |
íå |
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
зиция в пространстве, dltType - тип лампы |
mat.dcvDiffuse.b = (D3DVALUE)0.7; |
|
|
имеющих параметров. Вот и вы- |
|||||||||||||||||||||||
|
|
|
|
|
|
|
(D3DLIGHT_POINT - точечный, то есть наш, не |
mat.dcvDiffuse.a = (D3DVALUE)1.0; |
|
|
полняй сейчас BeginScene. Соб- |
|
||||||||||||||||||||||
|
|
|
|
|
|
|
mat.dcvAmbient.r = (D3DVALUE)0.0; |
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
имеет направления, но имеет четко заданную |
|
|
ственно |
рисование |
|
осущес- |
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
mat.dcvAmbient.g = (D3DVALUE)1.0; |
|
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
позицию; D3DLIGHT_SPOT - забавный тип, |
|
|
твляется методом DrawPrimitive. |
||||||||||||||||||||||||
|
|
|
|
|
|
|
mat.dcvAmbient.b = (D3DVALUE)0.0; |
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
имеет позицию и направление, светит неким ко- |
|
|
Первым его параметром являет- |
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
mat.dcvAmbient.a = (D3DVALUE)1.0; |
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
нусом (подробнее в SDK); D3DLIGHT_DIREC- |
|
|
ся тип примитива (в данном слу- |
||||||||||||||||||||||||
|
|
|
|
|
|
|
mat.dcvSpecular.r = (D3DVALUE)0.0; |
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
TIONAL - не имеет позиции, но имеет направле- |
|
|
÷àå |
|
D3DPT_TRIANGLELIST - ñïè- |
||||||||||||||||||||||
|
|
|
|
|
|
|
mat.dcvSpecular.g = (D3DVALUE)1.0; |
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
ние), dvAttenuation0 - некий параметр, отвечаю- |
mat.dcvSpecular.b = (D3DVALUE)0.0; |
|
|
ñîê |
|
полигонов; |
åùå |
|
|
åñòü |
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
щий за силу свечения лампы на определенном |
mat.dcvSpecular.a = (D3DVALUE)1.0; |
|
|
D3DPT |
_TRIANGLESTRIP - |
после- |
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
расстоянии (убойная вещь для создания ламп с |
hr = lpD3DD->SetMaterial(&mat); |
|
|
довательность оных; D3DPT_TRI- |
|||||||||||||||||||||||
|
|
|
|
|
|
|
нелинейной силой свечения), а dvRange - как |
if(FAILED(hr)) return hr; |
|
|
ANGLFAN - |
÷òî-òî |
òèïà |
веера, |
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
далеко будет светить. Создать наш свет (“Да бу- |
//Создаем нашу лампу |
|
|
ñì. SDK; D3DPT_LINELIST - ñïè- |
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
//Она будет белая |
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
дет свет!”, - сказал монтер и попу фосфором на- |
|
|
сок линий; D3DPT_LINESTRIP - |
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
//Тип - точечная (светит во все стороны) |
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
тер.) можно методом SetLight, первый его пара- |
последовательность; |
|
|
D3D- |
|||||||||||||||||||||||
|
|
|
|
|
|
|
d3dLight.dltType = D3DLIGHT_POINT; |
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
метр - номер лампы (0), а второй - указатель на |
|
|
PT_POINTLIST - |
список |
точек). |
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
d3dLight.dcvDiffuse.r = 1.0f; |
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
лампу (&d3dLight). А затем его надо заставить |
|
|
Следующий, второй, параметр - |
||||||||||||||||||||||||
|
|
|
|
|
|
|
d3dLight.dcvDiffuse.g = 1.0f; |
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
светить. Метод LightEnable это сделает. Первый |
|
|
тип данных, в которых указы- |
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|
d3dLight.dcvDiffuse.b = 1.0f; |
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
параметр - номер лампы (0), второй - bool (true |
d3dLight.dcvAmbient.r = 1.0f; |
|
|
ваются |
вершины |
примитивов |
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
- разрешить светить, false - противоположное). |
d3dLight.dcvAmbient.g = 1.0f; |
|
|
(D3DFVF_VERTEX - поступают в |
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
А теперь торжественно скатывай все с листин- |
d3dLight.dcvAmbient.b = 1.0f; |
|
|
типе D3DVERTEX). Третий пара- |
|
||||||||||||||||||||||
ãà¹7. |
|
|
|
|
d3dLight.dcvSpecular.r = 1.0f; |
|
|
метр - данные наших вершин в |
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
d3dLight.dcvSpecular.g = 1.0f; |
|
|
том типе, в котором мы указали |
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
d3dLight.dcvSpecular.b = 1.0f; |
|
|
|
|
|
|||||||||||||||||
Н-да-а... Сделаем |
|
последний рывок и закончим |
|
|
выше (в нашем случае это пере- |
|||||||||||||||||||||||||||||
|
d3dLight.dvPosition.x = 0.0f; |
|
|
|||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
инициализацию. |
Теперь надо проинициализи- |
|
|
менная |
vtx). Далее, четвертый |
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
d3dLight.dvPosition.y = 0.0f; |
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
ровать матрицы, |
они служат для трансформа- |
|
|
параметр - количество вершин в |
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
d3dLight.dvPosition.z = -4.0f; |
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
öèé. ×òî ýòî çà |
матрицы и какие преобразова- |
d3dLight.dvAttenuation0 = 1.0f; |
|
|
òîé |
переменной, |
которую |
ìû |
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
ния они делают |
- смотри в имаги. |
|
|
|
указали (6). Последний пара- |
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
//Да пусть светит далеко-далеко |
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
d3dLight.dvRange = D3DLIGHT_RANGE_MAX; |
|
|
метр - ждать ли рендеринг или |
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
//Регистрируем нашу лампу |
|
|
плевать на все (в нашем случае |
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
hr = lpD3DD->SetLight(0, &d3dLight); |
|
|
я бы даже посоветовал всегда |
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
if(FAILED(hr)) return hr; |
|
|
так делать: D3DDP_WAIT). Пора |
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
//Разрешаем ей светить |
|
|
è |
|
закончить |
|
|
рендеринг. |
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
hr = lpD3DD->LightEnable(0, TRUE); |
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
Сначала надо |
создать |
мировую матрицу (Гхм...) |
|
|
EndScene. Íó è |
åñëè |
òû ïîì- |
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
if(FAILED(hr)) return hr; |
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
без всяких трансформаций. Описывает матрицу |
|
|
нишь про двойную буфериза- |
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
структура D3DMATRIX. Чтобы применить ее, |
тий - тип, что будем затирать (D3DCLEAR_TAR- |
цию, выведем все это на экран. Разрешенный |
|||||||||||||||||||||||||
|
|
|
|
|
|
|
воспользуйся методом SetTransform. Первый |
GET - затрем экран). Четвертый - цвет в хексе |
метод Flip интерфейса IDirectDrawSurface7 нам в |
|||||||||||||||||||||||||
параметр говорит о том, что мы будем тран- |
(0x00000000 - черный). Пятый и шестой нам не |
этом деле поможет. Первый параметр - указа- |
||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
сформировать (D3DTRANSFORMSTA-TE_WORLD |
нужны, они относятся к z и stencil буферам (0, |
тель на серфайсу, куда будем переносить изоб- |
|||||||||||||||||||||||||
|
|
|
|
|
|
|
- трансформирует мир, D3DTRAN-SFORM- |
0). Далее идет уже непосредственно рендеринг. |
ражение (ставь NULL для того, чтобы перенести |
|||||||||||||||||||||||||
|
|
|
|
|
|
|
STATE_VIEW - трансформирует вид, но там опре- |
Листинг ¹8 - Main.cpp, завершение инициализации |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
деленные параметры - довольно сложная вещь, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
D3DTRANSFORM-STATE_PROJECTION - òðàí- |
D3DMATRIX mat; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
mat._11 = mat._22 = mat._33 = mat._44 = 1.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
сформирует вид проекции - как это будет выгля- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
mat._12 = mat._13 = mat._14 = mat._41 = 0.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
деть на экране). Второй параметр - адрес мат- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
рицы. Все, что тебе потребуется сделать, напи- |
mat._21 = mat._23 = mat._24 = mat._42 = 0.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
mat._31 = mat._32 = mat._34 = mat._43 = 0.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
сано в листинге. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
lpD3DD->SetTransform(D3DTRANSFORMSTATE_WORLD, &mat); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
//Создаем матрицу вида |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D3DMATRIX matView = mat; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
matView._43 = 10.0f; //Будем отодвинуты по Z назад на 10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
lpD3DD->SetTransform(D3DTRANSFORMSTATE_VIEW, &matView); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
//Создаем матрицу проекции |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
D3DMATRIX matProj = mat; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Теперь |
будем |
рендерить. Для начала заставим |
matProj._11 = |
2.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
matProj._22 = |
2.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
ìèð |
крутиться. |
Просто измени мировую матри- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
matProj._34 = |
1.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
цу, как это написано в листинге. Перед ренде- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
matProj._43 = -1.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
рингом надо очистить экран методом Clear. |
matProj._44 = |
0.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
Первый параметр - количество прямоугольни- |
lpD3DD->SetTransform(D3DTRANSFORMSTATE_PROJECTION, &matProj); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
ков в массиве второго параметра (0). Второй - |
return S_OK; //Радостно завершаем инициализацию |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
Указатель на пресловутый массив (NULL). Тре- |
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
КОНСТРУКТОР |
|
|
|
|
>СПЕЦВЫПУСК #4 |
0067 |
103 |
|
|
|
|
|
|
|
|
Листинг ¹9 - Main.cpp, рендеринг |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
HRESULT Render() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
HRESULT hr; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
FLOAT fCos = (FLOAT)cos(((FLOAT)clock())/CLOCKS_PER_SEC * |
4); //Вычисляем косинус угла |
поворота. Где угол поворота равен времени работы |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
программы, деленного на |
количество кадров в секунду * . |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
FLOAT fSin = (FLOAT)sin(((FLOAT)clock())/CLOCKS_PER_SEC * 4); //Вычисляем синус от него же |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
D3DMATRIX matSpin; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
//Заполняем матрицу, соответствующую матрице поворота вокруг оси Y |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
matSpin._11 = fCos; |
matSpin._12 = 0.0f; |
|
matSpin._13 =-fSin; |
matSpin._14 = 0.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
matSpin._21 = 0.0f; |
matSpin._22 = 1.0f; |
matSpin._23 = 0.0f; |
matSpin._24 = 0.0f; |
|
|
Пытка ¹6 - а что это будет, если |
|
ìû |
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
matSpin._31 = fSin; |
matSpin._32 = 0.0f; |
matSpin._33 = fCos; |
matSpin._34 = 0.0f; |
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
обрежем ту странную веревку |
|
ïîä |
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
matSpin._41 = 0.0f; |
matSpin._42 = 0.0f; |
matSpin._43 = 0.0f; |
matSpin._44 = 1.0f; |
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
потолком (см пытку ¹1) |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
//Делаем ее в качестве мировой матрицы (все-таки это звучит неплохо) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
lpD3DD->SetTransform(D3DTRANSFORMSTATE_WORLD, &matSpin); |
|
|
Ты думаешь, я, ламер паршивый, не мог |
|
ñäå- |
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
lpD3DD->Clear(0, NULL, D3DCLEAR_TARGET, 0x00000000, 0L, 0L); //Очищаем экран |
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
лать нормального выхода через ескейп или |
||||||||||||||||||||||||||||||
|
|
|
|
|
|
hr = lpD3DD->BeginScene(); //Начинаем рисовать :) |
|
|
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
еще какую-нибудь шнягу. Я вот что |
скажу, |
|
ýòî |
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
if(FAILED(hr)) return hr; |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
lpD3DD->DrawPrimitive(D3DPT_TRIANGLELIST, //Рисуем |
полигоны |
|
|
ты сделаешь сам - маленькое домашнее зада- |
|
|
||||||||||||||||||||||||
|
|
|
|
|
D3DFVF_VERTEX, //Храня их вершины в переменной типа D3DVERTEX |
|
|
ние, а то я за тебя и так основную массу фека- |
|
|
||||||||||||||||||||||||||
|
|
|
|
|
vtx, 6, D3DDP_WAIT); //Имя переменной vtx, кол-во вершин - 6, ждем, пока оно рисует |
|
|
лек схавал. А пока ты нажми F5. И любуйся зре- |
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
hr = lpD3DD->EndScene(); //Заканчиваем рисовать |
|
|
|
лищем. Вот. Нда... Ну, вроде и все... Будем на- |
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
if(FAILED(hr)) return hr; |
|
|
|
|
|
|
|
деяться, это так. Счастливо тебе, перец! & |
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
hr = lpM->Flip(NULL, DDFLIP_WAIT); //Выводим на экран |
|
|
|
Happy rendering 4u.!! |
||||||||||||||||||||||||||
|
|
|
|
|
|
if(FAILED(hr)) return hr; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
return S_OK; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
} |
|
|
|
|
|
|
|
|
|
|
Листинг ¹10 - Main.cpp, мессаги, окна и |
релиз |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
åãî |
íà |
следующую серфайсу в цепи (экран)). |
â HRESULT Release() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
Второй - |
флаги (DDFLIP_WAIT). Вот и весь рен- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
//Деинициализируем все |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
деринг. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return lpDD->Release(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
А теперь |
переходим к водным проце- |
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
LRESULT CALLBACK WndProc(HWND hWnd, |
UINT uMsg, WPARAM wParam, LPARAM lParam) |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
дурам... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
Пытка ¹5 - буду резать, буду шить - все равно |
return DefWindowProc(hWnd, uMsg, wParam, lParam); |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
òåáå íå æèòü |
|
|
|
|
|
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int |
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Удалим-с все DirectDraw, Direct3D и т.д. return |
WNDCLASS wndClass = { 0, WndProc, 0, 0, hInst, //WndProc - процедура обработки |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
lpDD->Release() (происки COM) в специально |
NULL, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
созданной для этого функции Release. Три- |
LoadCursor(hInst, IDC_ARROW), |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
виально, но теперь будем обрабатывать месса- |
(HBRUSH)GetStockObject(WHITE_BRUSH), NULL, _T(“Render Window”)}; |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
ги и создавать окна и начинать и завершать ра- |
// таким образом мы создали некий wndclass, описывающий |
наше приложение |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
боту нашей проги. Мессаги обрабатываются |
// Все про этот класс нам знать не надо. Поэтому я и не дал конкретного |
объяснения |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
RegisterClass(&wndClass); //Зарегистрируем наш класс |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
функцией WndProc. Но мы же люди ленивые, |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
пусть все обрабатывается по умолчанию фун- |
hWnd = CreateWindow(_T(“Render Window”), // Создадим окно |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
_T(“XAKEP3D”), |
// Заголовок окна |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
кцией DefWindowProc. Так туда и |
запишем: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, // Некие стили окна |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
return DefWindowProc(hWnd, uMsg, |
wParam, |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
lParam);. Âîò. |
И самое |
главное: |
функция |
CW_USEDEFAULT, 1280, 1024, 0L, 0L, hInst, 0L); //Цифры - размеры окна |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
ShowWindow(hWnd, SW_SHOWNORMAL); //Нарисуем нашу паршивость |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
WinMain. Именно с нее начинается выполнение |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
UpdateWindow(hWnd); //Обновим ее же |
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
проги. Создадим и зарегистрируем WNDCLASS, |
|
|
|
|
|||||||||||||||||||||||||||
|
|
|
|
|
if(FAILED(InitializeD3D())) return 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
как я это покажу в листинге. Таким же образом |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
MSG msg; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
создадим окно. После всего этого проверим на |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
int i = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
глючность |
инициализацию |
D3D. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
SetCursor(NULL); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
if(FAILED(InitializeD3D())) return 1;. Вот, а затем |
while(i < 500) //Если не было 500 кадров, то |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
пошли шпарить в цикле рендрить - получать |
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
мессаги - рендрить - получать мессаги - рен- |
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);//Берем мессагу |
||||||||||||||||||||||||||||||
|
|
|
|
|
дрить - получать мессаги... И так 500 раз. Да- |
if(FAILED(Render())) return 1;//Рисуем |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
да-да-да... Чуть не забыл (старческий склероз, |
i++; //Прибавляем 1 кадр |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
мать его), надо же курсор удалить, а то он ме- |
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
шает. SetCursor(NULL); перед циклом. После |
Release(); //Деинициализируем все |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
500-кратного прохода цикла зарелизим |
return 0; //Выходим |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
(Release) è return 0;. |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
0068 |
КОНСТРУКТОР |
>СПЕЦВЫПУСК #4 |
|||
КЛИКЕР - С |
||||||
MOOF (MOOF@xakep.ru ; http://MOOF.da.ru) |
|
|||||
|
й, перец, ты читал второй спецвы- |
познакомься с каким-нибудь западным лохом, |
нем есть строчка: “Font Face=Courier New”. За- |
|||
|
ïóñê Õ, íó òîò, ÷òî ïðî Èíåò? Íåò? |
любителем Старкрафта или Квейка. У буржуев |
ìåíè åå íà “Font Face=Courier New Cyr” è ïå- |
|||
|
Плохо дело... Прыжками дуй в |
есть такая дурацкая привычка - иметь выде- |
резапусти PerlBuilder. |
|||
ÝОлимпийский за спецом и не за- |
ленную линию и личный сервак в подвале. |
Пробовать наш кликер мы будем на популяр- |
||||
|
áóäü |
прикупить |
книженцию |
ïî |
Чуешь, в чем прикол? Ты подваливаешь к па- |
|
Перлу, она тебе пригодится. Ну что, сбегал? |
цану, узнаешь, какая у него любимая игруха, и |
ном рейтинге “Топ 69”. (http://fomenko.ru) |
||||
Прочитал? Вот так-то лучше. Теперь засунь его |
говоришь, что очень любишь эту гаму и как |
Скальпель, сестра... |
||||
куда-нибудь подальше и слухай меня. Все что |
здорово, что у этого пацана есть свой сервак. |
|||||
там написано про раскрутку это, конечно, кру- |
Неплохо было бы забацать пагу на нем... И все |
|
||||
то, но какой же ты хакер, если собираешься |
в том же духе. В итоге, кроме халявного шел- |
Что ж, приступим, друг мой :). Первая строка |
||||
играть по общим правилам? Хватит твоему хо- |
ла ты получишь халявный хостинг :). |
скрипта - это путь к перлу на шелле. Чаще все- |
||||
мяку плестись в самом конце, ведь он же у те- |
|
ãî ýòî: |
||||
бя крут как яйца! Сейчас мы с тобой напишем |
Еще тебе понадобится список анонимных |
|
||||
кликер, который поможет тебе прочно обос- |
проксей. Его найти не очень сложно, но жела- |
#!/usr/bin/perl. |
||||
новаться в первых местах любого топа :). |
|
тельно, чтобы они были рабочие :). |
|
|||
|
|
|
|
|
|
Ее и напишем. Потом к скрипту подключаем |
|
|
|
|
|
|
дополнительные модули: |
|
|
|
|
|
|
use HTTP::Request::Common; |
|
|
|
|
|
|
require LWP::UserAgent; |
|
|
|
|
|
|
Инициализируем генератор случайных чисел и |
|
|
|
|
|
|
уменьшим буфер до единицы: |
|
|
|
|
|
|
srand($$ & time ^ $$); |
|
|
|
|
|
|
$|=1; |
|
|
|
|
|
|
Теперь откроем файл, в котором хранится спи- |
|
|
|
|
|
|
сок твоих проксей: |
open(PROXY, “proxy.lst”); @proxies=<PROXY>; chomp(@proxies); close(PROXY);
|
|
|
|
|
|
|
Все адреса проксей должны храниться в тек- |
||||||||
|
|
|
|
|
|
|
стовом файле с именем “proxy.lst”. В следую- |
|
|||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
щем формате: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
адрес.сервера:порт |
|
|
|
|
|
|
|
|
Подготовка |
рабочего места |
|
|
|
|
адрес.сервера:порт |
|
|
|
|
|
|
|
|
|
Для написания самого скрипта рекомендую |
è ò.ä. |
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
использовать PerlBuilder. Это довольно удоб- |
|
|
|
|
|
|
|
|
||||
|
Писать кликер |
мы будем, естественно, на Perl. |
ная софтина, которая умеет выделять прог- |
|
|
|
|
|
|
|
|
|
|||
Перед началом |
работы тебе было бы неплохо |
рамму цветом, проверять синтаксис и многие |
Инициализируем переменную “$suc”, а в “$pr” |
|
|||||||||||
|
|||||||||||||||
|
найти халявный |
шелл, на котором можно будет |
другие вещи. Найти ее можно где-то на лис- |
записываем адрес прокси, случайно выбран- |
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
запускать фоновые процессы. Это самое слож- |
тсофте, (www.listsoft.ru), à êðàê ê íåé - íà àñòà- |
ного из всего списка. |
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
||||||||
|
ное, так как халявных шеллов и так мало, а тех, |
лависте |
(www.astalavista.box.sk). |
Чтобы |
|
|
|
|
|
|
|
|
|
||
|
которые дают такое богатство возможностей, |
PerlBuilder нормально понимал русский, в ка- |
$suc=1; |
|
|
|
|
|
|||||||
|
|
|
|
|
|||||||||||
|
вообще единицы. Но отсюда есть один выход: |
талоге windows найди файл “pbuilder.ini”. В |
$pr = splice(@proxies, int rand @proxies, 1); |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
КОНСТРУКТОР |
|
|
|
>СПЕЦВЫПУСК #4 |
0069 |
105 |
|
|
АМОПАЛ
|
|
|
|
|
|
Вот и весь текст скрипта. Не правда ли, все |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
Теперь самое интересное. Создадим виртуаль- |
этого после строки: |
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
ный браузер, который будет заходить по ссыл- |
просто? Самое сложное - это найти шелл :). |
#!/usr/bin/perl |
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
ке, тем самым кликая по баннеру. Наш скрипт |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
будет изображать собой IE5 и Windows98. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
$ua = new LWP::UserAgent; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
$ua->agent(“Mozilla/4.0 (compatible; MSIE 5.0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
Windows 98; DigExt)”); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
$ua->timeout(60); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
$ua->proxy(‘http’,”http://”.$pr); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
print “Try... $pr “; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
Браузер готов, теперь займемся заголовком, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
который браузер передаст серверу. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
$h1 = new HTTP::Headers |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
Accept => ‘application/vnd.ms-excel, applica- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
tion/msword, image/gif, image/x-xbitmap, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
image/jpeg, |
image/pjpeg, application/x-comet, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
*/*’, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
User_Agent => ‘Mozilla/4.0 (compatible; MSIE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
5.0; Windows 98; DigExt)’, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
Referer => ‘http://www.xakep.ru/default.asp’; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Замени “http://www.xakep.ru/default.asp” íà |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
адрес своей страницы, на которой висит кноп- |
Установка |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
ка топа. Настало время делать запрос: |
|
|
добавь: |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
print “Content-type: text/html\n\n”; |
|
|
|
|
|
|
||||
|
|
|
$req1 = new HTTP::Request (‘GET’, |
Åñëè òåáå |
повезло и ты достал где-то |
øåëë, |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
‘http://fomenko.ru/cgi- |
на котором |
есть перл, и можно запускать |
ôî- |
И в html файл своей странички добавь |
|
ssi |
êî- |
|
|
|||||||
|
|
|
bin/top/lspro.cgi?click=номер’, $h1); |
новые |
процессы, считай, что ты #1 |
(Намба |
манду вызова скрипта: |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
Ван, то есть :)). Как определить, есть |
ëè íà |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$response=$ua->request($req1); |
твоем шелле возможность запустить |
кликер |
<!—#include virtual=”/cgi-bin/clicker.pl”—> |
|
|
|
||||||||||
|
|
|
$suc=$response->is_success; |
или нет? Кликер запускается с помощью |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
программки “cron”. Это своеобразный аналог |
Предварительно скопировав “clicker.pl” в |
êà- |
|
|
|||||||||
|
|
|
Делаем запрос к серверу и получаем от него |
Планировщика из виндов. Ты ему даешь прог- |
талог “cgi-bin” и установив права доступа |
ê |
|
|
|||||||||||
|
|
|
|
|
|||||||||||||||
|
|
|
ответ. Слово “номер” замени на свой номер, |
рамму, которую надо запускать, и устанавли- |
файлу командой “chmod 755”. |
|
|
|
|||||||||||
|
|
|
который тебе выдали при регистрации. |
ваешь время. Для создания задания тебе |
Заключение |
|
|
|
|||||||||||
|
|
|
|
|
|
необходимо будет создать файл в формате |
|
|
|
||||||||||
|
|
|
Теперь надо обработать результат, и если все |
“crontab”. |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
прошло нормально, запишем его в файл |
|
|
|
Не советую тебе слишком увлекаться накрут- |
|
|||||||||||
|
|
|
|
|
|
||||||||||||||
|
|
|
“click.log” |
Допустим, ты решишь, что твой скрипт дол- |
кой показов/кликов. Это, конечно, рульно, |
|
|||||||||||||
|
|
|
|
|
|
жен запускаться через каждые 20 минут, на- |
когда на твою хоумпагу ходят люди. Но когда |
|
|||||||||||
|
|
|
($suc) || print $response->code; |
чиная с полуночи. Для этого тебе надо напи- |
вместо людей на нее ходят твои же клики, это |
|
|||||||||||||
|
|
|
if ($suc) { |
ñàòü: |
совсем не кул. А представь себе, если все от- |
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
open(FH,”>>click.log”); |
|
|
|
стойные сайты начнут накручивать себе пока- |
||||||||||||
|
|
|
print FH $pr.”\n”; |
0, 20, 40, * * * * clicker.pl |
зы. Это будет гонка кликеров. А хорошие и |
|
|
||||||||||||
|
|
|
close FH; |
Где “clicker.pl” - имя твоего кликера. |
нужные сайты останутся а глубоком анусе. :( |
||||||||||||||
|
|
|
}; |
|
|
|
|
|
Так что, приятель, пиши кликер только если у |
||||||||||
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
($suc) && print “+”; |
Если ты так и не нашел шелл, то можешь поп- |
тебя как раз такой сайт, а раскручивать от- |
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
И завершим работу скрипта |
робовать вызывать скрипт каждый раз, когда |
стой лучше не надо - его и так слишком мно- |
|
|
||||||||||||
|
|
|
|||||||||||||||||
|
|
|
на твою страничку заходит посетитель. Но |
ãî. |
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
для этого твой хостинг должен поддерживать |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
exit; |
perl и ssi. Изменим чуть-чуть наш скрипт. Для |
Удачи! |
|
|
|
|
|
|
|
|
|
|
||||
|
|||||||||||||||||||
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
106 |
006A |
ТЕОРИЯ |
|
|
>СПЕЦВЫПУСК #4 |
|
СОВЕРШЕНН КОДЕРА
Ruben aka Noah (noah@inbox.ru, UIN 983332)
|
|
ТЕОРИЯ |
|
|
|
>СПЕЦВЫПУСК #4 |
006B |
107 |
|
|
ОЕ ОРУЖИЕ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
КАКОЕ ОТНОШЕНИЕ ИМЕЮТ АЛГО- |
9. Потихоньку жмем на педаль акселератора и |
чтобы избавиться от этих проблем и облегчить |
|
|||||||
|
|
||||||||||
|
РИТМЫ К ДАВИЛКАМ БАБУЛЕК? |
одновременно отпускаем сцепление. |
процесс разработки алгоритмов, крутые лбы из |
|
|||||||
|
|
|
|
|
|
|
|
не менее крутых универов придумали две со- |
|
||
|
|
|
|
Самое что ни на есть прямое. И вообще, многие |
Вот все действия, которые нам нужны. Но опре- |
вершенно необходимые каждому прогеру вещи: |
|
||||
|
|
|
|
наши повседневные действия связаны с алго- |
деление состояло из двух частей, там еще гово- |
псевдокод и технология нисходящей разработки |
|
||||
|
|
|
|
ритмами. Сейчас объясню поче- |
|
|
|
алгоритмов с пошаговой детали- |
|
||
|
му. Если тебе придет в голову |
Псевдокод - это своеоб- |
зацией. Начнем с первого - оно, |
|
|||||||
|
|
|
|
спросить меня, что это за хрень |
разный язык написания |
вроде, попроще звучит. |
|
||||
|
|
|
|
такая - алгоритм, я отвечу: алго- |
алгоритмов, который |
|
КОМПИЛИМ ГОЛОВОЙ |
|
|||
|
|
|
|
ритм решения задачи - это дей- |
|
|
|||||
|
|
|
|
ствия, которые должны выпол- |
состоит из привычных |
|
|
|
|||
|
|
|
|
няться для решения этой задачи, |
нам фраз и выражений. |
Псевдокод - |
это своеобразный |
|
|||
|
|
|
|
и последовательность, в которой |
язык написания алгоритмов, кото- |
|
|||||
|
|
|
|
эти действия должны выполнять- |
Íó, |
òèïà, èç òåõ, êîòî- |
рый состоит из привычных нам |
|
|||
|
|
|
|
ñÿ. |
Погоди, не швыряй журнал!!! |
рые ты ежедневно и |
|
фраз и выражений. Ну, типа, из |
|
||
|
|
|
|
|
|||||||
|
|
|
|
Давай лучше попробуем разоб- |
повсеместно юзаешь во |
тех, которые ты ежедневно и пов- |
|
||||
|
|
|
|
раться с этим делом. |
семестно юзаешь во время обще- |
|
|||||
|
|
|
|
Ты тачку водить умеешь? Да!? Я и |
время общения с другими |
ния с другими человеками :). Нет, |
|
||||
|
|
|
|
человеками :) |
|
постой, я не имел в виду твои реп- |
|
||||
|
|
|
|
не сомневался :). А если не |
|
|
|
лики типа: “Эй, киска, ты уже че- |
|
||
|
|
|
|
умеешь, читай дальше - любимый |
|
|
|
го-нибудь на сегодняшний вечер |
|
||
|
|
|
|
Х тебя всему научит. Короче, представь себе, |
рилось “... последовательность, в которой эти |
запланировала? Отменяй на фиг - мне кажется, |
|
||||
|
|
|
|
что внизу, у твоего подъезда, прямо сейчас |
действия должны выполняться...”. Приятель, мы |
сегодня вечером у тебя есть шанс сходить на |
|
||||
|
|
|
|
стоит новенькая “девятка” :). Задача такая - за- |
с тобой просто отличные водилы, поэтому когда |
фильму с лучшим парнем в твоей жизни” или |
|
||||
|
|
|
|
вести тачку и тронуться с места. Так, раз это за- |
мы вспоминали нужные действия, интуитивно |
“Приятель, базара нет, если я тебе обещал ха- |
|
||||
|
|
|
|
дача - значит, должен существовать алгоритм ее |
расставили их в правильной последовательнос- |
лявный инет, значит ты сегодня же его полу- |
|
||||
|
|
|
|
решения, согласен со мной? Теперь давай вер- |
ти. А теперь представь себе, что я позову како- |
чишь” или вообще “<пиб>, мля, <пиб> твою на |
|
||||
|
|
|
|
немся к нашему определению - там, кажется, |
го-нибудь баклана, совсем не умеющего водить |
<ïèá> â <ïèá>, <ïèá>, <ïèá>, <ïèá> !!!!”. ß |
|
||||
|
|
|
|
говорилось “...действия, которые должны вы- |
тачку, и суну ему наш список действий, переме- |
имел в виду... хотя постой, давай ознакомимся |
|
||||
|
|
|
|
полняться для решения этой задачи...”. А какие |
шав все пункты в нем случайным образом. Вот |
с простейшими управляющими структурами, и |
|
||||
|
|
|
|
будут действия для нашей задачки? Давай, сам |
кора будет :) Хе-хе, например если снять с руч- |
ты сразу поймешь, что я имел в виду. Но, преж- |
|
||||
|
|
|
|
вспоминай, что мы делаем каждый раз, когда |
ника в самом конце :), или если поменять мес- |
де чем мы перейдем к управляющим структу- |
|
||||
|
|
|
|
заводим тачку и трогаемся. |
|
тами третье и пятое действия... - вообще чепу- |
рам, замечу кое-что важное: псевдокод - это не- |
|
|||
|
|
|
|
1. Снимаем с ручника. |
|
ха получится какая-то. |
формальный язык программирования, и един- |
|
|||
|
|
|
|
|
|
ственным существующим компилятором псев- |
|
||||
|
|
|
|
|
|
|
Ладно, с места мы тронулись, теперь едем |
докода на сегодняшний день является, то серое |
|
||
|
|
|
|
2. Вставляем ключ зажигания. |
|
дальше. Немного пораскинув мозгами, ты пой- |
и хлюпкое, что находится у тебя в голове :). А |
|
|||
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
мешь, что задачи могут быть большими и слож- |
назначением псевдокода является - помочь при- |
|
||
|
|
|
|
3. Жмем и удерживаем педаль сцепления. |
ными. Соответственно, алгоритмы их решения |
вести алгоритм (твои мысли) к такому виду, |
|
||||
|
|
|
|
|
|
|
тоже будут немалыми и нелегкими :). Предыду- |
чтоб его (их, мысли) можно было без проблем |
|
||
|
|
|
|
4. Переводим передачу на нейтралку. |
щая задача была легкой, поэтому мы с тобой ее |
закодить на том или ином языке программиро- |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
целиком прокрутили в голове в течении минуты. |
вания (си, паскаль етц.). |
|
|
|
|
|
|
|
5. Отпускаем сцепление. |
|
А что делать с большими-то задачами (и с боль- |
Структуры управления |
|
|
||
|
|
|
|
|
|
|
шими алгоритмами)? А прикинь: если задача |
|
|
||
|
|
|
|
6. Поворачиваем ключ. |
|
ДЕЙСТВИТЕЛЬНО огроменная? За один присест |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
ее и не переваришь. Кроме того: то, что ты на- |
Для того, чтобы разрабатывать хорошие струк- |
|||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
7. Опять жмем и удерживаем сцепление. |
варил за первый присест, надо зафиксировать |
турированные алгоритмы, |
тебе достаточно |
|
|||
|
|
|
|
|
|
|
на каком-то постоянном носителе информации |
знать всего три структуры управления: структу- |
|||
|
|
|
|
8. Переходим на первую скорость. |
|
(коим наша башка не является), а то ведь забу- |
ра следования, структура выбора и структура |
||||
|
|
|
|
|
|
|
дешь, и придется все заново делать :(. Для того, |
повторения. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
108 |
006C |
ТЕОРИЯ |
|
|
>СПЕЦВЫПУСК #4 |
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Структура следования - самая простая для по- |
кодиться на каком-то там языке, этот список |
друзьями или тесно |
общался со своей |
дамой). |
|
||||||||||||||
|
|||||||||||||||||||||||||
|
|
|
|
|
|
нимания, и не требует никаких умственных нап- |
можно будет использовать как список необходи- |
Заметь, что одновременно пить пиво с друзьями |
|
||||||||||||||||
|
|
|
|
|
|
рягов. Например наш “автомобильный” алго- |
мых переменных. Выглядит такая последова- |
и делать ЭТО с подругой ты не мог - все таки пи- |
|
||||||||||||||||
|
|||||||||||||||||||||||||
|
|
|
|
|
|
ритм - типичная структура следования - одно |
тельность очень просто: |
во пили, не водку... Так вот, структура выбора на |
|
|
|
||||||||||||||
действие следует за другим. Давай пересилим |
установить первое число в |
íóëü. |
псевдокоде имеет несколько реализаций. |
|
Òåáå |
|
|
||||||||||||||||||
|
|||||||||||||||||||||||||
|
|
|
|
|
|
природную хацкерскую лень (этакая ленивость |
|
|
|
|
|
|
|
|
|
|
|
||||||||
достаточно трех. Сначала |
ознакомимся с |
самой |
|
||||||||||||||||||||||
|
|
|
|
|
|
льва в сафари :)), и посмотрим еще один при- |
установить второе число в |
íóëü. |
простой: |
|
|
|
|
|
|
|
|
|
|
||||||
мер на следование. Задача: ввести два числа, |
установить результат в нуль. |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
сложить их и вывести результат. Алгоритм этой |
|
|
ЕСЛИ (условие) |
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
наиэлементрарнейшей |
задачи на псевдокоде |
Далее по курсу, структура выбора. И тут все |
действие. |
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
будет выглядеть так: |
|
|
|
просто, как у попугая в брачный сезон. Пред- |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
Объясняю, если условие верно, действие |
âû- |
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
ставь себе, чувак, что идешь ты по улице, и |
|
|||||||||||
ввести первое число. |
вдруг из-за твоей спины выскальзывает шикар- |
полняется, если нет - действие пропускается. |
|
||||||||||||||||||||||
ввести второе число. |
нейшая подружка, виляет попкой, и, быстро те- |
Теперь немного более усовершенствованный |
|
||||||||||||||||||||||
|
|
|
|
|
|
результат равен первое число прибавить |
бя обогнав, ныряет в переход, а рядом с этим |
вариант: |
|
|
|
|
|
|
|
|
|
|
|||||||
второе число. |
|
|
|
Представь себе, чувак, что |
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
вывести результат. |
|
ЕСЛИ (условие) |
|
|
|
||||||||||||||
идешь ты по улице, и вдруг |
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ïåð- |
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
Вот видишь, как я и |
из-за твоей спины выскальзы- |
|
вое действие. |
|
|
|
|
|
|
|
|||||||||
обещал: алгоритм |
|
íà |
|
ИНАЧЕ |
|
|
|
|
|
|
|
||||||||||||||
|
вает невероятная герла, ви- |
|
|
|
|
|
|
|
|
||||||||||||||||
псевдокоде состоит |
|
èç |
|
|
âòî - |
|
|
|
|||||||||||||||||
обычных |
ôðàç. |
|
Åãî |
ляет попкой и, быстро тебя |
|
рое действие. |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
очень легко читать и |
ïî- |
обогнав, ныряет в переход, а |
|
Если условие верно, |
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
нимать, а главное - |
åãî |
|
|
|
|
||||||||||||||
так же легко осущес- |
рядом с этим переходом ларек, |
|
выполняется первое |
|
|
||||||||||||||||||||
|
|
|
|
|
|
твить |
практически |
íà |
где ты обычно пивком затари- |
|
действие (второе про- |
|
|
|
|||||||||||
|
|
|
|
|
|
любом |
языке |
програм- |
|
|
|
||||||||||||||
|
|
|
|
|
|
ваешься. Пивка-то хочется, без |
|
пускается), а если оно |
|||||||||||||||||
|
|
|
|
|
|
мирования. Для этого |
|
не верно, то выпол- |
|
|
|
||||||||||||||
|
|
|
|||||||||||||||||||||||
достаточно просто |
çà- |
него никак, но дама просто |
|
няется второе действие |
|
|
|||||||||||||||||||
|
|
|
|
|
|
менить |
|
выражения |
суперская - грех такую упус- |
|
(первое |
пропускается). |
|
||||||||||||
псевдокода на соответ- |
тить. Что делать? Вот если бы |
|
Давай |
скомбинируем |
|
|
|
||||||||||||||||||
|
|
|
|
|
|
ствующие |
функции и |
|
эти две штуки, и соста- |
||||||||||||||||
операторы |
|
любимого |
ты был алгоритмом, состоящим |
|
вим алгоритм, который |
|
|
|
|||||||||||||||||
|
|
|
|
|
|
языка. Короче говоря: |
только из структур следова- |
|
поможет тебе не завис- |
|
|
|
|||||||||||||
|
|
|
|
|
|
если ты напишешь алго- |
ния, на этом месте ты бы за- |
|
нуть в ситуации, опи- |
||||||||||||||||
ритм своей |
проги |
íà |
|
санной (я знаю о чем ты |
|||||||||||||||||||||
псевдокоде |
- считай, |
вис. И висел бы ты, как винды, |
|
подумал, пошлый - не |
|
|
|
||||||||||||||||||
|
|
|
|
|
|
что ты сделал девяносто |
до тех пор, пока кто-нибудь |
|
опЫсанной, а описан- |
|
|
|
|||||||||||||
процентов |
работы (ко- |
|
ной - туалет в конце ко- |
|
|
|
|||||||||||||||||||
нечно при условии, что |
из доблестных блюстителей |
|
ридора, левая дверь :)) |
|
|||||||||||||||||||||
|
|
|
|
|
|
ты хоть немного знаешь |
порядка не подошел бы, и не |
|
âûøå: |
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
какой-нибудь |
ÿçûê |
перезагрузил тебя своим |
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
программирования). |
|
ЕСЛИ (первое |
|
|
|
||||||||||||||
|
|
|
|
|
|
“Что за нафиг?” - ска- |
демократизатором. |
|
|
условие) |
ïåð- |
|
|
|
|||||||||||
|
|
|
|
|
|
жешь ты - “Я лучше сра- |
|
переходом ларек, где ты обычно пивком затари- |
вое действие. |
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
зу напишу на своем любимом языке, и никакой |
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
псевдокод мне не нужен”. Потерпи, скоро ты |
ваешься. Пивка-то хочется, без него никак, но |
ИНАЧЕ ЕСЛИ (второе условие) |
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
сам поймешь, чем так хорош псевдокод - прос- |
герла просто суперская - грех такую упустить. |
второе действие |
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
то дочитай до того места, где говорится о нис- |
Что делать? Вот если бы ты был алгоритмом, |
ИНАЧЕ |
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
ходящей разработке алгоритмов. |
состоящим только из структур следования, на |
третье действие. |
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
этом месте ты бы завис. И висел бы ты как вин- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Но вернемся к задаче с числами. Как ты успел |
ды, до тех пор, пока кто-нибудь из доблестных |
Сие означает, что если верно первое условие - |
|
|
|
||||||||||||||
|
|
|
|
|
|
верно приметить, алгоритм решения задачи |
блюстителей порядка не подошел бы и не пере- |
выполнить первое действие (второе и третье |
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
состоит из четырех действий, которые следуют |
загрузил тебя своим демократизатором. А вот |
пропускаются), если верно второе условие - вы- |
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
одно за другим (структура следования!!!). И еще |
если ты оборудован структурой выбора, тогда |
полнить второе действие (первое и третье про- |
|||||||||||||||||
|
|
|
|
|
|
одно: некоторые прогеры предпочитают выпи- |
все ок. Ты можешь выбирать то, что тебе нужнее |
пускаются), а если не одно из условий не верно |
|||||||||||||||||
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
сывать все существительные из псевдокода в |
(пиво или подружка) в зависимости от того, чем |
- выполнить третье действие (первое и второе |
|||||||||||||||||
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
отдельный список. Потом, когда алгоритм будет |
ты занимался четверть часа назад (пил пиво с |
пропускаются). Понятно, что этих “ИНАЧЕ ЕС- |
|||||||||||||||||
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|