![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисование движущегося прямоугольника [D7, WinXP]
Юра © (2007-07-30 14:13:00)Задача: Создать движение прямоугольника.
Что сделал: Реализовал движение очень просто: стирание и рисование в новых координатах, однако при таком способе рисования происходит моргание изображения.
Вопрос: Как от него избавиться?
Jeer (2007-07-31 18:35:00) [1]
> Юра (31.07.07 13:56) [33]
То, что прямая - на самом деле не прямая, а ломанная и в процессе смещения/вращения меняется ее вид, что вполне может тобой (и не только) восприниматься как артефакт.
Юра (2007-07-31 13:56:00) [2]Jeer я в курсе и что?
Jeer (2007-07-31 13:37:00) [3]
> Юра (31.07.07 12:57) [30]
А ты в курсе, что на экране ты видишь оцифрованное изображение ?
{RASkov} (2007-07-31 12:58:00) [4]> [30] Юра (31.07.07 12:57)
Что за искажения? Покажи текущий твой код...
Юра (2007-07-31 12:57:00) [5]А почему все-таки при движении есть какие-то глюки уже не мерцание, а что-то не понятное, какое-то искажение изображения. Как это исправить?
{RASkov} (2007-07-31 12:47:00) [6]> [26] Юра (30.07.07 23:03)
> А как задать фон в Bitmap? (FloodFill не работает)
Меняй цвет кисти перед рисованием прямоугольника на нужный......
Юра (2007-07-31 12:25:00) [7]Позволяю ;)
Инс (2007-07-31 00:19:00) [8]
> Инс, попробовал предпоследний вариант, результат тот же...
Позволь тебе не поверить ;)
Юра (2007-07-30 23:03:00) [9]А как задать фон в Bitmap? (FloodFill не работает)
Юра (2007-07-30 22:41:00) [10]Работает вариант Дарвина ;)
Юра (2007-07-30 22:36:00) [11]Инс, попробовал предпоследний вариант, результат тот же...
Юра (2007-07-30 17:23:00) [12]Спасибо всем. :)
Инс (2007-07-30 16:27:00) [13]Вот еще механизм хороший для рисования движущегося изображения. Модифицируем не изображение, а систему координат. Правда для борьбы с мерцанием ничего не предусматривается, но если кому надо - подумает над этим.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
Angle: Single;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Angle:=Angle + 2;
Invalidate;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
p: XFORM;
begin
SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
p.eM11 := 1;
p.eM12 := 0;
p.eM21 := 0;
p.eM22 := 1;
p.eDx := -160;
p.eDy := -160;
SetWorldTransform(Canvas.Handle, p);
p.eM11 := sin(Angle*pi/180);
p.eM12 := cos(Angle*pi/180);
p.eM21 := -cos(Angle*pi/180);
p.eM22 := sin(Angle*pi/180);
p.eDx := 0;
p.eDy := 0;
ModifyWorldTransform(Canvas.Handle,p,MWT_RIGHTMULTIPLY);
p.eM11 := 1;
p.eM12 := 0;
p.eM21 := 0;
p.eM22 := 1;
p.eDx := 160;
p.eDy := 160;
ModifyWorldTransform(Canvas.Handle,p,MWT_RIGHTMULTIPLY);
Canvas.Rectangle(110,110,210,210);
end;
end.
Инс (2007-07-30 16:00:00) [14]В общем, все куда проще:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
x: Integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Inc(x);
if x > Width then
x:=0;
Invalidate;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Rectangle(x,10,x + 100,80);
end;
end.
DVM (2007-07-30 15:55:00) [15]
> Инс © (30.07.07 15:54) [19]
точно!
Инс (2007-07-30 15:54:00) [16]
> DVM © (30.07.07 15:51) [18]
Не, x не в FormPaint лучше инкрементировать, а в Timer1Timer. Мало ли из-за чего будет вызвана перерисовка.
DVM (2007-07-30 15:51:00) [17]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
Bmp: TBitmap;
x: integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Bmp := TBitmap.Create;
Bmp.Width := Width;
Bmp.Height := Height;
Bmp.PixelFormat := pf24bit;
x := 0;
Bmp.Canvas.Brush.Style := bsSolid;
Bmp.Canvas.Brush.Color := clWhite;
Bmp.Canvas.Pen.Color := clBlack;
DoubleBuffered := true;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Bmp.Free;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Bmp.Canvas.FillRect(rect(0, 0, bmp.Width, bmp.Height));
Bmp.Canvas.Rectangle(x, 0, x + 50, 50);
inc(x, 5);
if x > bmp.Width - 50 then x := 0;
Canvas.Draw(0, 0, Bmp);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Invalidate;
end;
end.
Инс (2007-07-30 15:25:00) [18]
> Он это делает только при сбытиях WM_PAINT (при перекрытии
> окна и т.д.), а когда он САМ ручками двигает прямоугольник,
> двойная буферизация не работает
Ты мой пост до конца дочитал? Я об этом говорю. А при перекрытии окна прямоугольник вообще сотрется, так как рисуется вне обработки WM_PAINT
Darvin (2007-07-30 15:23:00) [19]>Инс © (30.07.07 15:18) [14]
>DoubleBuffered именно так и делает: рисует сначала во временный битмап, >потом целиком его копирует
Он это делает только при сбытиях WM_PAINT (при перекрытии окна и т.д.), а когда он САМ ручками двигает прямоугольник, двойная буферизация не работает
Darvin (2007-07-30 15:19:00) [20]>Darvin, пожалуйста покажи код...
А сам, слабо?
var
Bitmap : TBitmap;
R : TRect;
begin
Bitmap := TBitmap.Create;
Bitmap.Height := Height;
Bitmap.Width := Width;
with Bitmap.Canvas do begin
...
end;
R.Left := 0;
R.Top := 0;
R.Right := Width;
R.Bottom := Height;
Canvas.CopyRect ( R, BitMap.Canvas, R );
end;
Разжевал, в рот положил, тебе осталось проглотить ;-)