Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

мигание спрайтов [D6, Win2k]


Страницы:   1 2

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]

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо