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

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

Помогите пожалуйста [Delphi, Windows]


Страницы:   1 2

Катя ©   (2002-12-02 16:09:00) 

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

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


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

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


farhad   (2003-01-14 11:20:00) [2]

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


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

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


a3m   (2002-12-12 17:51:00) [4]

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

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

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

а затем:

procedure TForm1.NULL;
begin
end;

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


Mirovodin   (2002-12-04 15:01:00) [5]

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


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

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


Mirovodin   (2002-12-04 12:47:00) [7]

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

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


Док   (2002-12-04 12:41:00) [8]

2 Mirovodin :

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


Mirovodin   (2002-12-04 11:35:00) [9]

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

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


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

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


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

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

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

KAT9I@mail.ru


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

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


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

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


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

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

procedure TForm1.FormCreate(Sender: TObject);

....

brush.Style:=bsClear;

.....


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

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


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

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


Ev_genus   (2002-12-03 14:29:00) [17]

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

Удачи.


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

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


MBo   (2002-12-02 18:48:00) [19]

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


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

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


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 - мигает


Страницы:   1 2

Наверх

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