![]() |
|
#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 "I remember the good old days, when computers were mainframes, analysts were magicians,and programmers punced cards..." |
#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? "I remember the good old days, when computers were mainframes, analysts were magicians,and programmers punced cards..." Последний раз редактировалось bleeep, 29.11.2009 в 23:17. |
#9
|
|||
|
|||
![]() Цитата:
Интересно, и каков fps? 100 спрайтов через таймер) Покажешь свою высокотехнологичную разработку?) любопытно очень) сам с отрисовкой графики дааавно работаю. ![]() |
#10
|
|||
|
|||
![]() Сделал как Страдалец, спасибо, работает на ура, а если будет картинок 20, то косяков не будет, и еще, что выполняет doble buffered?)
"I remember the good old days, when computers were mainframes, analysts were magicians,and programmers punced cards..." |
#11
|
||||
|
||||
![]() Цитата:
Никакой там высокой технологичности нет, тупой вывод массива спрайтов на экран в нужной фазе. Доберусь до домашнего компа, выложу примерчик, а пока можете тут посмотреть вывод через таймер пузырей - идея таже самая, только не битмапы, а окружности. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 30.11.2009 в 12:59. |
#12
|
||||
|
||||
![]() А DoubleBufered делает одну весьма полезную вещь, вывод на форму идет не напрямую, для каждого компонента, а в промежуточный буфер памяти из которого уже потом все скопом выводится на форму. В результате форма отображается сразу уже в готовом виде.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#13
|
|||
|
|||
![]() а почему именно форме присваивается данное свойство?а не image?
"I remember the good old days, when computers were mainframes, analysts were magicians,and programmers punced cards..." |
#14
|
|||
|
|||
![]() Цитата:
Кстати, отрисовка стандартными средствами напрямую зависит от производительности процессора, интересно, на каком компьютере ты отрисовывал монстриков) |