Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.29;
Скачать: CL | DM;

Вниз

мигание спрайтов   Найти похожие ветки 

 
reticon ©   (2003-02-10 16:08) [0]

Здравствуйте Мастера-Дельфийцы.
Проблема у меня в следующем.
На форме имеется фон(спрайт_1, выведен в TImage), и фигура(спрайт_2, bmp-файл).
При нажатии мышкой на форму происходит сумасшедшее мигание последней, т.е. типа идет перерисовка Image.
Вывод спрайта осуществляю с помощью BitBlt, после чего делаю Image1.Repaint;
Это все делается в Image1.OnMouseDown.
Как избежать этого жуткого мерцания? Помогите пожалуйста.


 
Mirovodin ©   (2003-02-10 16:14) [1]

Буферизация изображения. Схема такова:

Организуем буфер TBitmap по размеру формы.
Все сначала все рисуем в буфер, потом одним BitBlt на Canvas формы.


 
reticon ©   (2003-02-10 16:22) [2]

А нужно ли для этого использовать маску?


 
Mirovodin ©   (2003-02-10 16:46) [3]

Это различные вещи.

Буфер - для предотвращения мерцания при выводе изобраджений.
Маска - для получения прозрачных областей и выводимом изображении, т.е. тех которые не нужно рисовать.


 
Mihey   (2003-02-10 21:50) [4]

На сайте есть хорошие примеры по быстрому выводу графики.


 
reticon ©   (2003-02-10 23:20) [5]

Вроде получилось, спасибо.
А если у меня этих спрайтов не 1 а 10?
Если делать так:

procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
begin
BitBlt(Buffer.Canvas.Handle,0,0,411,420,Field.Canvas.Handle,0,0,SRCCOPY);
BitBlt(Buffer.Canvas.Handle,CheckerX,CheckerY,50,50, Checker2.Canvas.Handle,0,0,SrcPaint);
BitBlt(Buffer.Canvas.Handle,CheckerX,CheckerY,50,50, Checker1.Canvas.Handle,0,0,SrcAnd);
for i:=0 to 10 do
begin
BitBlt (Form1.Canvas.Handle,0,0,411,420,Buffer.Canvas.Handle,0,0,SRCCOPY);
end;
end;


то нифига не получается, т.к. в буфер сохраняется все (фон и спрайты) - происходит копирование всего этого на канву 10 раз,
а мне нужно только 10 спрайтов-фишек


 
Mihey   (2003-02-10 23:26) [6]

Гн очень понятно, зачем десять раз копировать? У тебя есть некоторая область на форме, в которую ты будешь отображать. В нашем случае это канвас формы или TImage. Всё, что будет отображено, т.е. финальная картинка - содержится в буфере. Каждый тик таймера ты заполняешь буфер фоном, рисуешь далее сколь угодно спрайтов и здесь, если ты используешь BitBlt, тебе действительно понадобится маска. Когда ты всё нарисовал, то ты выводишь одной единственной функцией BitBlt весь буфер. Суть в том, чтобы выводить буфер один раз за тик таймера! Вывод на экран - самое медленное. Остальные операции происходят в памяти (иногда в видеопамяти!) и значительно быстрее.


 
reticon ©   (2003-02-11 00:43) [7]

2Mihey

.......
???
.......

