Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.18;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
15-1171803256
nameless
2007-02-18 15:54
2007.03.18
Firewall


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


15-1171998979
@!!ex
2007-02-20 22:16
2007.03.18
Доклад на конференцию. Покритикуйте, плиз.


2-1172562572
Lonix
2007-02-27 10:49
2007.03.18
Вопрос по Memo


15-1171729161
ProgRAMmer Dimonych
2007-02-17 19:19
2007.03.18
Подскажите новичку