Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги хакеры / журнал хакер / специальные выпуски / Специальный выпуск 4_compressed

.pdf
Скачиваний:
16
Добавлен:
20.04.2024
Размер:
7.13 Mб
Скачать

 

 

КОНСТРУКТОР

 

 

 

>СПЕЦВЫПУСК #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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Структура следования - самая простая для по-

кодиться на каком-то там языке, этот список

друзьями или тесно

общался со своей

дамой).

 

 

 

 

 

 

 

 

нимания, и не требует никаких умственных нап-

можно будет использовать как список необходи-

Заметь, что одновременно пить пиво с друзьями

 

 

 

 

 

 

 

рягов. Например наш “автомобильный” алго-

мых переменных. Выглядит такая последова-

и делать ЭТО с подругой ты не мог - все таки пи-

 

 

 

 

 

 

 

 

ритм - типичная структура следования - одно

тельность очень просто:

во пили, не водку... Так вот, структура выбора на

 

 

 

действие следует за другим. Давай пересилим

установить первое число в

íóëü.

псевдокоде имеет несколько реализаций.

 

Òåáå

 

 

 

 

 

 

 

 

 

природную хацкерскую лень (этакая ленивость

 

 

 

 

 

 

 

 

 

 

 

достаточно трех. Сначала

ознакомимся с

самой

 

 

 

 

 

 

 

льва в сафари :)), и посмотрим еще один при-

установить второе число в

íóëü.

простой:

 

 

 

 

 

 

 

 

 

 

мер на следование. Задача: ввести два числа,

установить результат в нуль.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

сложить их и вывести результат. Алгоритм этой

 

 

ЕСЛИ (условие)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

наиэлементрарнейшей

задачи на псевдокоде

Далее по курсу, структура выбора. И тут все

действие.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

будет выглядеть так:

 

 

 

просто, как у попугая в брачный сезон. Пред-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Объясняю, если условие верно, действие

âû-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ставь себе, чувак, что идешь ты по улице, и

 

ввести первое число.

вдруг из-за твоей спины выскальзывает шикар-

полняется, если нет - действие пропускается.

 

ввести второе число.

нейшая подружка, виляет попкой, и, быстро те-

Теперь немного более усовершенствованный

 

 

 

 

 

 

 

результат равен первое число прибавить

бя обогнав, ныряет в переход, а рядом с этим

вариант:

 

 

 

 

 

 

 

 

 

 

второе число.

 

 

 

Представь себе, чувак, что

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

вывести результат.

 

ЕСЛИ (условие)

 

 

 

идешь ты по улице, и вдруг

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ïåð-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вот видишь, как я и

из-за твоей спины выскальзы-

 

вое действие.

 

 

 

 

 

 

 

обещал: алгоритм

 

íà

 

ИНАЧЕ

 

 

 

 

 

 

 

 

вает невероятная герла, ви-

 

 

 

 

 

 

 

 

псевдокоде состоит

 

èç

 

 

âòî -

 

 

 

обычных

ôðàç.

 

Åãî

ляет попкой и, быстро тебя

 

рое действие.

 

 

 

 

 

 

 

 

 

 

 

 

 

очень легко читать и

ïî-

обогнав, ныряет в переход, а

 

Если условие верно,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

нимать, а главное -

åãî

 

 

 

 

так же легко осущес-

рядом с этим переходом ларек,

 

выполняется первое

 

 

 

 

 

 

 

 

твить

практически

íà

где ты обычно пивком затари-

 

действие (второе про-

 

 

 

 

 

 

 

 

 

любом

языке

програм-

 

 

 

 

 

 

 

 

 

ваешься. Пивка-то хочется, без

 

пускается), а если оно

 

 

 

 

 

 

мирования. Для этого

 

не верно, то выпол-

 

 

 

 

 

 

достаточно просто

çà-

него никак, но дама просто

 

няется второе действие

 

 

 

 

 

 

 

 

менить

 

выражения

суперская - грех такую упус-

 

(первое

пропускается).

 

псевдокода на соответ-

тить. Что делать? Вот если бы

 

Давай

скомбинируем

 

 

 

 

 

 

 

 

 

ствующие

функции и

 

эти две штуки, и соста-

операторы

 

любимого

ты был алгоритмом, состоящим

 

вим алгоритм, который

 

 

 

 

 

 

 

 

 

языка. Короче говоря:

только из структур следова-

 

поможет тебе не завис-

 

 

 

 

 

 

 

 

 

если ты напишешь алго-

ния, на этом месте ты бы за-

 

нуть в ситуации, опи-

ритм своей

проги

íà

 

санной (я знаю о чем ты

псевдокоде

- считай,

вис. И висел бы ты, как винды,

 

подумал, пошлый - не

 

 

 

 

 

 

 

 

 

что ты сделал девяносто

до тех пор, пока кто-нибудь

 

опЫсанной, а описан-

 

 

 

процентов

работы (ко-

 

ной - туалет в конце ко-

 

 

 

нечно при условии, что

из доблестных блюстителей

 

ридора, левая дверь :))

 

 

 

 

 

 

 

ты хоть немного знаешь

порядка не подошел бы, и не

 

âûøå:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

какой-нибудь

ÿçûê

перезагрузил тебя своим

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

программирования).

 

ЕСЛИ (первое

 

 

 

 

 

 

 

 

 

“Что за нафиг?” - ска-

демократизатором.

 

 

условие)

ïåð-

 

 

 

 

 

 

 

 

 

жешь ты - “Я лучше сра-

 

переходом ларек, где ты обычно пивком затари-

вое действие.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

зу напишу на своем любимом языке, и никакой

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

псевдокод мне не нужен”. Потерпи, скоро ты

ваешься. Пивка-то хочется, без него никак, но

ИНАЧЕ ЕСЛИ (второе условие)

 

 

 

 

 

 

 

 

 

 

 

 

 

сам поймешь, чем так хорош псевдокод - прос-

герла просто суперская - грех такую упустить.

второе действие

 

 

 

 

 

 

 

 

 

 

 

 

 

 

то дочитай до того места, где говорится о нис-

Что делать? Вот если бы ты был алгоритмом,

ИНАЧЕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ходящей разработке алгоритмов.

состоящим только из структур следования, на

третье действие.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

этом месте ты бы завис. И висел бы ты как вин-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Но вернемся к задаче с числами. Как ты успел

ды, до тех пор, пока кто-нибудь из доблестных

Сие означает, что если верно первое условие -

 

 

 

 

 

 

 

 

 

верно приметить, алгоритм решения задачи

блюстителей порядка не подошел бы и не пере-

выполнить первое действие (второе и третье

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

состоит из четырех действий, которые следуют

загрузил тебя своим демократизатором. А вот

пропускаются), если верно второе условие - вы-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

одно за другим (структура следования!!!). И еще

если ты оборудован структурой выбора, тогда

полнить второе действие (первое и третье про-

 

 

 

 

 

 

одно: некоторые прогеры предпочитают выпи-

все ок. Ты можешь выбирать то, что тебе нужнее

пускаются), а если не одно из условий не верно

 

 

 

 

 

 

 

 

 

 

 

 

сывать все существительные из псевдокода в

(пиво или подружка) в зависимости от того, чем

- выполнить третье действие (первое и второе

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

отдельный список. Потом, когда алгоритм будет

ты занимался четверть часа назад (пил пиво с

пропускаются). Понятно, что этих “ИНАЧЕ ЕС-