У компа есть две функции: в него можно играть, также в него можно не играть!
Что ж, продолжаем! На этом уроке вы узнаете много нового - как анимировать изображение, как пользоваться DXInput, сколько способов проверять столкновения и где какие лучше употреблять, как поворачивать картинки на разные углы… Перейдем от слов к делу. Первая тема - как анимировать изображения. Возьмем пример из 3-го урока и анимируем саму летающую тарелку. Раньше спрайт был такой -
Мы сделаем его таким:
Откройте Paint - все анимированные спрайты мы будем собирать именно в нем. Кроме этого, возьмем какой-нибудь редактор посерьезнее, умеющий работать с анимированными gif’ами. Я возьму уже известный вам с прошлых уроков Macromedia Fireworks. После чего делаем так - открываем первый кадр, копируем изображение в буфер, вставляем в новй рисунок в Painte’е. Кстати, размеры рисунка вычисляются так - высота не изменяется, а ширина - ширина анимрованного рисунка х количество кадров. В данном случае формат рисунка - 60х25, в файле 3 кадра. Размер рисунка в Paint’e будет 180х25. Как вы наверное догадались, мы будем создавать этакую киноленту. Спрайт анимированной тарелки в развертке для Delphi будет таким:
Read more »
Filed in Графика by admin | Декабрь 27, 2007 | No Comments
Хранитель экрана (ScreenSaver) в Windows – это программа, размещенная в каталоге Windows или Windows\System. Расширение эта программа должна иметь scr. При запуске ScreenSaver должен реагировать на параметры. Если первый параметр – “/p”, нужно создать окно предварительного просмотра. Если первый параметр – “/s”, нужно запустить сам ScreenSaver. В ином случае нужно показать окно настроек хранителя экрана.
Для предварительного просмотра Windows создает окно, на месте которого ScreenSaver должен что-то рисовать. Чтобы отслеживать сообщения о перерисовке окна Preview, а также о его перемещении и закрытии, нужно создать дочернее окно в том же месте и такого же размера. Для этого нужно использовать WinAPI. Цикл, в котором обрабатываются сообщения, удобно сделать через PeekMessage, поскольку в этом случае можно создать событие OnIdle. В нем нужно рисовать что-то в окне предварительного просмотра.
Read more »
Filed in Графика by admin | Декабрь 27, 2007 | No Comments
uses
Inifiles, ShellApi;
procedure TForm1.Button1Click(Sender: TObject);
var
Ini: TInifile;
ScreenSaverFile: string;
function GetLongFileName(const FileName: string): string;
var
aInfo: TSHFileInfo;
begin
if SHGetFileInfo(PChar(FileName), 0, aInfo, SizeOf(aInfo), SHGFI_DISPLAYNAME) <> 0 then
Result := string(aInfo.szDisplayName)
else
Result := FileName;
end;
begin
Ini := TInifile.Create(’system.ini’);
ScreenSaverFile := GetLongFileName(Ini.Readstring(’boot’, ‘SCRNSAVE.EXE’, ‘Not Available’));
Ini.Free;
label1.Caption := ScreenSaverFile;
end;
Filed in Графика by admin | Декабрь 27, 2007 | No Comments
interface
private
procedure AppMessage(var Msg: TMsg; var handled: Boolean);
end;
implementation
procedure TForm1.AppMessage(var Msg: TMsg; var handled: Boolean);
begin
if (Msg.Message = WM_SYSCOMMAND) and (Msg.wParam = SC_SCREENSAVE) then
Handled := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := AppMessage;
end;
{
Note: The Screensaver is only disabled during the lifespan of
your application.
Bemerkung: Der Screensaver bleibt nur solange deaktiviert,
wie ihre Applikation lдuft. $
}
Filed in Графика by admin | Декабрь 27, 2007 | No Comments
О, Гюльчатай, сними же свой скринсейвер!
Сначала мы проверяем, установлен ли Screen Saver, если нет - возвращаемся с отрицательным ответом, в противном случае - запускаем его и возвращаем true.
function RunScreenSaver: bool;
var
b: boolean;
begin
result := false;
if SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, @b, 0) <> true then
exit;
if not b then
exit;
PostMessage(GetDesktopWindow, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
result := true;
end;
Filed in Графика by admin | Декабрь 27, 2007 | No Comments
Время от времени я наблюдаю вопросы с просьбой рассказать о процессе создания с помощью Delphi хранителя экрана, которого можно было бы выбрать с помощью панели управления (Control Panel / Desktop). После того, как я увидел несколько общих ответов, частично отвечавших на заданный вопрос, я решил создать данный совет и полностью посвятить вас в технологию создания хранителя экрана Windows от начала до конца. Приведенный ниже код позволяет создать предмет нашего разговора, а именно - простой хранитель экрана Windows.
Read more »
Filed in Графика by admin | Декабрь 27, 2007 | No Comments
Пасьянс косынка - сильнодействующий психотропный препарат для нейролингвистического зомбирования разработанный в секретной лаборатории КГБ ¦7708. Вызывает 100%-ное привыкание с первой дозы. Позволяет контролировать сознание косынкоманов, подавляет желание работать, вызывает состояние апатии и расслабленности. Побочные эффекты: редкие уколы совести (надо поработать), но проходит по мере увеличения дозы препарата.
// К заголовку RadialBlur(For OpenGL)
// Данный код работает правильно только, если в пректе 0 форм ,
// а сам код введен в DPR файл!
program RadialBlur;
uses
Windows,
Messages,
OpenGL;
const
WND_TITLE = ‘Radial Blur’;
FPS_TIMER = 1; // Timer to calculate FPS
FPS_INTERVAL = 1000; // Calculate FPS every 1000 ms
type
TVector = array[0..2] of glFloat;
var
h_Wnd: HWND; // Global window handle
h_DC: HDC; // Global device context
h_RC: HGLRC; // OpenGL rendering context
keys: array[0..255] of Boolean; // Holds keystrokes
FPSCount: Integer = 0; // Counter for FPS
ElapsedTime: Integer; // Elapsed time between frames
Read more »
Filed in Графика by admin | Ноябрь 27, 2007 | No Comments
Каким обpазом выбиpать pазмеp шpифта, т.к. все мои стpадания по выбоpyпаpаметpов шpифта в CreateFont() никак не отpажались на его pазмеpе. Все что я пpидyмал, это юзать glScale(), но в этом слyчае полyчаем плохое качество (по сpавнению с той-же Воpдой) пpи малом pазмеpе символов
Вот часть работающего примера на Си (переведенного мною на Паскаль (АА)).
procedure GLSetupRC(pData: Pointer)
//void GLSetupRC(void *pData)
//{
var
// HDC hDC;
hDC: HDC;
// HFONT hFont;
hFont: HFONT;
// GLYPHMETRICSFLOAT agmf[128];
agmf: array[0..127] of GLYPHMETRICSFLOAT;
// LOGFONT logfont;
Read more »
Filed in Графика by admin | Ноябрь 27, 2007 | No Comments
Идет кинофильм, какой то душераздирающий триллер. Главная героиня в ажурном нижнем белье медленно продвигается по темному коридору. Музыка нагнетает обстановку. Главная героиня подходит к двери, протягивает руку, что бы открыть ее … И тут истошный крик из зала:
- Сохраняйся, дура!!! Сохраняйся!!!
Содержимое контекста
Итак, если необходимо осуществить вывод на поверхность чужого окна, надо, получив ссылку на это окно, получить ссылку на контекст устройства, связанную с этим окном, после чего можно рисовать на чужом окне. Когда мы работаем с OpenGL, мы создаем контекст воспроизведения OpenGL, связанный с контекстом устройства нашего окна, далее обращаемся к функциям OpenGL, отрабатывая которые, OpenGL строит картинку на поверхности нашего устройства.
То есть схема здесь такая - приложение отдает команды машине OpenGL, получая результат на поверхности своего окна. Такая архитектура называется “клиент - серверной”, в роли клиента выступает наше приложение, в роли сервера - система OpenGL. Задача сервера - отрабатывать команды клиента. В принципе, сервер может располагаться и не на нашем компьютере, а удаленно, возможно и за тысячи километров от нас. Наше приложение должно передать серверу требуемые для работы данные - контексты и команды на языке сервера. Также важно понимать, что основную работу выполняет не наше приложение, а сервер. Наше приложение лишь создает окно - платформу для работы сервера, и передает команды серверу. При грамотном подходе нет разницы, какими средствами мы спроектировали приложение - С или Delphi, скорость воспроизведения целиком зависит от производительности сервера - машины OpenGL. Мы выбрали в качестве средства разработки приложений именно Delphi за выдающуюся скорость компиляции и обаятельность концепций.
Read more »
Filed in Графика by admin | Ноябрь 27, 2007 | No Comments
{
Before importing an image (jpg) into a database,
I would like to resize it (reduce its size) and
generate the corresponding smaller file. How can I do this?
Load the JPEG into a bitmap, create a new bitmap
of the size that you want and pass them both into
SmoothResize then save it again …
there’s a neat routine JPEGDimensions that
gets the JPEG dimensions without actually loading the JPEG into a bitmap,
saves loads of time if you only need to test its size before resizing.
}
uses
JPEG;
type
TRGBArray = array[Word] of TRGBTriple;
pRGBArray = ^TRGBArray;
{—————————————————————————
———————–}
Read more »
Filed in Графика by admin | Ноябрь 27, 2007 | No Comments
Пришел програмист фотки печатать дал негатив служащим а они его спрашивают:
- В каком формате печатать?
- В “jpg” конечно
В комплект поставки Delphi входит модуль JPEG. Он позволяет работать с изображениями в формате JPEG. Эта программа сохраняет изображение экрана в файле C:\Screen.jpg.
uses Jpeg;
procedure TForm1.Button1Click(Sender: TObject);
var
JpegIm: TJpegImage;
bm: TBitMap;
begin
bm := TBitMap.Create;
bm.Width := Screen.Width;
bm.Height := Screen.Height;
BitBlt(bm.Canvas.Handle, 0, 0,
bm.Width, bm.Height,
GetDC(0), 0, 0, SRCCOPY);
JpegIm := TJpegImage.Create;
JpegIm.Assign(bm);
JpegIm.CompressionQuality := 20;
JpegIm.Compress;
JpegIm.SaveToFile(’C:\Screen.jpg’);
bm.Destroy;
JpegIm.Destroy;
end;
Filed in Графика by admin | Ноябрь 27, 2007 | No Comments
Компьютеpщик говоpит девушке:
-Ты мне сегодня во сне пpиснилась!
-В эpотическом?
-Hет, в обычном.
-А как ты их вообще pазличаешь?
-А у эpотических pасшиpение *.JPG
В комплект поставки Delphi входит модуль JPEG. Он позволяет работать с изображениями в формате JPEG. Эта программа открывает выбранный файл и выводит изображение на форму.
uses Jpeg;
procedure TForm1.Button1Click(Sender: TObject);
var
JpegIm: TJpegImage;
bm: TBitMap;
begin
if OpenDialog1.Execute = false then
Exit;
bm := TBitMap.Create;
JpegIm := TJpegImage.Create;
JpegIm.LoadFromFile(OpenDialog1.FileName);
bm.Assign(JpegIm);
Form1.Canvas.Draw(0, 0, bm);
bm.Destroy;
JpegIm.Destroy;
end;
Filed in Графика by admin | Ноябрь 27, 2007 | No Comments
procedure TForm1.FormCreate(Sender: TObject);
begin
if Image1.Picture.Graphic is TJPEGImage then
begin
TJPEGImage(Image1.Picture.Graphic).DIBNeeded;
end;
end;
Данный код заставляет явно и сразу декодировать jpeg, вместо того, чтобы делать это при отображении картинки
Filed in Графика by admin | Ноябрь 27, 2007 | No Comments
unit mainUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtDlgs, StdCtrls, ComCtrls, ExtCtrls, Buttons, ToolWin, ImgList;
type
TForm1 = class(TForm)
SavePictureDialog1: TSavePictureDialog;
OpenPictureDialog1: TOpenPictureDialog;
ScrollBox1: TScrollBox;
Image1: TImage;
ToolBar1: TToolBar;
OpenBtn: TToolButton;
SaveBtn: TToolButton;
Panel2: TPanel;
ProgressBar1: TProgressBar;
ImageList1: TImageList;
procedure SavePictureDialog1TypeChange(Sender: TObject);
procedure Image1Progress(Sender: TObject; Stage: TProgressStage;
PercentDone: Byte; RedrawNow: Boolean; const R: TRect;
const Msg: string);
procedure SavePictureDialog1Close(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure OpenBitBtnClick(Sender: TObject);
procedure SaveBitBtnClick(Sender: TObject);
procedure ToolBar1Resize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Read more »
Filed in Графика by admin | Ноябрь 27, 2007 | No Comments