![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите пожалуйста [Delphi, Windows]
Катя © (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 - мигает