Я тебя как-бы понимаю и как-бы нет.
Я ведь и вывожу ОДНОЙ ЕДИНСТВЕННОЙ БИТБЛТ, а так как цикл до 10, то и выводится соответственно это все 10 раз за ОДИН тик таймера.
Отсюда и ужасные :-( мерцания.
Или я неправильно секу фишку?


 
Mihey   (2003-02-11 15:02) [8]

Зачем тебе цикл от 1 до 10? Ты ведь одно и то же 10 раз рисуешь.


 
reticon ©   (2003-02-11 19:28) [9]

Мне нужно вывести на канву 10 одинаковых спрайтов (с разными координатами)


 
Mihey   (2003-02-11 22:14) [10]

Показываю на пальцах:

procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
begin
// Рисуем в буфере фон
BitBlt(Buffer.Canvas.Handle, 0, 0, 411, 420, Fon.Canvas.Handle, 0, 0, SRCCOPY);
// Рисуем десять спрайтов
for i := 0 to 10 do
begin
BitBlt (Buffer.Canvas.Handle, 0, 0, 411, 420, Sprite[i].Canvas.Handle, 0, 0, SRCCOPY);
end;
// Теперь выводим буфер на форму
BitBlt(Form1.Canvas.Handle, 0, 0, 411, 420, Buffer.Canvas.Handle, 0, 0, SRCCOPY);
end;


 
reticon ©   (2003-02-12 19:54) [11]

2Mihey

Может так:

var
Sprite: array[1..10] of TBitMap;

...

for i:=0 to 10 do
begin
Sprite[i]:=TBitmap.Create;
Sprite[i].LoadFromFile("SomeSprite.bmp")
??????????

А где в таком случае необходимо объявлять переменную Sprite?


 
Mihey   (2003-02-12 21:42) [12]

2 Reticon:

Ну где угодно объявлять. Спрайты ты ведь загружаешь до их вывода, а значит нужно использовтаь глобалюную переменную, глобальный массив.


 
reticon ©   (2003-02-13 20:14) [13]

После "показанного на пальцах" лезет шняга типа "Access violation"/


 
reticon ©   (2003-02-13 20:14) [14]

2Mihey

После "показанного на пальцах" лезет шняга типа "Access violation"/


 
Mihey   (2003-02-13 21:50) [15]

2 Reticon:

Может ещё и программку за тебя написать? Показан принцип. Принцип для того, чтобы не использовтаь словесный алгоритм. А уже тебе менять его и подстраивать под себя. Ты что, не можешь нарисовать в буфере фон, вывести 10 спрайтов в буфер и затем нарисовать буфер на форме?

Далее, про ошибку. Используется десять спрайтов TBitMap и буфер. Но ведь надо их где-то создавать и загружать? Показан же только обработчик таймера. При загрузке формы надо написать:

Buffer := TBitMap.Create;
Buffer.Width := 500;
Buffer.Height := 500;

И аналогично загрузить спрайты. Только потом их можно использовтаь. Но ведь это элементарно, почему надо так досконально всё объяснять?


 
reticon ©   (2003-02-13 23:41) [16]

2Mihey

Ну да ладно тебе, не ругайся.
Все я прекрасно понимаю, что до чего нужно объявлять,
просто...ну эта аксес виолэйшн... меня всегда раздражала.
Спасибо за помощь ;)


 
Dunkan ©   (2003-02-14 15:14) [17]

reticon, если получилось, дай пожалуйста пример, ок???


 
reticon ©   (2003-02-14 16:18) [18]

2Dunkan

Как допишу - скину на мыло


 
reticon ©   (2003-02-14 22:44) [19]

2Mihey

код работает, но еще такой вопрос:

При перемещении формы по экрану перемещение происходит с торможением. Выяснилось, что это из-за интервала таймера - причем чем меньше интервал, тем сильнее тормозит. Но если интервал делать больше, то медленней происходит перерисовка формы.
Закономерность какая-то :)
С этим можно как нибудь бороться?


 
Mihey   (2003-02-14 23:28) [20]

Собственно говоря, не думаю. Ведь когда WinAmp 2 перетаскиваешь, то эквалайзер останавливается. Я посоветую две вещи - отключать перерисовку при перемещении или другой вариант, лучше - это делать перемещение формы ввиде пунктирной линии, т.е. такая рамка перетаскивается, а потом туда форма перемещается.

Я точно не помню, как это делалось, но если надо, то порыскаю.


 
reticon ©   (2003-02-15 00:30) [21]

Mihey, мона тебе на мыло скинуть код для анализа?


 
Mihey   (2003-02-15 18:15) [22]

Давай, кидай.



Страницы: 1 вся ветка

Текущий архив: 2003.05.29;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
8-94976
Сашок
2003-02-12 16:06
2003.05.29
Как найти остальные точки?


8-94971
reticon
2003-02-10 16:08
2003.05.29
мигание спрайтов


1-94898
Yakudza
2003-05-16 13:24
2003.05.29
Проверка полей в компоненте


14-95063
Nox
2003-05-09 14:13
2003.05.29
Управление момедом.


4-95164
LyzD
2003-03-30 17:01
2003.05.29
Добавить свою кнопку в заголовок окна...