Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
4-95178
BuildeRR
2003-03-31 18:52
2003.05.29
чтение из едита


4-95161
caesar
2003-04-02 10:58
2003.05.29
SystemTray


14-95070
GOOD
2003-05-10 04:51
2003.05.29
web


1-94966
User
2003-05-18 12:16
2003.05.29
Any Key для консольного приложения


14-95066
Poma
2003-05-09 14:34
2003.05.29
Компоненты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский