Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Вниз

Image поверх Image   Найти похожие ветки 

 
hypnotize   (2007-01-20 16:31) [0]

Здраствуйте Мастера, вопрос такой: имеется двигающийся Image (задний фон), на его фоне рисуется еще один Image с Transperent := true; Так вот второй Image при этом безбожно мерцает (мигает, моргает, дергается, кому как удобнее :)). form1.DoubleBuffered:=true;
Пробывал с PaintBox"ом - тоже, изголялся с BackBuffer"ом - тоже мерцание, что уже и делать не знаю, может предложите?


 
Delphi-Chainik   (2007-01-20 16:54) [1]

А на канве рисовать?


 
hypnotize   (2007-01-20 16:55) [2]

На канве самой формы?


 
hypnotize   (2007-01-20 16:55) [3]

Удалено модератором
Примечание: дубль


 
hypnotize   (2007-01-20 18:20) [4]

Только что попробывал все это вывесте на канве формы (через Timer), получилось. Только все равно мерцает! И без трансперента, так что этот вариант отпадает.


 
Delphi-Chainik   (2007-01-20 22:14) [5]

Попробуй это, пример с Delphi World :


unit aplane_;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, StdCtrls, Buttons;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   Image1: TImage;
   procedure FormActivate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}
var
 Back, bitmap, Buf: TBitMap; // фон, картинка, буфер
 BackRct: TRect; // область фона, которая должна быть
 // восстановлена из буфера
 BufRct: Trect; // область буфера, которая используется для
 // восстановления фона

 x, y: integer; // текущее положение картинки
 W, H: integer; // размеры картинки

procedure TForm1.FormActivate(Sender: TObject);
begin
 // создать три объекта - битовых образа
 Back := TBitmap.Create; // фон
 bitmap := TBitmap.Create; // картинка
 Buf := TBitmap.Create; // буфер

 // загрузить и вывести фон
 Back.LoadFromFile("factory.bmp");
 Form1.Image1.canvas.Draw(0, 0, Back);

 // загрузить картинку, которая будет двигаться
 bitmap.LoadFromFile("aplane.bmp");
 // определим "прозрачный" цвет
 bitmap.Transparent := True;
 bitmap.TransParentColor := bitmap.canvas.pixels[1, 1];

 // создать буфер для сохранения копии области фона,
 // на которую накладывается картинка
 W := bitmap.Width;
 H := bitmap.Height;
 Buf.Width := W;
 Buf.Height := H;
 Buf.Palette := Back.Palette; // Чтобы обеспечить соответствие палитр !!
 Buf.Canvas.CopyMode := cmSrcCopy;
 // определим область буфера, которая будет использоваться
 // для восстановления фона
 BufRct := Bounds(0, 0, W, H);

 // начальное положение картинки
 x := -W;
 y := 20;

 // определим сохраняемую область фона
 BackRct := Bounds(x, y, W, H);
 // и сохраним ее
 Buf.Canvas.CopyRect(BufRct, Back.Canvas, BackRct);
end;

// обработка сигнала таймера

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 // восстановлением фона (из буфера) удалим рисунок
 Form1.image1.canvas.Draw(x, y, Buf);

 x := x + 2;
 if x > form1.Image1.Width then
   x := -W;

 // определим сохраняемую область фона
 BackRct := Bounds(x, y, W, H);
 // сохраним ее копию
 Buf.Canvas.CopyRect(BufRct, Back.Canvas, BackRct);

 // выведем рисунок
 Form1.image1.canvas.Draw(x, y, bitmap);
end;

// завершение работы программы

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 // освободим память, выделенную
 // для хранения битовых образов
 Back.Free;
 bitmap.Free;
 Buf.Free;
end;

end.


 
hypnotize   (2007-01-20 23:31) [6]

2Delphi-Chainik
Access Violation at... Чото не работает твой код :(


 
hypnotize   (2007-01-20 23:31) [7]

Удалено модератором
Примечание: дубль


 
hypnotize   (2007-01-20 23:32) [8]

Млина, нужно тут защиту от дублей поставить, а то сделал двойной щелчок по кнопке и на те...


 
Palladin ©   (2007-01-20 23:50) [9]

а нечего делать двойные щелчки


 
hypnotize   (2007-01-22 00:49) [10]

up
Ну что, ниужели ни у кого нету идей?


 
hypnotize   (2007-01-22 11:54) [11]

up Ж(((((


 
Darvin ©   (2007-01-22 15:31) [12]

рисуй на невидимой канве, а затем ее выводи целиком с помощью CopyRect


 
Юрий_К   (2007-01-22 18:19) [13]

bmp := TBitmap.Create;
//рисуешь в этот bmp что нужно, далее
Image.Picture.Bitmap.Assign(bmp);


 
hypnotize   (2007-01-22 20:16) [14]

Ок пробую, возникает сразу Два встречных вопроса:

1) Как рисовать один Bitmap на другом с Transperent?
2) Почему в данном коде вылазит ошибка: "Canvas does not allow drawing".

 private
   moto: TCanvas;

...

procedure TGame.FormCreate(Sender: TObject);
begin
Moto := TCanvas.Create;
end;

procedure TGame.FormDestroy(Sender: TObject);
begin
Moto.Free;
end;

...

procedure TGame.TimerTimer(Sender: TObject);
begin
tl := tl - round(speed*1.25); // Двигаем BackGround
if tl < -640 then tl:=0;
Moto.Draw(tl,0,bg); // Рисуем BackGround ---> Тут вылазит "Canvas does not allow drawing".Moto.Draw(gl,240,gnom); // Рисуем Песонажа ---> И тут тоже.

Game.Canvas.CopyRect(rect(0,0,640,370),Moto,rect(0,0,640,370)); // Выводим на экран канву.

end;


 
hypnotize   (2007-01-22 20:45) [15]

С ошибкой разобрался, вопрос про рисование на канве с трансперентом еще открыт.


 
Юрий_К   (2007-01-22 22:07) [16]

Канвас сам по себе вроду не позволяет рисовать. Создай Битмап  хотя бы и пользуй его канвас. И не забудь задать размеры битмапа, тогда канвас будет при деле уже в пределах заданных размеров. А сам по себе канвас ничто для отрисовки, полагаю.


 
ЮЮ ©   (2007-01-23 10:22) [17]

Предлагая взять TImage32 из библиотеки Graphics32, подерживающий "многослойность" графических примитивов внутри одного компонента. Поддерживает не только транспарентность, но и альфа-канал.


 
hypnotize   (2007-01-23 23:13) [18]

2Юрий_К
Всё, со всем разобрался, если кому интересно, то нужно было просто рисовать всю графику на канве одного Imag"а (не формы!), чтобы рисовалось с трансперентом, нужно в свойствах спрайта (тобиш BitMap"а)  который собрались рисовать написать при создании:
moped := TBitmap.Create;
moped.Transparent := True;


2ЮЮ
Если понадобится рисовать с альфаканалом, то буду смотреть g32, а пока нету смысла :)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.05 c
3-1166640163
The X
2006-12-20 21:42
2007.03.18
"Table is busy" при попытке добавить новое поле через запрос.


6-1159773492
MZUser
2006-10-02 11:18
2007.03.18
Выполнение PHP скрипта в WebBrowser


2-1172663875
tan
2007-02-28 14:57
2007.03.18
Работа с OpenOffice.


15-1172180926
IMHO
2007-02-23 00:48
2007.03.18
Еврокубковое позорище


9-1145623480
KiberKot
2006-04-21 16:44
2007.03.18
Анимация





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский