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

Вниз

Помогите пожалуйста   Найти похожие ветки 

 
Катя   (2002-12-02 16:09) [0]

Заставили меня написать программу (игру) для универа. Все дело в том, что нужно использовать стандартный набор компонентов Delphi5, то есть DelphiX не пройдёт ;). Так вот, написала примитивную игру (как просили), в которой всё рисуется на form1.canvas с каждым тактом таймера. Как и следовало ожидать, происходит мигание графики. Где то я видела как можно это преодолеть, только вот где --- не помню. :(

Может кто знает и поможет ?


 
MBo ©   (2002-12-02 16:12) [1]

рисовать на bitmap, потом Bitblt его на canvas


 
Катя   (2002-12-02 16:17) [2]

> MBo:
Я не совсем поняла что вы посоветовали... прошу Вас, поподробнее?


 
Mirovodin ©   (2002-12-02 16:23) [3]

Организуем Buffer (TBitmap);

Процедура прорисковки всего добра выглядит след-м образом:

procedure TFrom1.UpdateFrame;
begin
...
Bitblt(Buffer.Canvas.Handle, ...); // Рисуем все что нужно в буфер
...
Bitblt(Buffer.Canvas.Handle, ...);
...
Bitblt(Self.Canvas.Handle, ...., Buffer.Canvas.Handle, .., SRCCOPY);
end;

Все Bitblt делаем на невидимый буфер Buffer а потом кидаем его на Canvas формы.


 
Axis_of_Evil ©   (2002-12-02 16:24) [4]

1)таймер, как TThread
2)см. help "BitBlt"

слушай MBo, он умный

Припиши тут свой mail, пришлю пример


 
MBo ©   (2002-12-02 16:28) [5]

Если, несмотря на пример Mirovodin, есть трудности в применении функции WinAPI BitBlt, можно воспользоваться методом Canvas.Draw(0,0,Bitmap)


 
Катя   (2002-12-02 16:32) [6]

Мой е-майл:KAT9I@mail.ru


 
Катя   (2002-12-02 16:34) [7]

Кстати я именно так и вывожу графику (Canvas.Draw(x,y,Bitmap)), всё равно мигает


 
Катя   (2002-12-02 16:58) [8]

Может всё же кто ни будь пример вышлет ;) Буду очень рада...

Мой е-майл:KAT9I@mail.ru


 
MBo ©   (2002-12-02 17:15) [9]

doublebuffered:=true еще для формы установи, но здесь это вряд ли повлияет.
Ты уловила, что нужно ВСЕ рисовать на одном битмапе, потом его копировать на форму?


 
Катя   (2002-12-02 17:50) [10]

Уловила :)
Не уловила только вот это

procedure TFrom1.UpdateFrame;
begin
...
Bitblt(Buffer.Canvas.Handle, ...); // Рисуем все что нужно в буфер
...
Bitblt(Buffer.Canvas.Handle, ...);
...
Bitblt(Self.Canvas.Handle, ...., Buffer.Canvas.Handle, .., SRCCOPY);
end;


 
MBo ©   (2002-12-02 17:54) [11]

это пример для случая, когда тебе нужно заполнить битмап (buffer) кусками других битмапов. Что именно неясно?
Опиши задачу чуть подробнее -что и как рисуешь.


 
Катя   (2002-12-02 18:05) [12]

вот к примеру...


unit Simpe_game;
interface
uses

. . .

var
bt:TBitmap;

. . .
procedure TForm1.FormCreate(Sender: TObject);
begin
doublebuffered:=true;
bt:=TBitmap.Create;
bt.TransparentColor:=rgb($FF,$FF,$FF);
bt.Transparent:=true;
bt.LoadFromFile(extractfiledir(Application.exename)+"\fon.bmp");
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
with form1.Canvas do begin
Draw(0,380,bt)
end;



вот вроде так... bt - мигает


 
MBo ©   (2002-12-02 18:48) [13]

У меня с этим кодом не мигает


 
Катя   (2002-12-02 20:33) [14]

странно :((((


 
Ev_genus ©   (2002-12-03 14:29) [15]

Мигает картинка из-за перерисовки формы. Форма перерисовывается фоновым цветом(серым по-умолчанию). Советую писать на WinAPI, создавая не перерисовывающееся окно. Либо запретить перерисовку формы(трудный и весьма непонятный метод). Примеры игровых программ написаных на WinAPI у меня под рукой нет. Поросите у коллег примерчик из книги М.Краснова. Мигать перестанет, но нужно будет много делать самостоятельно. Например кнопочки.
Способ 2. Подключить OpenGL32 и использовать процедуру SwapBuffers для перерисовки. Всё стандартно через Canvas. Не нужно применять никаких других приёмов OpenGL. Примеры есть во всё той же книге.

Удачи.


 
Shadow ©   (2002-12-03 15:25) [16]

Попробуй рисовать прямо на десктопе.


 
Катя   (2002-12-03 17:17) [17]

2 Shadow, что то ты нелепое сморозил...


 
Владимир Васильев ©   (2002-12-03 17:18) [18]

Если всю форму ты отрисовываешь самостояткльно и фон игры заполняет форму целиком - то можно легко избавиться от прорисовки фона формы

procedure TForm1.FormCreate(Sender: TObject);

....

brush.Style:=bsClear;

.....


 
Катя   (2002-12-03 17:30) [19]

неа, не работает.... мигает все равно...


 
Владимир Васильев ©   (2002-12-03 17:35) [20]

а какой интервал таймера?


 
Катя   (2002-12-03 20:03) [21]

60... но если ставишь 20 или даже 1 то все равно мигает ;(

Кто нить напишите примерчик плз.... мне на мыло... :)

KAT9I@mail.ru



 
Док ©   (2002-12-04 11:22) [22]

У меня тоже мигало в проге..... ДИАГНОЗ: медленный комп или СЛИШКОМ большое число объектов.


 
Mirovodin ©   (2002-12-04 11:35) [23]

Диагноз поставлен не правильно :) При использвании обычного TImageList и поверхности ~400x400 - 70-80fps без всякого мигания на Intel740. Пример работы в статье :

http://delphigfx.mastak.ru/2d/004/2d_4.htm


 
Док ©   (2002-12-04 12:41) [24]

2 Mirovodin :

ну... да. Вообще-то использование TImageList работа ускоряется. Но если его просто нельзя использовать? Что если у человека на форме 40 одинаковых объектов летают? Мигание будет...


 
Mirovodin ©   (2002-12-04 12:47) [25]

Если не нужен Transparen можно вообще без ImageList.
Грамотно пользоваться TBitmap и Bitblt - не будет мигания да же при большом количестве объектов, проверял не однократно. Всегда нужно использовать буфер и все будет Ok. У меня в пример было ~10x10=100 тайтлов + спрайты + курсор(спрайт). Все это рисовалось в один проход на буфер, а потом на форму. Никакого мигания.

Конечно если двигать TImage по форме, то мигания не избежать :)


 
Катя   (2002-12-04 14:44) [26]

плз, сорсы... :((


 
Mirovodin ©   (2002-12-04 15:01) [27]

http://delphigfx.mastak.ru/2d/001/2d_1.htm
http://delphigfx.mastak.ru/2d/004/2d_4.htm


 
a3m ©   (2002-12-12 17:51) [28]

Совершенно согласен с Ev_genus. Мигает все это отчасти из-за закрашивания всего этого в цвет формы. Бороться с этим надо перехватывая сообщение WM_EraseBkgnd:

в классе формы объявляем процедуру, которая будет отлавливать сообщение о закрашивании:

procedure NULL(var Message: TMessage); message WM_EraseBkgnd;

а затем:

procedure TForm1.NULL;
begin
end;

Потом со спокойной совестью рисуем на форме.


 
zavdim   (2002-12-13 07:15) [29]

У меня на Пне166ММХ - ничего не моргает, а про старшие модели и не говорю.
Использую как и пишут многие буфер, потом с буфера - кидаю на визибловую штуку - сейчас на форме PaintBox держу - в него и кидаю. Причем буферы организую так :
1. Есть визибловая поверхность.
2. Есть буфер.
3. Есть где рисую.
Пока рисую на визибл идет буфер. Отрисовал - бросаем на буфер. Пока идет прорисовка обращение к этой процедуре запрещаю - рисуй что есть, отрисовал - бросил, получил новый такт - рисую дальше.
Для переброски использую Canvas.Draw - хватает.


 
farhad ©   (2003-01-14 11:20) [30]

Так вот уважаемые у меня к вам такой вопрос:
Почему нельзя написать игру в среде Delphi5 и использованием DelphiX?
Если можно по конкретнее....


 
M4   (2003-01-22 07:57) [31]

Я думаю, что обновлять (перерисовывать) нужно не по таймеру, а когда приходит сообщение WM_PAINT. Попробуй, но ничего не обещаю =))



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

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

Наверх




Память: 0.54 MB
Время: 0.018 c
14-7670
vic_vm
2003-06-16 20:17
2003.07.03
Функция InternetGetConnectedState врет?


1-7448
BJValentine
2003-06-23 15:16
2003.07.03
Начальное значение переменной


4-7757
STAINER
2003-05-02 01:42
2003.07.03
НЕ МОГУ СОЗДАТЬ COM-ОБЬЕКТ ЧЕРЕЗ CREATECOMOBJECT


14-7643
kull
2003-06-15 15:27
2003.07.03
Количественные оценки качества кода...


6-7570
danka
2003-04-25 17:42
2003.07.03
idFTP и id HTTP