Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Acider

Страницы: Назад 1 2 3 [4] 5 6 7 8 Далее
91
Вот щас играю одну пожаговку Dai Senryaku VII: Exceed , правда это в большей степени варгейм чем РПГ хотя раскачка там присуцтвует  :)

Если хош список турн бэйсов то вот смотри __http://www.gamefaqs.com/console/ps2/cat_59.html
Спасибо.

92
Finаl fаntаsy 6 на ps1

У меняесть Final Fantasy 6, но там уж точно только для одного ирока, а не для двоих.


Добавлено позже:
FRONT MISSION 3 PS1 AND 4 PS2 ТАКТИК РПГ НА ДВОИХ и более! :D

С каких это пор, то Front Mission на двоих и уж тем более, более? Это тактик РПГ для одного игрока.
Да если бы, эта супер игрушка былабы много пользовательской, ябы уж точно, не затеял,бы эту тему.

93
Ну не совсем рпг но тактика - Advance wars 1,2, например на GBA.
Хотелось, бы на PC, а лучше на PS2, но тем,не менее спасибо.

94
Из экшен-рпг:Baldur's Gate: Dark Alliance,Champions of Norrath и Fallout: Brotherhood of Steel.А вот в тактических что-то сомневаюсь...
Спасибо.

95
Здравствуйте уважаемые участники форума. Подскажите пожалуйста, а есть, ли РПГ в которые можно играть, не только одному, но и в двоем? Особенно хотелось, бы отметить тактические игры, в духе FFT или Front Mission, что бы друг против друга, ну типа как в Worms. Одну экшн РПГ я видел, где можно в двоем играть, это Shining tears. Пишите. Заранее благодарен.

96
а у меня вот такой вопрос: есть ли на PS2 Worms в 2D?
Эти части Worms есть на PS1. Покупаешь диск и играешь на PS2.

97
madmonkey, Worms это типа как бы стратегия.
Да, на соньке столько много классных тактических игр, но они не для двоих. Вот как бы классно было, если бы во Front Mission можно было бы друг против друга играть.

98
Здравствуйте уважаемые участники форума. Подскажите пожалуйста, а есть ли на PS2 пошаговые стратегии или даже лучше тактические РПГ, на двоих? Или, что же получается кроме Worms нечего нету? Заранее благодарен. 

99
Hard'n'Soft / Re: Canon LBP 2900 B и Vista
« : 14 Июль 2008, 01:58:34 »
Написано, что подойдет. На практике, сам проверяй :)
ОК.

100
Hard'n'Soft / Re: Canon LBP 2900 B и Vista
« : 13 Июль 2008, 23:02:15 »
Acider,
Google рулит.

http://software.canon-europe.com/software/0029302.asp

PS
Этот драйвер не подойдет для 64-битной версии Висты.
Спасибо за ответ. Я так понял, что к 32 битной подойдет,да?

101
Hard'n'Soft / Canon LBP 2900 B и Vista
« : 13 Июль 2008, 22:37:39 »
Здравствуйте. Один мой товарищ прикупил себе ноутбук, на котором стоит Vista, все работает идеально, но вот только драйвер, который шел в комплекте с принтером Canon LBP 2900 B, совсем не хочет ставиться и система выдает сообщение, что данный инсталлер не потдерживается данной аперационной системой( по английски), хотя на каробке знак Висты, да и в дравах чет намек есть в инструкции, но дров под Vista там нет, как тока не пробовали. Ставили на простой комп с XP, все ОК, ставиться. Здается мне, что драва, то не под Vista. Замучил весь Яндекс поиском этих дров, но под Vista так и не нашел. Кто знает где мона скачать эти дрова, пожалуйста дайте ссылочку. Заранее благодарен.

P.S. Просьба, не предлагать алтернативу, типа - "Сходите в магазин где брали ноут", просто некогда пока и хотелось, бы решить проблему установкой скачанного драйвера.

102
6 поколение / Re: Мерцание текстуры [PS2]
« : 01 Июль 2008, 21:40:20 »
Ну, а впринципе это норма, и такая вот мини проблема 128 битных игр. Кстати узнал, что вроде NTSC игры, вот решение. А так и на компушных играх это присутствует. Вот в RF рубаю и тама есть.
Вообще то это видно на дальних,мелких деталях, а приблизи своего героя и он читенький и аккуратненький. Всем спасибо.

103
6 поколение / Re: Мерцание текстуры [PS2]
« : 30 Июнь 2008, 10:06:43 »
Вся фишка именно в том, что у меня, не старый телек и подключен я через Component (5 тюльпанов).
Вот посоветуйте как лучше настроить телек или че там еще, или возможно этого избежать нельзя, учитывая, что через компонент когда играешь, то четкасть как на мониторе и видны все нюансы графики.

104
6 поколение / Re: Мерцание текстуры [PS2]
« : 30 Июнь 2008, 00:41:02 »
Надо еще добавить на некоторых телевизорах с некоторыми настройками.
Не понял сути твоей проблемы. Сам играю на пс2 уже года три никогда ничего подобного не встречал. Напиши подробно , хотя бы название игры и место. Еще лучше скрин с описанием проблемы ( хоть сотиком сфотай что-ли)

Да ты видать, не понял. Обычное стандартное мерцание текстур. Да во всех играх. Да даже, просто телек смотришь если цифровой сигнал, ну лесенка видна у линий на искосок. Возьми любую современную игру , туже ГТА СА или ФФ 10 или 12. Просто на кампе мона это исправить ито частично.
Полиигональная текстура, что ли это называется.

105
6 поколение / Мерцание текстуры [PS2]
« : 29 Июнь 2008, 18:05:34 »
Люди подскажите плиз кто знает. А есть ли способ избежать мерцание некоторых текстур в некоторых играх на PS2? Я думаю вы понимаете, что я имею ввиду, ну например бежишь там по ступенькам или проезжаешь на машине мимо домов и чуть ли не каждый кирпичек своим контуром тебе подмигивает. Вообще это впринципе норма, но на компе можно как то сгладить , а как быть с приставкой? Может быть есть какие нибудь хитрости в начстройки телека или еще что нибудь? Заранее благодарен.

106
6 поколение / Подключение PS2 через Component
« : 19 Апрель 2008, 23:59:43 »
Подскажите пожалуйста, кто нибудь пробовал подключать PS2 через компонентный кабель(5 тюльпанов) в обычный стеклянный, но 100 герцевый телек с поддержкой прогрессивной развертки, короче говоря через компонент? Чувствуется ли качественная разница в отличии от обычного подключения через AV? Заранее благодарен.

