Форум: "Основная";
Текущий архив: 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