Форум: "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.008 c