107
Слышал, что, не всем удается достать FF XII с русскими субтитрами.
У меня есть. Субтитры кое где корявые(перепутоно обращение мужского с женским, например персонаж девушка говорит-"я пошел туда", вместо - "я пошла туда" и иногда залезают за икран и буква "З" еще используется как "Э" и буква "Г" еще используется как "П", ну типа имя "Пенело" пишется как Генело.  А так все классно. Меня лично, это устраивает. Понять смысл и пройти игру лучше с этими пиратскими, но все таки русскими субтитрами. И вообще, меню тоже на русском. Короче говоря вся текстовая информация на русском.
Игра работает идеально, в отличии от русской FF X.
Кто заинтересовался. Пишите на мыло - acidattack(собака)yandex(точка)ru
Договоримся.

108
Arcade / Re: Сontra на Аркадном апарате!!!
« : 15 Ноябрь 2007, 01:14:05 »
Да искал я уже для NES нету,,а для MAME тем более,, но уверен конечно что это типа хака,, но его нет нигде. Аппарат был точно с нинтендо внутри, но как это было реализовано я не знаю, но внизу счётчи к времени на экране точно был. Вот попробую узнать у себя в городе, может кто помнит, какую нибудь игру ещё кроме Turtles 3 и этой самой контры.
На Nes такое было. Это походу пиратский клон первой контры. Я в такую игру играл, не на эмуле, так, как и не видел такого рома, а на самой приставке. Игра называется Super Contra 2.

109
Прветик. Подскажите мне пожалуйста, какие иры в духе MK: Shoulin monks есть на PS2.
Или она одна? Заранее благодарен.

Добавлено позже:
Так, что люди, неужели такого рода игр кроме MK: Shoulin Monks на PS2 нету? Напишите кто нить плиз. На первом PS ведь были, вот например: Fighting Forces, а на 8, 16 битных консолях были Double Dragon, Final Fight, Bare Knukle. Неужели такого рода игр нет на PS2?

110
GDI - графика в Delphi
 Previous  Top  Next 


     
 


 

 

Автор: Alistair Keys

 

Жаргон GDI.

 

GDI расшифровывается как Graphics Device Interface, и представляет собой интерфейс, который Windows использует для рисования 2D графики. Также это самый медленный способ отображения графики из существующих, однако самый простой для понимания основ. Итак, для начала, поговорим об основных понятиях и терминах в GDI.

 

Начнём с того, что GDI обычно не используют для создания крутых графических эффектов, для этого есть DirectX, OpenGL, или любые графические библиотеки (такие как: DelphiX, FastLib, DIBUltra, Graphics32...). Однако, для создание простых эффектов с минимальными усилиями GDI вполне сгодится.

 

С GDI тесно связана ещё одна аббревиатура - DC ("Device Context" - контекст устройства). Это то, на чём мы рисуем, и в Delphi контекст устройства представлен как TCanvas. Идея контекста устройства заключается в том, что это универсальное устройство вывода, поэтому можно использовать одинаковые функции как для экрана, так и для принтера.

 

Все графические функции в Delphi являются надстройками над стандартными GDI функциями Windows. Позже мы поговорим об этих функциях.

 

А теперь самое время приступить к рассмотрению того, как устроен GDI. Ниже, в таблице, представлены некоторые важные классы:

 

 

Pen Используется для рисования простых линий. Обычно применяется для функции LineTo или при рисовании рамки для определённой фигуры (например для функции Rectangle).

 

Brush Кисть используется для заполнения области определённым цветом. Применяется в функциях Rectangle, FillRect или FloodFill.

 

Font Используется для задания шрифта, которым будет нарисован текст. Можно указать имя шрифта, размер и т.д.

 

Region Позволяет задать регион (замкнутое пространство). Регионом может быть круг, квадрат или произвольная фигура. Позволяет так же делать дырки в фигурах.

 

Однако, пора переходить от слов к делу, а именно, начать рисовать линии и фигуры.

 

Рисование линий

 

Сперва необходимо чётко уяснить, что координата (0,0) это верхний левый угол экрана. То есть значения по оси y увеличиваются вниз экрана. Соответственно, координата (0, 50) означает, что мы просто отступили на 50 пикселей от верха экрана.

 

Самое главное, что надо знать при рисовании линий и фигур, это различие между пером (Pen) и кистью (Brush). Всё очень просто: перо (Pen) используется при рисовании линий или рамок, а кисть (Brush) для заполнения фигуры.

 

Ниже приведены две функции, которые используются для рисования линий и обе принадлежат TCanvas:

 

MoveTo Перемещает точку начала рисования линии в указанные координаты x и y Canvas.MoveTo(50, 100);

 

LineTo Рисует линию начиная с текущей позиции (см. MoveTo) до указанных координат x и y. Canvas.LineTo(50, 100);

 

Эффект перемещения точки начала рисования линии так же достигается при помощи установки своства PenPos в канвасе... например, "Canvas.PenPos.x := 20;", "Canvas.PenPos.y := 50", или "Canvas.PenPos := Point(20,50);".

 

По умолчанию, точка начала рисования установлена в (0,0), то есть, если сразу вызвать "Canvas.LineTo(100,100);" то будет нарисована линия из точки (0,0) в точку (100, 100). Точка начала рисования автоматически переместится в (100, 100), то есть, если выполнить команду "Canvas.LineTo(200, 100);", то следующая линия будет нарисована из точки (100, 100) в (200, 100). Поэтому, если мы хотим рисовать линии несоединённые друг с другом, то придётся воспользоваться методом MoveTo.

 

Линия, нарисованная при помощи LineTo использует текущее перо канваса (типа TPen). Основные свойства пера, это ширина - "Canvas.Pen.Width := 4;" (при помощи которого можно задавать различную ширину линий), и цвет "Canvas.Pen.Color := clLime;".

 

Взглянем на простой пример беспорядочного рисования разноцветных линий:

Code:
 
procedure TForm1.FormCreate(Sender: TObject);

begin

// инициализируем генератор

// случайных чисел

Randomize;

end;

 

const

NUM_LINES = 2000;

 

procedure TForm1.DrawLines;

var

i: Integer;

begin

for i := 0 to NUM_LINES - 1 do

begin

   Canvas.Pen.Color :=

     RGB(Random(256),

     Random(256),

     Random(256));

   Canvas.LineTo

     (Random(ClientWidth),

     Random(ClientHeight));

end;

end;
 

 

 

 

 

 

 

Процедура DrawLines вызывается из обработчика кнопки OnClick. Количество линий задаётся в константе NUM_LINES. Между прочим, функция RGB, составляет цвет каждой линии из трёх основных составляющих: красного, зелёного и синего (значения от 0 до 255) и возвращает нам цвет в виде TColor.

 

 

Рисование фигур

 

Для рисования фигур, в TCanvas предусмотрены следующие функции:

 

Ellipse Рисует элипс, вписанный в невидимый квадрат с координатами верхнего левого угла и правого нижнего. Если координаты х и y у углов будут совпадать, то получится круг. Canvas.Ellipse(0,0,50,50);

 

FillRect Заполняет прямоугольник цветом текущей кисти (brush), но никак не за пределами него. Canvas.FillRect( Bounds(0,0,100,100));

 

FloodFill Заполняет данную область цветом текущей кисти, до тех пор пока не будет достигнут край. Canvas.FloodFill(10, 10, clBlack, fsBorder);

 

Rectangle Рисует прямоугольник (или квадрат), заполненный цветом текущей кисти и обрамлённый цветом текущего пера Canvas.Rectangle( Bounds(20, 20, 50, 50));

 

RoundRect Тоже, что и Rectangle, но с загруглёнными углами. Canvas.RoundRect( 20, 20, 50, 50, 3, 3);

 

 

Ещё есть очень нужная функция TextOut, которая позволяет рисовать текст, используя шрифт, заданный в канвасе:

 

TextOut Рисует данную строку на канвасе начиная с координат (x,y) - фон текста заполняется текущим цветом кисти. Canvas.TextOut(10, 10, 'Some text');

 

Кстати, функция позволяет рисовать текст, не заполняя его фон. Если Вам необходимо изменить шрифт, используемый в TextOut, то необходимо изменить свойство Font канваса (это свойство имеет тип TFont) - например "Canvas.Font.Name := 'Verdana';", "Canvas.Font.Size := 24;" или "Canvas.Font.Color := clRed;".

 

Вкратце хотелось бы обратить Ваше внимание на довольно полезный класс TRect, который умеет хранить в себе значения лево, право, верха и низа (кстати, в Windows API это RECT). То ест, достаточно указать левую и верхнюю координату и ширину и высоту области, а TRect автоматически подставит в виде (лево, верх, лево + ширина, верх + высота). Ещё есть другая функция Rect(), которая делает тоже самое, но координаты в ней задаются напрямую как лево, право, верх и низ. Ну и по желанию, можно использовать API функцию SetRect.

 

Ниже представлен пример, который рисует случайным образом различные фигуры:

Code:
 
const

NUM_SHAPES = 200;

 

procedure TForm1.DrawShapes;

var

i, ShapeLeft, ShapeTop: Integer;

begin

for i := 0 to NUM_SHAPES - 1 do

begin

   Canvas.Brush.Color :=

     RGB(Random(256),

     Random(256),

     Random(256));

   ShapeLeft := Random(ClientWidth);

   ShapeTop := Random(ClientHeight);

   // теперь, случайным образом, решаем что рисовать

   case Random(3) of

     0: Canvas.Rectangle(ShapeLeft,

         ShapeTop,

         ShapeLeft + Random(50),

         ShapeTop + Random(50));

     1: Canvas.Ellipse(ShapeLeft,

         ShapeTop,

         ShapeLeft + Random(50),

         ShapeTop + Random(50));

     2:

       begin

         Canvas.Font.Size := 10 + Random(7); // от 10 до 16

         Canvas.TextOut(ShapeLeft, ShapeTop, 'Some text');

       end;

   end;

end;

end;
 

 

 

Как Вы уже успели заметить, некоторые фигурки имеют цвет рамки, отличающийся от того цвета, которым заполнена фигура. Это как раз тот момент, о котором я упоминал выше. Кистью мы заполняем объекты, а пером обрамляем. Если цвет кисти (brush) меняется случайным образом, то цвет пера(pen) остаётся постоянным. Из-за этого и получается такая картина.

 

Перерисовка окна

 

Теперь давайте разберёмся, почему в самом первом примере у нас стирались линии при перемещении формы за границы экрана. А именно, нам нужно выяснить разницу между "рисованием" и "перерисовкой".

 

Рисование, это то, что мы делали выше. То есть, рисовали любые линии и графические фигуры. Однако, рисунок сохранялся до тех пор, пока окно(форма) не было обновлено.

 

Перерисовка несколько отличается от понятия "рисование". Когда окну необходимо перерисоваться, то Windows посылает определённое сообщение. Это сообщение поступает в обработчик события "OnPaint". Любой код, который поместить в обработчик OnPaint будет вызван каждый раз, когда форме необходимо обновиться.

 

Для примера, поместите следующий код в проект:

Code:
 
procedure TForm1.DrawSomeText;

begin

Canvas.TextOut(10, 10, 'Some text');

end;
 

 

Если поместить на форму кнопку и вызывать DrawSomeText из обработчика кнопки OnClick, то проблема с исчезновением текста при перемещении формы останется. ОДНАКО, если вызвать DrawSomeText из обработчика формы OnPaint, то текст останется на своём месте окончательно.

 

Дескрипторы, или как пользоваться аналогичными API функциями

 

Итак, мы научились рисовать линии, различные фигуры, научились делать так, чтобы наше творение не стиралось при перемещении формы, и проделали мы всё это при помощи стандартных функций VCL (таких как Canvas.TextOut и т.д.). Однако, что делать, если Вы не хотите пользоваться графическими функциями VCL, которые всего навсего являются надстройками над аналогичными функциями из Windows API? Пожалуйста! Никто нам не запрещает пользоваться API функциями напрямую! Но постойте-ка, все они требуют какого-то HDC! Что такое HDC?

 

Почти всё в Windows использует "Дескриптор" (Handle). Дескриптор, это способ идентификации Вашего объекта в системе. У каждого окна есть свой дескриптор, у каждой кнопки тоже есть свой дескриптор и т.д. Именно поэтому все наши объекты имеют дескриптор в качестве свойства - например, "MyForm.Canvas.Handle".

 

Тип HDC это Дескриптор(Handle) Контекста Устройства (Device Context). Я уже говорил в самом начале, что TCanvas включает в себя большинство функций DC. Поэтому, мы спокойно можем подставлять свойство канваса Handle везде, где нам это потребуется.

 

Ради интереса можно взглянуть на таблицу, в которой представлены примеры вызовов некоторых функций из VCL и их аналогов из Windows API.

 

Canvas.TextOut(x,y,myString);                TextOut(Canvas.Handle, x, y, PChar(myString), Length(String));

 

Canvas.FloodFill(X, Y, Color,fsBorder);        ExtFloodFill(Canvas.Handle, x, y, YourColour, FLOODFILLBORDER);

 

Canvas.LineTo(x,y);                                LineTo(Canvas.Handle, x, y);

 

Canvas.MoveTo(x,y);                                MoveToEx(Canvas.Handle, x, y, nil);

 

Так же можно использовать разные дескрипторы, чтобы рисовать в разных местах. Например, можно использовать "SomeBmp.Canvas.Handle" для рисования на картинке (битмапе), либо "Form1.Canvas.Handle", чтобы рисовать на форме.

 

В API версии функции TextOut необходимо передавать строку завершённую нулём. Это значит, что вместо того, чтобы передать строку в функцию напрямую, необходимо передать её как PChar. Так же не забывайте передавать в функцию длину строки. Для этого можно воспользоваться функцией Length.

 

Ну что, Вам уже захотелось поместить на форму какую-нибудь красивую картинку ?

 

Что такое Битмапы (Bitmaps)?

 

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

 

Битмап, это графический объект, который содержит заголовок, необходимую информацию о картинке (такую как высота, ширина, цвета и т.д.) и, собственно, само изображение (большой массив, содержащий цвет каждой точки). В Delphi для этой цели уже предусмотрен класс TBitmap.

 

Битмапы можно рисовать не только на форме, но и по всему экрану. Может это и может показаться немного странным, но иногда это бывает полезно, особенно при создании скринсейвера. Однако, сначала нам необходимо разобраться с тем, как работать с битмапами. Вот небольшой пример:

Code:
 
procedure Form1.DrawBitmap(const Filename: string; const x, y: Integer);

var

Bmp: TBitmap;

begin

// Сперва убедимся, что файл существует!

if not FileExists(Filename) then

begin

   ShowMessage('The bitmap ' + Filename + ' was not found!');

   Exit;

end;

 

Bmp := TBitmap.Create;

try

   Bmp.LoadFromFile(Filename);

   Canvas.Draw(x, y, Bmp);

finally

   Bmp.Free;

end;

end;
 

 

 

 

 

 

 

Эта функция пытается загрузить и показать картинку, (с именем Filename, например 'myBitmap.bmp') начиная с точки (x,y).

 

Сразу скажу, что эта функция довольно неэффективна. Она создаёт и уничтожает битмап каждый раз когда вызывается, а так же каждый раз проверяет существование файла. Лучше объявлять объект TBitmap как часть формы, создавать и загружать картинку в FormCreate, а освобождать её в FormDestroy.

 

Функции рисования в GDI

 

TCanvas имеет несколько полезных функций, которые работают с типом TGraphic. Тип TGraphic является базовым классом для графических объектов в Delphi, таких как: битмапы (TBitmap), иконки (TIcon), метафайлы (TMetafile) и JPEG-и (TJPEGImage). Все они используют одни и те же функции, которые приведены в таблице:

 

Все эти функции являются методами TCanvas.

 

Draw Рисует TGraphic на канвасе так как он есть, не растягивая. Canvas.Draw(5,10,MyGraphic);

 

StrechDraw Рисует TGraphic на канвасе, подгоняя (растягивая) его под заданную область. Canvas.StretchDraw( Bounds(0,0,32,32), MyGraphic);

 

CopyRect Копирует часть TCanvas-а в другой, при необходимости растягивая его. Canvas.CopyRect( Bounds(0,0,32,32), MyBmp.Canvas, Bounds(0, 0, 640, 480));

 

TCanvas.Draw является обёрткой для API функции BitBlt:

 

function BitBlt(

hdcDest: HDC; // дескриптор конечного контекста устройства

nXDest, // коорд. x верхнего левого угла конечного прямоугольника

nYDest, // коорд. y верхнего левого угла конечного прямоугольника

nWidth, // ширина конечного прямоугольника

nHeight: Integer; // высота конечного прямоугольника

hdcSrc: HDC; // дескриптор исходного контекста устройства

nXSrc, // коорд. x верхнего левого угла исходного прямоугольника

nYSrc: Integer; // коорд. y верхнего левого угла исходного прямоугольника

dwRop: DWORD // код растровой операции

): Boolean;

 :) Даааааа. Это яи так знаю, и многое другое. Просто такую мелоч забыл. И мне уже подсказали.
