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

Вниз

мерцание экрана при передвижении объектов   Найти похожие ветки 

 
Марина   (2003-04-23 15:48) [0]

Здравствуйте!
У меня возникла следующая проблема: при передвижении графических
объектов по фону возникает неприятное мерцание.
Если задать передвикающиеся объекты типом TImage, то мерцают
они сами, если организовать их в качестве экземпляров типа ТBitmap и перерисовывать
каждый раз фон (в нем достаточно сложная картинка),то начинают
мигать и передвигающиеся объекты и фон. Не помогает и подражание
двустраничному режиму, когда передвигающиеся объекты рисуются сначала на "невидимом" фоне, а затем вместе с ним выводятся на экран. Возможно, кто-то уже с этим сталкивался...Пожалуйста, подскажите, как же можно справиться с мерцанием. Заранее
благодарна.


 
Skier   (2003-04-23 15:55) [1]

TForm.DoubleBuffered := True;


 
Марина   (2003-04-23 16:19) [2]

Не помогает :(


 
Skier   (2003-04-23 16:28) [3]

LockWindowUpdate ?


 
Марина   (2003-04-23 16:35) [4]

К сожалению не поняла (это моя 1-я прога) Объясните пожалуйста


 
Skier   (2003-04-23 16:54) [5]

Код покажи...как делаешь...


 
Марина   (2003-04-23 17:08) [6]

unit ObjectFi;
Interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, jpeg, ExtCtrls;
type
tdd=record
dir:byte; pos:array[1..2] of byte;
aged:byte;
die:boolean;
calv:boolean;
end;
TFishes=class
x,y,dx,dy,size:integer;
speed:boolean;
smile:byte;
oblichie:Timage;
constructor Create(nx,ny,ndx,ndy:integer);
function Getx:integer; overload; virtual;
function Gety:integer; overload; Virtual;
function Getfutposx:integer; overload; Virtual;
function Getfutposy:integer; overload; Virtual;
function Getsize:integer; overload; Virtual;
destructor Done; overload; Virtual;
procedure MoveTo;overload; Virtual;
end;
TSmallK=class(TFishes)
constructor Create(nx,ny,ndx,ndy:integer);
procedure BeEaten; overload; Virtual;
procedure Whatdo(news:tdd);
end;
TKarasM=class(TSmallK)
constructor create(nx,ny,ndx,ndy:integer);
procedure Death;
procedure Whatdo(news:tdd);
end;
TKarasW=class(TKarasM)
constructor Create(nx,ny,ndx,ndy:integer);
procedure PutCaviar;
procedure Whatdo(news:tdd);
end;
TSmallSh=class(TFishes)
constructor Create(nx,ny,ndx,ndy:integer);
procedure WaitForKill;
procedure Whatdo(news:tdd);
end;
TShyukaM=class(TSmallSh)
constructor create(nx,ny,ndx,ndy:integer);
procedure Death;
procedure Whatdo(news:tdd);
end;
TShyukaW=class(TShyukaM)
constructor create(nx,ny,ndx,ndy:integer);
procedure PutCaviar;
( news:tdd) unit ObjectFi;
Interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, jpeg, ExtCtrls;
type
tdd=record
dir:byte; pos:array[1..2] of byte;
aged:byte;
die:boolean;
calv:boolean;
end;
TFishes=class
x,y,dx,dy,size:integer;
speed:boolean;
smile:byte;
oblichie:Timage;
constructor Create(nx,ny,ndx,ndy:integer);
function Getx:integer; overload; virtual;
function Gety:integer; overload; Virtual;
function Getfutposx:integer; overload; Virtual;
function Getfutposy:integer; overload; Virtual;
function Getsize:integer; overload; Virtual;
destructor Done; overload; Virtual;
procedure MoveTo;overload; Virtual;
end;
TSmallK=class(TFishes)
constructor Create(nx,ny,ndx,ndy:integer);
procedure BeEaten; overload; Virtual;
procedure Whatdo(news:tdd);
end;
TKarasM=class(TSmallK)
constructor create(nx,ny,ndx,ndy:integer);
procedure Death;
procedure Whatdo(news:tdd);
end;
TKarasW=class(TKarasM)
constructor Create(nx,ny,ndx,ndy:integer);
procedure PutCaviar;
procedure Whatdo(news:tdd);
end;
TSmallSh=class(TFishes)
constructor Create(nx,ny,ndx,ndy:integer);
procedure WaitForKill;
procedure Whatdo(news:tdd);
end;
TShyukaM=class(TSmallSh)
constructor create(nx,ny,ndx,ndy:integer);
procedure Death;
procedure Whatdo(news:tdd);
end;
TShyukaW=class(TShyukaM)
constructor create(nx,ny,ndx,ndy:integer);
procedure PutCaviar;
procedure Whatdo(news:tdd);
end;



 
Марина   (2003-04-23 17:09) [7]

2-я часть кода
*************
Implementation
uses Unit3;
constructor TFishes.Create(nx,ny,ndx,ndy:integer);
begin Oblichie:=TImage.Create(Form3);
Oblichie.Parent:=Form3;
oblichie.left:=nx; oblichie.top:=ny;
oblichie.Transparent:=true;
oblichie.visible:=true;
end;
function TFishes.Getx:integer;
begin
getx:=x;
end;
function TFishes.Gety:integer;
begin
gety:=y;
end;
function TFishes.Getfutposx:integer;
begin
getfutposx:=oblichie.left+dx;
end;
function TFishes.Getfutposy:integer;
begin
getfutposy:=oblichie.top+dy;
end;
function Tfishes.Getsize:integer;
begin
getsize:=size;
end;
Destructor TFishes.Done;
begin
end;
Procedure TFishes.Moveto;
begin
Oblichie.left:=Oblichie.left+dx;
oblichie.top:=oblichie.top+dy;
end;
constructor TSmallK.Create(nx,ny,ndx,ndy:integer);
begin x:=nx; y:=ny; dx:=4*ndx; dy:=4*ndy; size:=1;
speed:=false;
oblichie.Width:=70; oblichie.height:=70;
oblichie.Picture.LoadFromFile("d:\c\!\karasL.bmp");
oblichie.Transparent:=true;
end;
procedure TSmallK.BeEaten;
begin
end;
procedure TSmallK.Whatdo(news:tdd);
begin
case news.dir of
1: moveto;
2: begin case news.aged of
1: begin dx:=dx-2*dx;

dy:=random(4);
if dy<>1 then dy:=dy-1
else dy:=dy-3;
end;

3: begin dx:=dx-2*dx;

dy:=random(4);
if dy<>1 then dy:=dy-1
else dy:=dy-3;
end;

2: begin dy:=dy-2*dy;
dx:=random(4);
if dx<>1 then dx:=dx-1
else dx:=dx-3;
end;

4: begin dy:=dy-2*dy;
dx:=random(4);
if dx<>1 then dx:=dx-1
else dx:=dx-3;
end;

end;
if news.aged<>0 then
if dx<0 then
oblichie.Picture.LoadFromFile("d:\c\!\karas.bmp")
else
oblichie.Picture.LoadFromFile("d:\c\!\karas2.bmp");

// if not speed then begin dx:=2*dx; dy:=2*dy;
// speed:=true; end;
moveto;
end;
3: begin if x<100 then dx:=random(2)+1
else dx:=random(2)-2;
if y<100 then dy:=random(2)+1
else dy:=random(2)-2;
if news.aged=2 then begin dx:=2*dx; dy:=2*dy; end;
moveto; speed:=false;
end;
4: BeEaten;
end;
end;
constructor TKarasM.Create(nx,ny,ndx,ndy:integer);
begin dx:=2*ndx; dy:=2*ndy; size:=2;

Oblichie:=TImage.Create(Form3);
Oblichie.Parent:=Form3;
oblichie.left:=nx; oblichie.top:=ny;
oblichie.Transparent:=true;
oblichie.visible:=true;
if dx<0 then
oblichie.Picture.LoadFromFile("D:\c\!\karas.bmp")
else
oblichie.Picture.LoadFromFile("D:\c\!\karas2.bmp");
oblichie.Width:=73; oblichie.height:=35;
end;
procedure TKarasM.Death;
begin
end;
procedure TKarasM.whatdo(news:tdd);
begin inherited whatdo(news);
if news.die then Death;
( nx,ny,ndx,ndy:integer) 2-я часть кода
*************
Implementation
uses Unit3;
constructor TFishes.Create(nx,ny,ndx,ndy:integer);
begin Oblichie:=TImage.Create(Form3);
Oblichie.Parent:=Form3;
oblichie.left:=nx; oblichie.top:=ny;
oblichie.Transparent:=true;
oblichie.visible:=true;
end;
function TFishes.Getx:integer;
begin
getx:=x;
end;
function TFishes.Gety:integer;
begin
gety:=y;
end;
function TFishes.Getfutposx:integer;
begin
getfutposx:=oblichie.left+dx;
end;
function TFishes.Getfutposy:integer;
begin
getfutposy:=oblichie.top+dy;
end;
function Tfishes.Getsize:integer;
begin
getsize:=size;
end;
Destructor TFishes.Done;
begin
end;
Procedure TFishes.Moveto;
begin
Oblichie.left:=Oblichie.left+dx;
oblichie.top:=oblichie.top+dy;
end;
constructor TSmallK.Create(nx,ny,ndx,ndy:integer);
begin x:=nx; y:=ny; dx:=4*ndx; dy:=4*ndy; size:=1;
speed:=false;
oblichie.Width:=70; oblichie.height:=70;
oblichie.Picture.LoadFromFile("d:\c\!\karasL.bmp");
oblichie.Transparent:=true;
end;
procedure TSmallK.BeEaten;
begin
end;
procedure TSmallK.Whatdo(news:tdd);
begin
case news.dir of
1: moveto;
2: begin case news.aged of
1: begin dx:=dx-2*dx;

dy:=random(4);
if dy<>1 then dy:=dy-1
else dy:=dy-3;
end;

3: begin dx:=dx-2*dx;

dy:=random(4);
if dy<>1 then dy:=dy-1
else dy:=dy-3;
end;

2: begin dy:=dy-2*dy;
dx:=random(4);
if dx<>1 then dx:=dx-1
else dx:=dx-3;
end;

4: begin dy:=dy-2*dy;
dx:=random(4);
if dx<>1 then dx:=dx-1
else dx:=dx-3;
end;

end;
if news.aged<>0 then
if dx<0 then
oblichie.Picture.LoadFromFile("d:\c\!\karas.bmp")
else
oblichie.Picture.LoadFromFile("d:\c\!\karas2.bmp");

// if not speed then begin dx:=2*dx; dy:=2*dy;
// speed:=true; end;
moveto;
end;
3: begin if x<100 then dx:=random(2)+1
else dx:=random(2)-2;
if y<100 then dy:=random(2)+1
else dy:=random(2)-2;
if news.aged=2 then begin dx:=2*dx; dy:=2*dy; end;
moveto; speed:=false;
end;
4: BeEaten;
end;
end;
constructor TKarasM.Create(nx,ny,ndx,ndy:integer);
begin dx:=2*ndx; dy:=2*ndy; size:=2;

Oblichie:=TImage.Create(Form3);
Oblichie.Parent:=Form3;
oblichie.left:=nx; oblichie.top:=ny;
oblichie.Transparent:=true;
oblichie.visible:=true;
if dx<0 then
oblichie.Picture.LoadFromFile("D:\c\!\karas.bmp")
else
oblichie.Picture.LoadFromFile("D:\c\!\karas2.bmp");
oblichie.Width:=73; oblichie.height:=35;
end;
procedure TKarasM.Death;
begin
end;
procedure TKarasM.whatdo(news:tdd);
begin inherited whatdo(news);
if news.die then Death;
end;
constructor TKarasW.create(nx,ny,ndx,ndy:integer);
begin inherited Create(nx,ny,ndx,ndy);
end;
procedure TKarasW.PutCaviar;
begin
end;


 
Марина   (2003-04-23 17:11) [8]

3-я часть
******

procedure TKarasW.whatdo(news:tdd);
begin inherited whatdo(news);
if news.calv then PutCaviar;
end;
constructor TSmallsh.Create(nx,ny,ndx,ndy:integer);
begin inherited create(nx,ny,ndx,ndy);
dx:=2*ndx; dy:=2*ndy; size:=1;
oblichie.Width:=90; oblichie.height:=70;
oblichie.Picture.LoadFromFile("d:\c\!\chukaL.bmp");

end;
procedure TSmallsh.WaitForKill;
begin
end;
procedure TSmallsh.Whatdo(news:tdd);
begin
case news.dir of
1: moveto;
2: begin case news.aged of
1: begin dx:=dx-2*dx;

dy:=random(4);
if dy<>1 then dy:=dy-1
else dy:=dy-3;
end;

3: begin dx:=dx-2*dx;

dy:=random(4);
if dy<>1 then dy:=dy-1
else dy:=dy-3;
end;

2: begin dy:=dy-2*dy;
dx:=random(4);
if dx<>1 then dx:=dx-1
else dx:=dx-3;
end;

4: begin dy:=dy-2*dy;
dx:=random(4);
if dx<>1 then dx:=dx-1
else dx:=dx-3;
end;

end;
if dx<0 then
oblichie.Picture.LoadFromFile("d:\c\!\chuka.bmp")
else
oblichie.Picture.LoadFromFile("d:\c\!\chuka2.bmp");

// if not speed then begin dx:=2*dx; dy:=2*dy;
// speed:=true; end;
moveto;
end;
3: begin if x<100 then dx:=(random(2)+1)
else dx:=(random(2)-2);
if y<100 then dy:=(random(2)+1)
else dy:=(random(2)-2);
if news.aged=2 then begin dx:=2*dx; dy:=2*dy; end
else begin dx:=3*dx; dy:=3*dy; end;
moveto; speed:=false;
end;
4: WaitForKill;
end;
end;
constructor TShyukaM.Create(nx,ny,ndx,ndy:integer);
begin
Oblichie:=TImage.Create(Form3);
Oblichie.Parent:=Form3;
oblichie.left:=nx; oblichie.top:=ny;
oblichie.Transparent:=true;
oblichie.visible:=true;
dx:=ndx; dy:=ndy; size:=2; speed:=false;
if dx<0 then
oblichie.Picture.LoadFromFile("d:\c\!\chuka.bmp")
else
oblichie.Picture.LoadFromFile("d:\c\!\chuka2.bmp");
oblichie.Width:=161; oblichie.height:=41;

end;
procedure TShyukaM.Death;
begin
end;
procedure TShyukaM.whatdo(news:tdd);
begin inherited whatdo(news);
if news.die then Death;
end;
constructor TShyukaW.Create(nx,ny,ndx,ndy:integer);
begin inherited create(nx,ny,ndx,ndy);
end;
procedure TShyukaW.PutCaviar;
begin
end;
procedure TShyukaW.whatdo(news:tdd);
( news) 3-я часть
******

procedure TKarasW.whatdo(news:tdd);
begin inherited whatdo(news);
if news.calv then PutCaviar;
end;
constructor TSmallsh.Create(nx,ny,ndx,ndy:integer);
begin inherited create(nx,ny,ndx,ndy);
dx:=2*ndx; dy:=2*ndy; size:=1;
oblichie.Width:=90; oblichie.height:=70;
oblichie.Picture.LoadFromFile("d:\c\!\chukaL.bmp");

end;
procedure TSmallsh.WaitForKill;
begin
end;
procedure TSmallsh.Whatdo(news:tdd);
begin
case news.dir of
1: moveto;
2: begin case news.aged of
1: begin dx:=dx-2*dx;

dy:=random(4);
if dy<>1 then dy:=dy-1
else dy:=dy-3;
end;

3: begin dx:=dx-2*dx;

dy:=random(4);
if dy<>1 then dy:=dy-1
else dy:=dy-3;
end;

2: begin dy:=dy-2*dy;
dx:=random(4);
if dx<>1 then dx:=dx-1
else dx:=dx-3;
end;

4: begin dy:=dy-2*dy;
dx:=random(4);
if dx<>1 then dx:=dx-1
else dx:=dx-3;
end;

end;
if dx<0 then
oblichie.Picture.LoadFromFile("d:\c\!\chuka.bmp")
else
oblichie.Picture.LoadFromFile("d:\c\!\chuka2.bmp");

// if not speed then begin dx:=2*dx; dy:=2*dy;
// speed:=true; end;
moveto;
end;
3: begin if x<100 then dx:=(random(2)+1)
else dx:=(random(2)-2);
if y<100 then dy:=(random(2)+1)
else dy:=(random(2)-2);
if news.aged=2 then begin dx:=2*dx; dy:=2*dy; end
else begin dx:=3*dx; dy:=3*dy; end;
moveto; speed:=false;
end;
4: WaitForKill;
end;
end;
constructor TShyukaM.Create(nx,ny,ndx,ndy:integer);
begin
Oblichie:=TImage.Create(Form3);
Oblichie.Parent:=Form3;
oblichie.left:=nx; oblichie.top:=ny;
oblichie.Transparent:=true;
oblichie.visible:=true;
dx:=ndx; dy:=ndy; size:=2; speed:=false;
if dx<0 then
oblichie.Picture.LoadFromFile("d:\c\!\chuka.bmp")
else
oblichie.Picture.LoadFromFile("d:\c\!\chuka2.bmp");
oblichie.Width:=161; oblichie.height:=41;

end;
procedure TShyukaM.Death;
begin
end;
procedure TShyukaM.whatdo(news:tdd);
begin inherited whatdo(news);
if news.die then Death;
end;
constructor TShyukaW.Create(nx,ny,ndx,ndy:integer);
begin inherited create(nx,ny,ndx,ndy);
end;
procedure TShyukaW.PutCaviar;
begin
end;
procedure TShyukaW.whatdo(news:tdd);
begin inherited whatdo(news);
if news.calv then PutCaviar;
end;
end.


 
Skier   (2003-04-23 17:23) [9]

Уговорила...Уговорила...:)))
Высылай мне по почте свою программу (вместе с bmp-файлами где рыбины нарисованы, только зазиповать все не забудь !).
Адрес в моей анкете...Попробую повозиться...время сегодня есть...


 
Карелин Артем   (2003-04-23 17:28) [10]

Когда я делал программу для верстки видео, мне очень понравился пакет http://www.g32.org/graphics32/index.html своей скоростью, отсутствием мерцания и некоторыми специфическими возможностями.


 
Плохой человек   (2003-04-23 21:32) [11]

Да, Graphic32 - очень мощная штука, альфа работает как родная. Именно способ вывода на невидимый буфер фона и картинок надо и развивать.


 
Сергей А   (2003-04-24 05:32) [12]

Можно попробовать такую фишку: перед рисованием поставить ---.enabled:=false, а после ---.enabled:=true


 
Плохой человек   (2003-04-24 22:44) [13]

>Можно попробовать такую фишку: перед рисованием поставить ---.enabled:=false, а после ---.enabled:=true

Неможно. Рисовать ндао всё правильно. Пользовтаься мощностью компьютера и с тем отсутсвием мерцания неправильно.


 
pasha676   (2003-04-25 09:51) [14]

Имхо - не надо пользоваться TImage как средством анимирования и перемещения картинок.



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

Форум: "Media";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.009 c
6-68437
tytus
2003-06-17 09:48
2003.08.21
Сетевая карта


14-68523
Calm
2003-08-05 11:22
2003.08.21
Можно ли воспользоваться ассеблером для вывода изображения?


14-68455
Pat
2003-08-02 23:17
2003.08.21
Ура!! Сегодня женился... :)


6-68435
Volly
2003-06-16 15:54
2003.08.21
Считывание данных из сервера


3-68167
Mypp
2003-07-29 09:46
2003.08.21
Хранимые процедуры





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