Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2008, 20:56   #1
kripa
Новичок
Джуниор
 
Регистрация: 02.12.2008
Сообщений: 1
По умолчанию Анимация в Delphi

Народ, помогите. Суть проблемы такова: Необходимо заставить изображение (прямоугольный треугольник), нарисованное программой, совершать вращение (360 градусов) вокруг своего длинного катета. Уже всю голову сломал над этой анимацией (( Код рисования треугольника могу выслать на почту
kripa вне форума Ответить с цитированием
Старый 15.12.2008, 22:21   #2
Bamz
Пользователь
 
Аватар для Bamz
 
Регистрация: 04.12.2008
Сообщений: 12
По умолчанию

х.з. может это поможет те

В этом примере показано, как, объеденив классы Delphi 5 с функциями Win32 GDI, можно добиться анимации упрощенного избражения эльфа.

Исходные тексты можно взять здесь
Запустить пример.
Bamz вне форума Ответить с цитированием
Старый 15.12.2008, 22:23   #3
Bamz
Пользователь
 
Аватар для Bamz
 
Регистрация: 04.12.2008
Сообщений: 12
По умолчанию

Хых не поместилось в одно сообщение. вот код

Код:
unit MainFrm; 
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes,
Graphics, Controls, Forms, Dialogs, Menus, Stdctrls;
{$R SPRITES.RES } {Привязка растровых изображений к 
исполняемому файлу.}
type
TSprite = class
private
FWidth: integer;
FHeight: integer;
FLeft: integer;
FTop: integer;
FAndImage, FOrImage: TBitMap;
public
property Top: Integer read FTop write FTop;
property Left: Integer read FLeft write FLeft;
property Width: Integer read FWidth write FWidth;
property Height: Integer read FHeight write FHeight;
constructor Create;
destructor Destroy; override;
end;

TMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
BackGnd1, BackGnd2: TBitMap;
Sprite: TSprite;
GoLeft, GoRight,GoUp,GoDown: boolean;
procedure MyIdleEvent(Sender: TObject;
var Done: Boolean);
procedure DrawSprite;
end;

const
BackGround = 'BACK2.BMP';
var

MainForm: TMainForm;

implementation

{$R *.DFM} 
constructor TSprite.Create;
begin
inherited Create;
{ Создание растров для хранения изображений эльфа,
которые будут использованы при выполнении операции 
AND/OR (И/ИЛИ) для содания анимации }
FAndImage := TBitMap.Create;
FAndImage.LoadFromResourceName(hInstance, 'AND');

FOrImage := TBitMap.Create;
FOrImage.LoadFromResourceName(hInstance, 'OR'); 

Left := 0;
Top := 0;
Height := FAndImage.Height;
Width := FAndImage.Width;
end; 

destructor TSprite.Destroy;
begin
FAndImage.Free;
FOrImage.Free;
inherited Destroy;
end;


procedure TMainForm.FormCreate(Sender: TObject);
begin
// Создание исходного фонового изображения
BackGnd1 := TBitMap.Create;
with BackGnd1 do
begin
LoadFromResourceName(hInstance, 'BACK');
Parent := nil;
SetBounds(0, 0, Width, Height);
end; 

// Создание копии фонового изображения
BackGnd2 := TBitMap.Create;
BackGnd2.Assign(BackGnd1);

// Создание изображения эльфа
Sprite := TSprite.Create;

// Инициализация переменных направления
GoRight := true;
GoDown := true;
GoLeft := false;
GoUp := false;

{ Установка события приложения OnIdle равным значению
MyIdleEvent, с которого начнется движение эльфа }
Application.OnIdle := MyIdleEvent;
// Установка высоты и ширины области клиента формы
ClientWidth := BackGnd1.Width;
ClientHeight := BackGnd1.Height;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
// Освобождение всех объектов, созданных в конструкторе
формы FormCreate()
BackGnd1.Free;
BackGnd2.Free;
Sprite.Free;
end;

procedure TMainForm.MyIdleEvent(Sender: TObject;
var Done: Boolean);
begin
DrawSprite;
{ Разрешение вызова события OnIdle даже при отсутствии
сообщений в очереди сообщений приложения }
Done := False;
end;

procedure TMainForm.DrawSprite;
var
OldBounds: TRect;
begin

// Сохранение границ эльфа в объекте OldBounds
with OldBounds do
begin
Left := Sprite.Left;
Top := Sprite.Top;
Right := Sprite.Width;
Bottom := Sprite.Height;
end;
Bamz вне форума Ответить с цитированием
Старый 15.12.2008, 22:23   #4
Bamz
Пользователь
 
Аватар для Bamz
 
Регистрация: 04.12.2008
Сообщений: 12
По умолчанию

Блин не вмещаетсо вторая часть.

Код:
{ Теперь изменяем границы эльфа, чтобы он двигался в одном
направлении, или изменяем направление при
соприкосновении с границами формы }
with Sprite do
begin
if GoLeft then
if Left > 0 then
Left := Left - 1
else begin
GoLeft := false;
GoRight := true;
end;

if GoDown then
if (Top + Height) < self.ClientHeight then
Top := Top + 1
else begin
GoDown := false;
GoUp := true;
end;

if GoUp then
if Top > 0 then
Top := Top - 1
else begin
GoUp := false;
GoDown := true;
end;

if GoRight then
if (Left + Width) < self.ClientWidth then
Left := Left + 1
else begin
GoRight := false;
GoLeft := true;
end;
end;
{ Стираем исходное изображение эльфа на фоне BackGnd2
путем копирования прямоугольника из фона BackGnd1 }
with OldBounds do
BitBlt(BackGnd2.Canvas.Handle, Left, Top, Right, Bottom,
BackGnd1.Canvas.Handle, Left, Top, SrcCopy);
{ Теперь рисуем эльфа на "внеэкранном" растре, тем самым
избавлясь от мерцания }
with Sprite do
begin
{ Создадим черное пятно с силуэтом эльфа с помощью
операции логического И, выполненной над растрами
FAndImage и BackGnd2 }
BitBlt(BackGnd2.Canvas.Handle, Left, Top, Width, Height,
FAndImage.Canvas.Handle, 0, 0, SrcAnd);
// Выполним заливку черного пятна исходными цветами эльфа 
BitBlt(BackGnd2.Canvas.Handle, Left, Top, Width, Height,
FOrImage.Canvas.Handle, 0, 0, SrcPaint);
end;
{ Копируем эльфа в его новой позиции на канву формы.
При этом используется прямоугольник, который немного
больше, чем нужно для фигуры эльфа. Тем самым мы
добиваемся эффективного стирания эльфа путем его
перезаписи, после чего рисуем нового эльфа в новой
позиции с помощью доного вызова функции BitBlt } 
with OldBounds do
BitBlt(Canvas.Handle, Left-2, Top-2, Right+2, Bottom+2,
BackGnd2.Canvas.Handle, Left-2, Top-2, SrcCopy);
end;
procedure TMainForm.FormPaint(Sender: TObject);
begin
// Рисуем фоновой изображение при закрашивании формы 
BitBlt(Canvas.Handle, 0, 0, ClientWidth, ClientHeight,
BackGnd1.Canvas.Handle, 0, 0, SrcCopy);
end;

end.
Bamz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анимация, Delphi xMass Помощь студентам 9 21.06.2009 18:17
Анимация Delphi elta Помощь студентам 20 21.06.2009 16:55
анимация в DELPHI Илья500 Помощь студентам 6 25.11.2008 21:35
Анимация в Delphi yulia Помощь студентам 7 29.11.2007 16:55
Анимация в Delphi kipish Общие вопросы Delphi 14 03.01.2007 08:31