Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рисование движущегося прямоугольника [D7, WinXP]


Страницы:   1 2

Юра ©   (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;


Разжевал, в рот положил, тебе осталось проглотить ;-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо