Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.11.2009, 23:53
bleeep bleeep вне форума
Прохожий
 
Регистрация: 28.06.2009
Сообщения: 37
Репутация: 10
По умолчанию Мерцание

Нашел пример, то что мне нужно, но не знаю как избавиться от мерцания в анимации(( Подскажите как?Если ставить значение таймера низким то это очень заметно(
Вот код:
Код:
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  
Старый 29.11.2009, 00:31
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

1. Заведите приватный массив:
Код:
 Jpg: Array[0..1] of TJpegImage;
2. При создании формы заполните его:
Код:
 Jpg[0] := TJpegImage.Create;
 Jpg[0].LoadFromFile('1.JPG');
 Jpg[1] := TJpegImage.Create;
 Jpg[1].LoadFromFile('2.JPG');
3. В событии таймера делайте присвоение так:
Код:
 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;
4. Для формы включите DoubleBufered
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 29.11.2009, 19:32
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Вообще для анимации ни 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  
Старый 29.11.2009, 19:52
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Для одной свинки может и так, а вот если у вас будет стадо?
Тогда Sleep(FAnimStopKadr); будет все портить.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 29.11.2009, 20:09
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Для стада, нужен как минимум простейший движок) Как мне показалось, а у автора вопроса, такой цели небыло)
Ответить с цитированием
  #6  
Старый 29.11.2009, 20:46
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Кстати, вместо функции 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  
Старый 29.11.2009, 21:38
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Сообщение от Asinkrit
Для стада, нужен как минимум простейший движок) Как мне показалось, а у автора вопроса, такой цели небыло)
Да ладно, привыкли к движкам панимашь. У меня спокойно свыше 100 спрайтов одновременно отрисовываются без всяких движков, только через таймер стандартными средствами.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 29.11.2009, 23:13
bleeep bleeep вне форума
Прохожий
 
Регистрация: 28.06.2009
Сообщения: 37
Репутация: 10
По умолчанию

Спасибо вам, сейчас попробую. Страдалец, а что значит 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  
Старый 29.11.2009, 23:36
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Цитата:
Сообщение от Страдалецъ
Да ладно, привыкли к движкам панимашь. У меня спокойно свыше 100 спрайтов одновременно отрисовываются без всяких движков, только через таймер стандартными средствами.

Интересно, и каков fps? 100 спрайтов через таймер) Покажешь свою высокотехнологичную разработку?) любопытно очень) сам с отрисовкой графики дааавно работаю.
Ответить с цитированием
  #10  
Старый 29.11.2009, 23:42
bleeep bleeep вне форума
Прохожий
 
Регистрация: 28.06.2009
Сообщения: 37
Репутация: 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:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Интересно, и каков fps? 100 спрайтов через таймер) Покажешь свою высокотехнологичную разработку?) любопытно очень) сам с отрисовкой графики дааавно работаю.
А фиг его знает, какой он этот FPS. Я вижу, что на экране отрисовываются более 100 монстров и тормозов не заметно.
Никакой там высокой технологичности нет, тупой вывод массива спрайтов на экран в нужной фазе.
Доберусь до домашнего компа, выложу примерчик, а пока можете тут посмотреть вывод через таймер пузырей - идея таже самая, только не битмапы, а окружности.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 30.11.2009 в 12:59.
Ответить с цитированием
  #12  
Старый 30.11.2009, 12:53
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А DoubleBufered делает одну весьма полезную вещь, вывод на форму идет не напрямую, для каждого компонента, а в промежуточный буфер памяти из которого уже потом все скопом выводится на форму. В результате форма отображается сразу уже в готовом виде.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 30.11.2009, 16:44
bleeep bleeep вне форума
Прохожий
 
Регистрация: 28.06.2009
Сообщения: 37
Репутация: 10
По умолчанию

а почему именно форме присваивается данное свойство?а не image?
__________________
"I remember the good old days, when computers were
mainframes, analysts were magicians,and programmers
punced cards..."
Ответить с цитированием
  #14  
Старый 30.11.2009, 23:58
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Цитата:
Сообщение от Страдалецъ
А фиг его знает, какой он этот FPS. Я вижу, что на экране отрисовываются более 100 монстров и тормозов не заметно.
Никакой там высокой технологичности нет, тупой вывод массива спрайтов на экран в нужной фазе.
Доберусь до домашнего компа, выложу примерчик, а пока можете тут посмотреть вывод через таймер пузырей - идея таже самая, только не битмапы, а окружности.
Задачу с пузырями я уже видел) Подожду монстров, интересно очень)
Кстати, отрисовка стандартными средствами напрямую зависит от производительности процессора, интересно, на каком компьютере ты отрисовывал монстриков)
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:24.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025