Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.64 MB
Время: 0.036 c
14-7718
uw
2003-06-17 16:49
2003.07.03
Чудо на Садовом


3-7289
Stelius
2003-06-07 22:54
2003.07.03
По поводу сортировки


1-7389
VD601
2003-06-22 23:02
2003.07.03
Что означает строчка Result := E = 0; ?


14-7609
degatul
2003-06-18 17:06
2003.07.03
Литература


14-7601
XobBIT
2003-06-17 23:24
2003.07.03
Мастера подскажите аналог IIS или Apache





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский