Форум: "Игры";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
ВнизПомогите пожалуйста Найти похожие ветки
← →
Катя (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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c