Jul 31

«Рокировка» блоков экрана. Часть 1

В данном посте, мы попробуем метод описать, с помощью которого можно будет экран разделить сначало на блоки, а потом уже поменять данные блоки местами. Еще можно размеры самих блоков менять, а также скорость перемещения последних. К тому же это будет неплохое начало для творения интересной логической игрушки или же какой-то экранной заставки…

Полностью мы уверены - из Вас каждый хоть раз видел подобное что-то в уже действии! Именно при пуске, программа изображение самого десктопа берёт его и разделяет на необходимое к-тво прямоугольных частей одинаковых по своему размеру. После данной процедуры, часть блоков автоматически перемещается с собственного места.

На автосайте autotuni.ru, представлена схема автоматической коробки передач - посмотрите. интересно!

Как же все это на практике осуществить?

Для этого давайте создадим новый проект Дельфи с полностью чистой формой.
Продолжая, установим свойство Name именно в позицию 'Shuffler'.
После чего добавим на нашу форму компонент Image (а именно, Image1) и также компонент Timer (Timer1).
Image у нас в данном случае содержать будет в себе самого десктопа изображение (оно буде разобранное), а Timer вызывать будет процедуру рисования.
Само свойство Interval, нужного нам компонента под названием Timer, определяет с какой частотой, происходить будет перемешивание (число 1000 = одной секунде, 2000 = 2 секундам).

Еще для нашего проекта необходима парочка глобальных переменных. Приведенный ниже код перед секцией implementation в самом модуле формы:

var

Shuffler: TShuffler; //здесь добавлено было самой Дельфи

DesktopBitmap : TBitmap;

gx, gy : Integer;

redRect : TBitmap;

rW, rH : Integer;

const

DELTA = 8; //здесь быть должно 2^n

Значение самой константы (integer) DELTA то определяет, на сколько именно частей разбит будет экран (имеются ввиду строки и колонки). Число же DELTA, обьязательно быть должно в виде 2^n, где именно n - целое (integer) представляется числом со знаком.
Большое же значение DELTA к небольшим размерам блоков приводит.
К примеру, в том случае, когда DELTA = 16 и разрешение самого экрана 1024 x 768, то будет экран разделён на 256 частей, каждая размером 64x48.

- DesktopBitmap представляет собой битмап, хранящий в себе текущее захваченное изображение самого десктопа - мы здесь получать будем данное изображение, когда будем делать скриншот.

- redRect представляет собой битмап картинка, заменяющая перемещённую картинки часть. redRect в событии формы создаётся под названием OnCreate.

- gx, gy текущие координаты содержат x и y (Left, Top) redRect именно внутри самого разобранного изображения.

- rW, rH представляют собой ширину и высоту блока прямоугольного. Для 1024x768 и DELTA=16, rW равно будет 64 а rH = 48.

Проект наш выполняться начинает с обработчика события под названием OnCreate:
procedure TShuffler.FormCreate(Sender: TObject);

begin

rW := Screen.Width div DELTA;

rH := Screen.Height div DELTA;

redRect:=TBitmap.Create;

with redRect do begin

Width := rW;

Height := rH;

Canvas.Brush.Color := clRed;

Canvas.Brush.Style := bssolid;

Canvas.Rectangle(0,0,rW,rH);

Canvas.Font.Color := clNavy;

Canvas.Font.Style := Canvas.Font.Style + [fsBold];

Canvas.TextOut(2,2,'About');

Canvas.Font.Style := Canvas.Font.Style - [fsBold];

Canvas.TextOut(2,17,'Delphi');

Canvas.TextOut(2,32,'Programming');

end;

Timer1.Enabled := False;

Image1.Align := alClient;

Visible := False;

BorderStyle := bsNone;

Top := 0;

Left := 0;

Width := Screen.Width;

Height := Screen.Height;

InitScreen;

// SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,

SWP_NOSIZE + SWP_NOMOVE);

Visible := True;

Timer1.Interval := 10; // здесь именно меньше := быстрее

Timer1.Enabled := True; // здесь запускаем вызов самого DrawScreen

end;

Продолжение в теме - «Рокировка» блоков экрана. Часть 2


Поделитесь вашими мыслями



Ссылки в комментариях будут свободны от nofollow.

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Ссылки в комментариях будут свободны от nofollow.