Главная страница
    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.039 c
3-1166794185
Note
2006-12-22 16:29
2007.03.18
ODAC и COM


2-1172066624
Kolan
2007-02-21 17:03
2007.03.18
А AV в модуле rtl100.bpl что значит ?


3-1166370695
Jeeb
2006-12-17 18:51
2007.03.18
Проблема округления в DBGrid


15-1172029153
Slider007
2007-02-21 06:39
2007.03.18
С днем рождения ! 21 февраля


15-1172341546
vasIZmax
2007-02-24 21:25
2007.03.18
F.A.Q. от ламера...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский