![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
мигание спрайтов [D6, Win2k]
reticon © (2003-02-10 16:08:00)Здравствуйте Мастера-Дельфийцы.
Проблема у меня в следующем.
На форме имеется фон(спрайт_1, выведен в TImage), и фигура(спрайт_2, bmp-файл).
При нажатии мышкой на форму происходит сумасшедшее мигание последней, т.е. типа идет перерисовка Image.
Вывод спрайта осуществляю с помощью BitBlt, после чего делаю Image1.Repaint;
Это все делается в Image1.OnMouseDown.
Как избежать этого жуткого мерцания? Помогите пожалуйста.
Mihey (2003-02-15 18:15:00) [1]Давай, кидай.
reticon (2003-02-15 00:30:00) [2]Mihey, мона тебе на мыло скинуть код для анализа?
Mihey (2003-02-14 23:28:00) [3]Собственно говоря, не думаю. Ведь когда WinAmp 2 перетаскиваешь, то эквалайзер останавливается. Я посоветую две вещи - отключать перерисовку при перемещении или другой вариант, лучше - это делать перемещение формы ввиде пунктирной линии, т.е. такая рамка перетаскивается, а потом туда форма перемещается.
Я точно не помню, как это делалось, но если надо, то порыскаю.
reticon (2003-02-14 22:44:00) [4]2Mihey
код работает, но еще такой вопрос:
При перемещении формы по экрану перемещение происходит с торможением. Выяснилось, что это из-за интервала таймера - причем чем меньше интервал, тем сильнее тормозит. Но если интервал делать больше, то медленней происходит перерисовка формы.
Закономерность какая-то :)
С этим можно как нибудь бороться?
reticon (2003-02-14 16:18:00) [5]2Dunkan
Как допишу - скину на мыло
Dunkan (2003-02-14 15:14:00) [6]reticon, если получилось, дай пожалуйста пример, ок???
reticon (2003-02-13 23:41:00) [7]2Mihey
Ну да ладно тебе, не ругайся.
Все я прекрасно понимаю, что до чего нужно объявлять,
просто...ну эта аксес виолэйшн... меня всегда раздражала.
Спасибо за помощь ;)
Mihey (2003-02-13 21:50:00) [8]2 Reticon:
Может ещё и программку за тебя написать? Показан принцип. Принцип для того, чтобы не использовтаь словесный алгоритм. А уже тебе менять его и подстраивать под себя. Ты что, не можешь нарисовать в буфере фон, вывести 10 спрайтов в буфер и затем нарисовать буфер на форме?
Далее, про ошибку. Используется десять спрайтов TBitMap и буфер. Но ведь надо их где-то создавать и загружать? Показан же только обработчик таймера. При загрузке формы надо написать:
Buffer := TBitMap.Create;
Buffer.Width := 500;
Buffer.Height := 500;
И аналогично загрузить спрайты. Только потом их можно использовтаь. Но ведь это элементарно, почему надо так досконально всё объяснять?
reticon (2003-02-13 20:14:00) [9]2Mihey
После "показанного на пальцах" лезет шняга типа "Access violation"/
reticon (2003-02-13 20:14:00) [10]После "показанного на пальцах" лезет шняга типа "Access violation"/
Mihey (2003-02-12 21:42:00) [11]2 Reticon:
Ну где угодно объявлять. Спрайты ты ведь загружаешь до их вывода, а значит нужно использовтаь глобалюную переменную, глобальный массив.
reticon (2003-02-12 19:54:00) [12]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-11 22:14:00) [13]Показываю на пальцах:
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-11 19:28:00) [14]Мне нужно вывести на канву 10 одинаковых спрайтов (с разными координатами)
Mihey (2003-02-11 15:02:00) [15]Зачем тебе цикл от 1 до 10? Ты ведь одно и то же 10 раз рисуешь.
reticon (2003-02-11 00:43:00) [16]2Mihey
.......
???
.......
Я тебя как-бы понимаю и как-бы нет.
Я ведь и вывожу ОДНОЙ ЕДИНСТВЕННОЙ БИТБЛТ, а так как цикл до 10, то и выводится соответственно это все 10 раз за ОДИН тик таймера.
Отсюда и ужасные :-( мерцания.
Или я неправильно секу фишку?
Mihey (2003-02-10 23:26:00) [17]Гн очень понятно, зачем десять раз копировать? У тебя есть некоторая область на форме, в которую ты будешь отображать. В нашем случае это канвас формы или TImage. Всё, что будет отображено, т.е. финальная картинка - содержится в буфере. Каждый тик таймера ты заполняешь буфер фоном, рисуешь далее сколь угодно спрайтов и здесь, если ты используешь BitBlt, тебе действительно понадобится маска. Когда ты всё нарисовал, то ты выводишь одной единственной функцией BitBlt весь буфер. Суть в том, чтобы выводить буфер один раз за тик таймера! Вывод на экран - самое медленное. Остальные операции происходят в памяти (иногда в видеопамяти!) и значительно быстрее.
reticon (2003-02-10 23:20:00) [18]Вроде получилось, спасибо.
А если у меня этих спрайтов не 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 21:50:00) [19]На сайте есть хорошие примеры по быстрому выводу графики.
Mirovodin (2003-02-10 16:46:00) [20]Это различные вещи.
Буфер - для предотвращения мерцания при выводе изобраджений.
Маска - для получения прозрачных областей и выводимом изображении, т.е. тех которые не нужно рисовать.