А в кодах и в работе с канвой я шарю, хотя и призабыл кое что. Спасибо.

111
А чем тебя правый клик по Image3, Control->Send to back не устраивает?
Спасибо.

Добавлено позже:
4.3 Компоненты Image и PaintBox
Компоненты Image и PaintBox представляют собой некоторую ограниченную поверхность с канвой, на которую можно заносить изображения, как это описано в разделе 4.2. При этом компонент PaintBox, собственно говоря, не дает ничего нового по сравнению с рисованием на канве формы. Рисование на PaintBox вместо формы не имеет никаких преимуществ, кроме, может быть, некоторого облегчения в расположении одного или нескольких рисунков в площади окна.

Компонент Image много богаче по своим возможностям и удобнее, чем PaintBox. Даже при использовании описанных в разделе 4.2 приемов рисования на канве компонент Image имеет существенное преимущество: в нем не приходится думать о перерисовке изображения, испорченного из-за перекрытия данного окна другими. Все, связанное с обработкой событий OnPaint, рассмотренных в разделе 4.2, в Image осуществляется автоматически. Кроме того с помощью Image проще, чем при непосредственном рисовании на канве формы, расположить в окне приложения несколько изображений и управлять ими. При этом отпадает необходимость сложных и нудных расчетов координат канвы формы, обеспечивающих требуемое взаимное расположение изображений, т.е. в полной мере проявляются преимущества визуального программирования. Так что, вероятно, во всех случаях лучше работать с канвой Image, чем с канвой формы.

Но помимо этих возможностей у компонента Image имеются свойства, позволяющие работать с различными типами графических файлов.

Delphi поддерживает три типа файлов — битовые матрицы, пиктограммы и метафайлы. Все три типа файлов хранят изображения; различие заключается лишь в способе их хранения внутри файлов и в средствах доступа к ним. Битовая матрица (файл с расширением .bmp) отображает цвет каждого пикселя в изображении. При этом информация хранится таким образом, что любой компьютер может отобразить изображение с разрешающей способностью и количеством цветов, соответствующими его конфигурации.

Пиктограммы (файлы с расширением .ico) — это маленькие битовые матрицы. Они повсеместно используются для обозначения значков приложений, в быстрых кнопках, в пунктах меню, в различных списках. Способ хранения изображений в пиктограммах схож с хранением информации в битовых матрицах, но имеются и различия. В частности, пиктограмму невозможно масштабировать, она сохраняет тот размер, в котором была создана.

Метафайлы (Metafiles) хранят не последовательность битов, из которых состоит изображение, а информацию о способе создания картинки. Они хранят последовательности команд рисования, которые и могут быть повторены при воссоздании изображения. Это делает такие файлы, как правило, более компактными, чем битовые матрицы.

Компонент Image позволяет отображать информацию, содержащуюся в графических файлах всех указанных типов. Для этого служит его свойство Picture — объект типа TPicture.

Рис. 4.3
Окно Picture Editor 


Чтобы познакомиться с этим свойством откройте новое приложение и перенесите на форму компонент Image. Растяните его или задайте его свойство Align равным alClient, чтобы он занял всю клиентскую область формы. Нажмите на кнопку с многоточием около свойства Picture в окне Инспектора Объектов или просто сделайте двойной щелчок на Image. Перед вами откроется окно Picture Editor (рис. 4.3), позволяющее загрузить в свойство Picture какой-нибудь графический файл (кнопка Load), а также сохранить открытый файл под новым именем или в новом каталоге. Щелкните на Load, чтобы загрузить графический файл. Перед вами откроется окно открытия графического файла, представленное на рис. 4.4. По мере перемещения курсора в списке по графическим файлам в правом окне отображаются содержащиеся в них картинки, а над ними — цифры, характеризующие размер картинки. Вы можете выбрать требуемый вам графический файл любого типа. Напомним, что поставляемые с Delphi графические файлы вы можете найти в каталоге Images. В Delphi 5 и 4 он обычно расположен в каталоге ...\program files\Common Files\Borland Shared. В Delphi 3 он расположен в каталоге ...\program files\Borland\Delphi 3, а в Delphi 1 — в каталоге Delphi 16. После загрузки файла щелкните на OK в окне Picture Editor и в вашем компоненте Image отобразится выбранная вами картинка. Можете запустить ваше приложение и полюбоваться ею. Впрочем, вы и так видите картинку, даже не выполняя приложение.

Рис. 4.4
Окно диалога открытия графического файла 
 


Когда вы в процессе проектирования загрузили изображение из файла в компонент Image, он не просто отображает его, но и сохраняет в приложении. Это дает вам возможность поставлять ваше приложение без отдельного графического файла. Впрочем, как мы увидим позднее, в Image можно загружать и внешние графические файлы в процессе выполнения приложения.

Вернемся к рассмотрению свойств компонента Image.

Если установить свойство AutoSize в true, то размер компонента Image будет автоматически подгоняться под размер помещенной в него картинки. Если же свойство AutoSize установлено в false, то изображение может не поместиться в компонент или, наоборот, площадь компонента может оказаться много больше площади изображения.

Другое свойство — Stretch позволяет подгонять не компонент под размер рисунка, а рисунок под размер компонента. Установите AutoSize в false, растяните или сожмите размер компонента Image и установите Stretch в true. Вы увидите, что рисунок займет всю площадь компонента, но поскольку вряд ли реально установить размеры Image точно пропорциональными размеру рисунка, то изображение исказится. Устанавливать Stretch в true может иметь смысл только для каких-то узоров, но не для картинок. Свойство Stretch не действует на изображения пиктограмм, которые не могут изменять своих размеров.

Свойство — Center, установленное в true, центрирует изображение на площади Image, если размер компонента больше размера рисунка.

Рассмотрим еще одно свойство — Transparent (прозрачность). Если Transparent равно true, то изображение в Image становится прозрачным. Это можно использовать для наложения изображений друг на друга. Поместите на форму второй компонент Image и загрузите в него другую картинку. Только постарайтесь взять какую-нибудь мало заполненную, контурную картинку. Можете, например, взять картинку из числа помещаемых обычно на кнопки, например, стрелку (файл ...\program files\common files\borland shared\images\buttons\arrow1l.bmp). Передвиньте ваши Image так, чтобы они перекрывали друг друга, и в верхнем компоненте установите Transparent равным true. Вы увидите, что верхняя картинка перестала заслонять нижнюю. Одно из возможных применений этого свойства — наложение на картинку надписей, выполненных в виде битовой матрицы. Эти надписи можно сделать с помощью встроенной в Delphi программы Image Editor.

Учтите, что свойство Transparent действует только на битовые матрицы. При этом прозрачным (т.е. заменяемым на цвет расположенного под ним изображения) делается по умолчанию цвет левого нижнего пикселя битовой матрицы.

Мы рассмотрели загрузку изображения из файла в процессе проектирования. Но свойство Picture позволяет также легко организовать обмен с графическими файлами любых типов в процессе выполнения приложения. Чтоб пояснить технику такого обмена, надо сначала подробнее рассмотреть свойство Picture.

Это свойство является объектом, который имеет в свою очередь подсвойства, указывающие на хранящийся графический объект. Если в Picture хранится битовая матрица, на нее указывает свойство Picture.Bitmap. Если хранится пиктограмма, на нее указывает свойство Picture.Icon. На хранящийся метафайл указывает свойство Picture.Metafile. Наконец, на графический объект произвольного типа указывает свойство Picture.Graphic.

Объект Picture и его свойства Bitmap, Icon, Metafile и Graphic имеют методы файлового чтения и записи LoadFromFile и SaveToFile:

procedure LoadFromFile(const FileName: string);
procedure SaveToFile(const FileName: string);

Для свойств Picture.Bitmap, Picture.Icon и Picture.Metafile формат файла должен соответствовать классу объекта: битовой матрице, пиктограмме, метафайлу. При чтении файла в свойство Picture.Graphiс файл должен иметь формат метафайла. А для самого объекта Picture методы чтения и записи автоматически подстраиваются под тип файла. Поясним это на примере.

Давайте построим приложение, аналогичное рассмотренному в разделе 4.2 примеру просмотра графических файлов. Для разнообразия можно организовать управление им не кнопкой Button, а меню. Поместите на форму компонент Image. Растяните его или задайте его свойство Align равным alClient, чтобы он занял всю клиентскую область формы. Перенесите на форму компонент диалога открытия графического файла OpenPictureDialog (см. раздел 8.2). Поместите также на форму компонент главного меню MainMenu (см. раздел 6.1) и задайте в нем один раздел — Файл. В обработчике этого раздела напишите оператор

if(OpenPictureDialog1.Execute) then
  Image1.Picture.LoadFromFile(
    OpenPictureDialog1.FileName);

Этот оператор вызовет диалог открытия графического файла (см. рис. 4.4) и загрузит в компонент Image1 изображение из выбранного пользователем файла (см. рис. 4.5). Причем файл может быть любого типа: битовая матрица, пиктограмма или метафайл.

Рис. 4.5
Изображение в компоненте Image битовой матрицы (а) и пиктограммы (6)  а)  б) 


В этом приложении метод LoadFromFile применен к Image1.Picture. Если будут открываться только файлы битовых матриц, то оператор загрузки файла можно заменить на

  Image1.Picture.Bitmap.LoadFromFile(
    OpenPictureDialog1.FileName);

Для пиктограмм можно было бы использовать оператор

  Image1.Picture.Icon.LoadFromFile(
    OpenPictureDialog1.FileName);

а для метафайлов — оператор
  Image1.Picture.Metafile.LoadFromFile(
    OpenPictureDialog1.FileName);

или
  Image1.Picture.Graphic.LoadFromFile(
    OpenPictureDialog1.FileName) ;

Но во всех этих случаях, если формат файла не совпадет с предполагаемым, возникнет ошибка. Аналогично работает и метод SaveToFile с тем отличием, что примененный к Picture или к Picture.Graphic он сохраняет в файле изображение любого формата. Например, если вы дополните свое приложение диалогом SavePictureDialog (см. раздел 8.2), введете в меню раздел Сохранить как и в его обработчик поместите оператор

if SavePictureDialog1.Execute then
  Image1.Picture.SaveToFile(SavePictureDialog1.FileName);

то пользователь получит возможность сохранить изображение любого формата в файле с новым именем. Только при этом, чтобы не возникало в дальнейшем путаницы, расширение сохраняемого файла все-таки должно соответствовать формату сохраняемого изображения.
Абсолютно идентично для изображений любого формата будет работать программа, если оператор сохранения вы замените на

  Image1.Picture.Graphic.SaveToFile(
    SavePictrureDialog1.FileName);

использующий свойство Picture.Graphic. А если вам известен формат хранимого в компоненте Image изображения, то вы можете применить метод SaveToFile к свойствам Picture.Bitmap, Picture.Icon и Picture.Metafile.
Для всех рассмотренных объектов Picture, Picture.Bitmap, Picture.Icon и Picture.Metafile определены методы присваивания значений объектов:

procedure Assign(Source: TPersistent);

Однако, для BitMap, Icon и Metafile присваивать можно только значения однородных объектов: соответственно битовых матриц, пиктограмм, метафайлов. При попытке присвоить значения разнородных объектов генерируется исключение ЕConvertError. Объект Picture — универсальный, ему можно присваивать значения объектов любых из остальных трех классов. А значение Picture можно присваивать только тому объекту, тип которого совпадает с типом объекта, хранящегося в нем.

Метод Assign можно использовать и для обмена изображениями с буфером Clipboard. Например, оператор

Clipboard.Assign(Image1.Picture) ;

занесет в буфер обмена изображение, хранящееся в Image1. Аналогично оператор
Image1.Picture.Assign(Clipboard) ;

прочитает в Image1 изображение, находящееся в буфере обмена. Причем это может быть любое изображение и даже текст.
Надо только не забыть при работе с буфером обмена вставить в оператор uses вашего модуля ссылку на модуль Clipbrd. Автоматически Delphi эту ссылку не вставляет.

Возвращаясь к свойствам компонента Image, можно отметить один недостаток, присущий нашему тестовому приложению, приведенному на рис. 4.5. При загрузке разных изображений размер окна приложения может оказаться или слишком маленьким, и тогда вы увидите только часть изображения, или слишком большим, и тогда изображение будет некрасиво размещено в левом верхнем углу формы, оставляя много пустого пространства. Этот недостаток можно устранить, если воспользоваться свойствами Height (высота) и Width (ширина) компонента Image. При свойстве AutoSize установленном в true размеры Image автоматически устанавливаются равными размерам загруженного изображения. И этими размерами можно воспользоваться для соответствующего изменения размеров формы. Например, приведенный ранее код загрузки изображения из файла можно заменить на следующий:

if OpenPictureDialog1.Execute then
 begin
  Image1.Picture.LoadFromFile(
   OpenPictureDialog1.FileName);
  Form1.ClientHeight := Image1.Height+10;
  Image1.Top := Form1.ClientRect.Top
   + (Form1.ClientHeight - Image1.Height) div 2;
  Form1.ClientWidth := Image1.Width+10;
  Image1.Left := Form1.ClientRect.Left
   + (Form1.ClientWidth - Image1.Width) div 2;
 end;

В этом коде размеры клиентской области формы устанавливаются несколько больше размеров компонента Image1, которые в свою очередь адаптируются к размеру картинки благодаря свойству AutoSize. Внесите эти исправления в свое приложение, выполните его и увидите, что форма стала автоматически адаптироваться к размерам загруженного изображения.

А вот это лишнее. Я про это , не спрашивал. Но все равно спасибо.

112
Ромхакинг и программирование / Delphi (TImage)
« : 18 Октябрь 2007, 14:43:12 »
Привет программерам. У меня такой вопрос. Подскажите плиз, где у компонента TImage можно менять, что бы он был на заднем или на переднем плане. А, то когда делал игру одного перса в первый имидж кинул другого во второй, а на последок над фоном стал работать. Не, впринцыпе можно попарить себе мозги и поменять картинки в имиджах и потом во всех кодах с загрузками картинок, поменять номер имиджа. Но мож все таки как то можно проще, просто поставить Image3 на задний план? Подскажите плиз. Заранее благодарен.

113
Игры на консолях 5-6 поколений / Final Fantasy XII
« : 16 Октябрь 2007, 15:35:26 »
Люди, а у меня тут вот такая, вот заминочка. Ситуатция вот в чем. Кароче мне надо выполнить охоту на Enkledos. Ну и кароче заключил договор с владельцем объявления, эффектно появилась надпись, что охота начата(ну, как обычно), ну и что бы по быстрее найти негодячя и убить его(а главное потом получить награду), я решил в очередной раз подсматреть место нахождения монстра здесь http://www.ffforever.info/games/ffxii/ffxii_marks.html  
На этом сайте этоа охота показана под номером 8. Там и на карте показано где ядолжен находиться, что бы найти монстра. Все там облазил, а монстра нет. Мож владелец сайта ошибся, или что? Подскажите плиз где найти этого монстра. Заранее благодарен.

114
Разное / Фигурки Final Fantasy
« : 15 Октябрь 2007, 17:57:26 »
Цитата: sah;177993
http://www.animebox.ru/


Круто.

115
Разное / Фигурки Final Fantasy
« : 14 Октябрь 2007, 16:48:13 »
Добавлено через 1 минуту
Цитата: Mortal Hero;177770

Так отличная идея! Знаешь как круто иметь одну единственную в мире уникальную фигурку :)


Это точно. :)

116
Разное / Фигурки Final Fantasy
« : 13 Октябрь 2007, 22:03:03 »
По всей видимости ширпотребных финалок нет, а есть тока лицензионные фигурки. Да, это дорого. Хотя мож у кого нибудь и валяется игрушочный Клауд или Сквалл, а того гляди и Ваан. Мож кто и отклинеца, кто в курсе этого, в чем я конечно сомневаюсь. А ваще проще и дешевле на заказ зделать. Ну уж точно знаю, что вылить из серебра кулончик ввиде Ган-блэйда сквала, совсем, не дорого, чем заказывать его у Square. Да еще и продать его как оригинал, что я, не кому, не советую делать. А оригиналы я в инете видел, по этому и завел эту тему. Как ни как Киндер Сюрприз отдыхает.

117
Разное / Фигурки Final Fantasy
« : 12 Октябрь 2007, 19:27:21 »
Кто хорошо знает Финалку,тот и должен быть в курсе того, что на офециальном сайте Square есть возможность заказать фигурки героев из финалки. Но меня интересуют их грубо говоря подделки. Как правило игрушки не оригиналы, производятся в Китае и их огромное колличесто осидает в России. В их число входят: трансформеры, ниндзя черепашки, Шрэк, Крэйзи Фрог, человек паук и т.д. Ну, не ужели в их число, не вошли герои Финалки. Люди кто знает где можно купить не дорого хоть одну фигурку с финалки, плиз подскажите.

118
NES / Dendy / [Tecmo Cup-Soccer Game] Футбол
« : 03 Октябрь 2007, 22:24:25 »
Спасибо большое.

119
NES / Dendy / [Tecmo Cup-Soccer Game] Футбол
« : 03 Октябрь 2007, 21:46:47 »
Люди помогите пожалуйста найти название игры на nes. Это игра футбол,
но, не совсем обычного интерфейса, особенно для nes. Очень хорошая графа напоминаюшая анимэ. Процесс игры проходит весьма интересным и зрелещным способом, т.е. , не как в стандартных футбольных играх(вид сверху-сбоку), а крупным планом(показан один футболист, бегущий на пользователя) и игровая система напоминает чем то ФФ(нужно выбирать команды, например удар по мечу ногой, и потом это красиво исполняется). Я надеюсь меня правильно поняли. Заранее благодарен.

120
Жаль конечно, что, SONY не порадовали такими контроллерами. Ну ладно. Тем, не менее спасибо за инфу.

Страницы: Назад 1 2 3 [4] 5 6 7 8 Далее