Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Реализация анимации без мерцания

Delphi , Графика и Игры , Графика

Реализация анимации без мерцания

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
 You will need an image, called ImageSprite, containing a sprite bitmap with 
 black as the background (the transparent part). You will also need an image, 
 called ImageMask, containing a black silouette of the sprite with white as the 
 background and an Image called ImageBackground containing the background 
 image. All these images are set to visible := false. Image1 is the image you 
 will see and is the same size as the background image. 
}

 // Global variables 
var
   Form1: TForm1;
   x, y, xvel, yvel, xold, yold: integer;

 implementation

 {$R *.dfm}

 procedure TForm1.Button1Click(Sender: TObject);
 var
   ARect: TRect; // Destination/Source rectangles 
begin
   // Initialize sprites position/velocity 
  x := 0;
   y := 0;
   xvel := 2;
    yvel := 2;
   xold := 0;
    yold := 0;

   // copy background to the image 
  ARect := Rect(0, 0, ImageBackground.Width, ImageBackground.Height);
   with Image1.Canvas do
    begin
     CopyMode := cmSrcCopy;
     CopyRect(ARect, ImageBackground.Canvas, ARect);
   end;

   // start animation 
  Timer1.Enabled := True;
 end;

 procedure TForm1.Timer1Timer(Sender: TObject);
 var
   Dest, Sour: TRect; // Destination/Source rectangles 
begin
   // Erase sprite from old position 
  Sour := Rect(xold, yold, xold + ImageMask.Width, yold + ImageMask.Height);
   with Image1.Canvas do
    begin
     CopyMode := cmSrcCopy;
     CopyRect(Sour, ImageBackground.Canvas, Sour);
   end;

   // Draw new sprite 
  Sour := Rect(0, 0, ImageMask.Width, ImageMask.Height);
   Dest := Rect(x, y, x + ImageMask.Width, y + ImageMask.Height);
   with Image1.Canvas do
    begin
     // Place mask onto image 
    CopyMode := cmSrcAnd;
     CopyRect(Dest, ImageMask.Canvas, Sour);
     // Place sprite into mask 
    CopyMode := cmSrcPaint;
     CopyRect(Dest, ImageSprite.Canvas, Sour);
   end;

   { 
   if multiple sprites are being used, then erase them all before drawing them 
   all. Do not erase and draw each sprite in turn 
  }

   // store sprites old position before updating 
  xold := x;
   yold := y;

   // Update sprites position (equations to describe movement of sprite) 
  Inc(x, xvel);
   Inc(y, yvel);
   if x >= ImageBackground.Width then x := -ImageMask.Width;
   if y >= ImageBackground.Height then y := -ImageMask.Height;
 end;

Перевод контента на русский язык:

Приведенный код Delphi - это простая реализация анимации, которая перемещает изображение по экрану без мерцания. Анимация заключается в рисовании изображения в различных позициях на форме и обновлении его положения на основе скорости.

Распределение кода:

  1. Инициализация: Процедура Button1Click инициализирует положение спрайта и его скорость, устанавливает прямоугольники назначения/источника для копирования изображений и включает таймер.
  2. Петля анимации: Процедура Timer1Timer выполняется в регулярных интервалах (определенных свойством интервал таймера) и выполняет следующие шаги:
  3. Удаляет спрайт из его старой позиции, копируя фоновое изображение над ним.
  4. Рисует спрайт в его новой позиции, комбинируя маску изображения с изображением спрайта. Это делается с помощью режимов копирования cmSrcAnd и cmSrcPaint.
  5. Хранит текущее положение спрайта перед обновлением, чтобы предотвратить мерцание.
  6. Обновляет положение спрайта на основе его скорости и проверки границ (чтобы предотвратить движение за пределы экрана).

Код использует три изображения: ImageBackground, ImageMask и ImageSprite. ImageBackground - фоновое изображение, которое заполняет форму. ImageMask - черная силуэтка спрайта с белым фоном, которая будет использоваться для маскирования нежелательных частей изображения спрайта при рисовании его на форме. ImageSprite содержит фактическое битовое изображение спрайта.

Код также использует два глобальных переменных: x, y, xvel и yvel. Эти переменные представляют собой координаты x и y спрайта, а также его горизонтальную и вертикальную скорости соответственно.

Некоторые предложения по улучшению кода:

  1. Вместо использования Timer1.Enabled := True для запуска петли анимации,consider создание отдельного потока или использование встроенной поддержки Delphi для многопоточности (например, TThread) для улучшения отзывчивости и предотвращения блокировки UI.
  2. Для получения более гладкой анимации можно использовать более сложное расчета движения, учитывающего скорость и ускорение спрайта.
  3. Рекомендуется добавить проверку границ, чтобы предотвратить движение спрайта за пределы экрана или за пределы видимой области формы.
  4. Если планируется добавление нескольких спрайтов, может быть более эффективно хранить их в массиве или списке и обновлять их положения, а не иметь отдельные процедуры для каждого спрайта.

В целом, это простая но эффективная реализация анимации без мерцания в Delphi.

В статье описывается реализация анимации без мерцания при помощи использования таймера и настройки параметров копирования канвасов в Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Графика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:13:04/0.0060968399047852/1