![]() |
|
|
#1
|
|||
|
|||
|
Нашел пример, то что мне нужно, но не знаю как избавиться от мерцания в анимации(( Подскажите как?Если ставить значение таймера низким то это очень заметно(
Вот код: Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (pig1=false) and (pig2=false) and (pig3=false) and
(pig4=false) and (pig5=false) and (pig6=false) and
(pig7=false) then
begin
image1.Picture.LoadFromFile('1.jpg');
pig1:=true;
end
else
if (pig1=true) and (pig2=false) and (pig3=false) and
(pig4=false) and (pig5=false) and (pig6=false) and
(pig7=false) then
begin
image1.Picture.LoadFromFile('2.jpg');
pig1:=false;
pig2:=true;
end |
|
#2
|
||||
|
||||
|
1. Заведите приватный массив:
Код:
Jpg: Array[0..1] of TJpegImage; Код:
Jpg[0] := TJpegImage.Create;
Jpg[0].LoadFromFile('1.JPG');
Jpg[1] := TJpegImage.Create;
Jpg[1].LoadFromFile('2.JPG');Код:
if not pig1 and not pig2 and not pig3 and not pig4 and not pig5 and not pig6 and not pig7
then begin
image1.Picture.Assign(Jpg[0]);
pig1 := true;
end
else if pig1 and not pig2 and not pig3 and not pig4 and not pig5 and not pig6 and not pig7
then begin
image1.Picture.Assign(Jpg[1]);
pig1 := false;
pig2 := true;
end; |
|
#3
|
|||
|
|||
|
Вообще для анимации ни TImage, ни TTimer не подходят, я бы на твоем месте выбрал бы как минимум вместо TImage - TPaintBox, а вместо таймера использовал бы обычный цикл, вот пример данной реализации:
Код:
type
TPigs = array of TJpegImage; //проолжаю идею Страдальца)
TForm1 = class(TForm)
Button1: TButton; //кнопка старта и остановки анимации анимации
PaintBox1: TPaintBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FIsAnimation:boolean; //определяет, включена ли анимация
FAnimStopKadr:Integer; //время задержки кадра
FPigs:TPigs; // сами кадры
public
procedure UploadPigs; //загрузка кадров
procedure DestroyPigs; //выгрзука кадров
procedure StartAnimPigs; //запуск анимации
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FIsAnimation:=false; //при старте анимация отключена!
FAnimStopKadr:=100; //задержка кадра 100 мс
UploadPigs; //загружаем картинки
end;
procedure TForm1.StartAnimPigs;
var
b:byte;
begin
b:=0;
while FIsAnimation do
begin
PaintBox1.Canvas.Draw(0,0,FPigs[b]);
Inc(b);
if b > High(FPigs) then b:=0;
Sleep(FAnimStopKadr);
Application.ProcessMessages;
if Application.Terminated then FIsAnimation:=false;
end;
end;
procedure TForm1.UploadPigs; //загрузка картинок в массив
var
b:byte;
begin
SetLength(FPigs, 5);
for b:=Low(FPigs) to High(FPigs) do
begin
FPigs[b]:=TJPEGImage.Create;
//файлы с картинками pig1.jpg, pig2.jpg и т. д..
FPigs[b].LoadFromFile(ExtractFilePath(Application.ExeName)+'pig'
+IntToStr(b+1)+'.jpg');
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FIsAnimation:=not FIsAnimation;
if FIsAnimation then StartAnimPigs;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FIsAnimation:=false;
Application.ProcessMessages;
DestroyPigs;
end;
procedure TForm1.DestroyPigs;
var
b:byte;
begin
for b:=Low(FPigs) to High(FPigs) do
FPigs[b].Destroy;
SetLength(FPigs, 0);
end;Проверил, все работает на ура) |
|
#4
|
||||
|
||||
|
Для одной свинки может и так, а вот если у вас будет стадо?
Тогда Sleep(FAnimStopKadr); будет все портить. |
|
#5
|
|||
|
|||
|
Для стада, нужен как минимум простейший движок) Как мне показалось, а у автора вопроса, такой цели небыло)
|
|
#6
|
|||
|
|||
|
Кстати, вместо функции Sleep, лучше использовать следующую:
Код:
procedure Delay(dwMilliseconds: Longint);
var
iStart, iStop: DWORD;
begin
iStart := GetTickCount;
repeat
iStop := GetTickCount;
Application.ProcessMessages;
until (iStop - iStart) >= DWORD(dwMilliseconds);
end;вызов соответственно, вместо Sleep(FAnimStopKadr); - Delay(FAnimStopKadr); лагов не будет) |
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
|||
|
|||
|
Спасибо вам, сейчас попробую. Страдалец, а что значит 4. Для формы включите DoubleBufered?? В свойствах формы не видел...
И еще TJpegImage это же не TImage? Последний раз редактировалось bleeep, 29.11.2009 в 23:17. |
|
#9
|
|||
|
|||
|
Цитата:
Интересно, и каков fps? 100 спрайтов через таймер) Покажешь свою высокотехнологичную разработку?) любопытно очень) сам с отрисовкой графики дааавно работаю. ![]() |
|
#10
|
|||
|
|||
|
Сделал как Страдалец, спасибо, работает на ура, а если будет картинок 20, то косяков не будет, и еще, что выполняет doble buffered?)
|
|
#11
|
||||
|
||||
|
Цитата:
Никакой там высокой технологичности нет, тупой вывод массива спрайтов на экран в нужной фазе. Доберусь до домашнего компа, выложу примерчик, а пока можете тут посмотреть вывод через таймер пузырей - идея таже самая, только не битмапы, а окружности. Последний раз редактировалось Страдалецъ, 30.11.2009 в 12:59. |
|
#12
|
||||
|
||||
|
А DoubleBufered делает одну весьма полезную вещь, вывод на форму идет не напрямую, для каждого компонента, а в промежуточный буфер памяти из которого уже потом все скопом выводится на форму. В результате форма отображается сразу уже в готовом виде.
|
|
#13
|
|||
|
|||
|
а почему именно форме присваивается данное свойство?а не image?
|
|
#14
|
|||
|
|||
|
Цитата:
Кстати, отрисовка стандартными средствами напрямую зависит от производительности процессора, интересно, на каком компьютере ты отрисовывал монстриков) |