Форум «Всё о Паскале» _ Написание игр _ Анимация в Паскале
Автор: LHx 3.07.2004 2:13
Я хочу сделать в игрухе постоянно (часто) обновляемый экран. Для этого меняю страницы. Изображение мелькает, раздваивается, а местами вообще исчезает. Как быть? (мне бы с игрухой до осени управиться, а то в башке засела - не вышибешь. Как заноза. ПОМОГИТЕ.)
Автор: NetAnton 3.07.2004 2:44
для анимации используют спрайты. подробнее о них поищи в Сети, а то я не особый спец в этом. возможно, кое где придется писать асмовые вставки и оптимизировать код.
Автор: GLuk 3.07.2004 14:14
Выложи код, поглядим...
Автор: trminator 3.07.2004 15:30
Экран моргает. 60 раз в секунду (стандартно для граф. режимов ДОС, AFAIK) изображения на экране нет. Нужно менять страницы как раз в этот момент.
Код
procedure WaitVerticalRetrace; begin while(port[$3da] and 8) = 0 do; end;
Приблизительный метод использования:
Код
чего-то рисуем на невидимой странице; WaitVerticalRetrace; Делаем активную страницу видимой
Поищи на osp.ru/pcworld статью "Основы спрайтовой анимации", если желаешь узнать про спрайты. Была в разделе "Компьютер дома" давненько, найти сейчас довольно сложно.
Автор: Altair 4.07.2004 17:16
Можно использовать переключение видеостраниц. Тогда вывод на экран будет мгновенным, и мелькание СОВСЕМ не будет заметно.
Алгоритм такой:
Код
i:=1; 1: setActivePage(i); {рисуем что надо...} setvisualPage(1); If i=1 then i:=0 else i:=1; goto1;
Только использовать GOTO не нужно Это я так просто. (не подумайте, что я его использую, да ни когда! ;) ) Только не все режимы поддерживают видеостраницы
Автор: GLuk 4.07.2004 18:21
Цитата(Oleg_Z @ 4.07.04 10:16)
Можно использовать переключение видеостраниц. Тогда вывод на экран будет мгновенным, и мелькание СОВСЕМ не будет заметно.
Алгоритм такой:
Код
i:=1; 1: setActivePage(i); {рисуем что надо...} setvisualPage(1); If i=1 then i:=0 else i:=1; goto1;
Только использовать GOTO не нужно Это я так просто. (не подумайте, что я его использую, да ни когда! ;) ) Только не все режимы поддерживают видеостраницы
Судя по сабжу он и так юзает переключение страниц, см. пост №1
Автор: Altair 4.07.2004 19:31
Ага, все ясно, точно, он использует переключение видеостраниц, только использует драйвер, не поддерживающий видеостраницы, только так можно объяснить дерганье!
Автор: LHx 6.07.2004 1:38
Мне больше нравится путь самурая oleg_7 . Какой драйвер поддерживает такую смену страниц? :p2:
Автор: Altair 6.07.2004 2:30
Прошу не путать, я не самурай, а извращенец! И еще я не Oleg 7 а Oleg_Z (Олег Зет! ) :P :P :D
Многостраничный вывод возможен только на EGA (256Кб), (S)VGA и Hercules.
Автор: LHx 7.07.2004 0:03
А vga-никак нельзя?? Ну вы в натуре извращенец, мистер Ааз.
Автор: BlackShadow 7.07.2004 15:52
Ну почему нельзя? Oleg_Z, ты же не думаешь, что максимальное кол-во видео страниц 8 - в текстовом 40x25??? Можно быть проще и, если чего-то не дают, то взять самому. Память у тебя оперативная установлена? Вот ей и воспользуйся. Если навернуть пару 32-битных команд, то копирование произвольного куска оперативки в видеобуфер производится в пару строчек и на приемлемой скорости, а, если не полениться и дождяться обратного хода луча (описано выше), то и не заметно будет...
Автор: LHx 7.07.2004 23:37
Вообще-то, я уже попробовал ega - заработало. :D Тем не менее, из вышеперечисленного нифига не понял и прошу объяснений.
Автор: BlackShadow 8.07.2004 18:03
Объясняю. Есть несколько очаровательнвх режимов, которые хранят изображение в видео буфере легко и просто - под пиксель по n бит. Есть режимы с "извратом" - там память "слоиться" и приносит кучу гемороя. Под "удобные" режимы можно организовать много-много видеостраниц следующим образом: 1). Выделяешь достаточный кусок памяти и говоришь (себе), что он теперь видеостраница. 2). Рисуешь чего-то прямо в нём, а не на экране. 3). Ждёшь обратного хода луча. 4). Процедуркой типа
, но тут надо проверить, чтобы размер буфера был менее 128K. Вот таким вот макаром и подставляешь свою "страничку" на место оригинальной.
Плюс: ты всегда работаешь с одними и теми же адресами. Минус: аппаратное перекидывание страниц всё-таки пошустрее (хотя это и не заметно). Резюме: при грамотном подходе у любого режима есть "BackBuffer".
З. Ы. : спасибо Oleg_Z за то, что подсказал, как оформить концовку поста
Автор: LHx 10.07.2004 0:14
Я бы с большой радостью все понял, но я исключительно бегинер и в ассемблере не шарю.
Автор: Altair 10.07.2004 0:21
LHx, сосредоточся на цели - ускорить вывод на экран. (постоянно меняющийся экран). Какое тебе нужно видео (разрешение и цветность) ? Все от этого зависит, если ты пойдешь на некоторый компромисс между графикой в игре и простотой программирования, то нужно использовать именно страницы!
Автор: SKVOZNJAK 10.07.2004 10:04
Или же выбрать компилятор помощнее и наплевать на всякие там страницы, а просто вовремя вставлять паузы
Begin ekran:=0; x:=100; y:=200; driver:=9; Mode:=1; initgraph( driver, mode , ''); setactivepage(ekran); setvisualpage(ekran); setfillstyle(1, green); bar(0,0, getmaxx, getmaxy); drawblad(x,y); repeat ekran:= ekran+1; ekran:= ekran mod 2; c:=readkey; setactivepage(ekran); case c of #0: case readkey of left : begin dec(x); clrscr; setfillstyle(1,green); bar(0,0,getmaxx, getmaxy); drawblad(x,y); end; right: begin inc(x); clrscr; setfillstyle(1,green); bar(0,0,getmaxx, getmaxy); drawblad(x,y); end; up : begin dec(y); clrscr; setfillstyle(1,green); bar(0,0,getmaxx, getmaxy); drawblad(x,y); end; down : begin inc(y); clrscr; setfillstyle(1,green); bar(0,0,getmaxx, getmaxy); drawblad(x,y); end; end; end; setvisualpage(ekran); until x=200; readln;
end.
Автор: volvo 23.12.2005 23:08
Ну, на данном этапе видеостраницы тебе только мешают... Переделай основной блок вот так, и мигание сильно уменьшится:
Begin x:=100; y:=200; driver:=9; Mode:=1; initgraph( driver, mode , ''); setfillstyle(1, green); bar(0,0, getmaxx, getmaxy); drawblad(x,y); repeat c := readkey; case c of #0: case readkey of left : dec(x); right: inc(x); up : dec(y); down : inc(y); end; end;
В таком случае тебе лучше будет перевести свою программу на TMT паскаль. Он и разрешения лучшие имеет, цветов поболее, и прога твоя запустится (можеть подправить придется чуть-чуть)
Автор: arhimag 24.12.2005 4:12
А если её перевести в фпс то ничего не измениться??
Автор: GoodWind 25.12.2005 18:00
можно и в FPC, как больше нравится
Автор: Gothic_Snake 25.12.2005 23:35
Цитата(arhimag @ 24.12.2005 3:12)
А если её перевести в фпс то ничего не измениться??
Ну тот и тот в принципе 32 разрядные... Но, как я знаю (а я могу ошибаться), в TMT, в отличии FPC, мошьная графическая библиотека, работающая со стандартами VESA и VESA2, а это высокое разрешение, TrueColor и доступные страницы памяти без никаких дополнительных действий с твоей стороны =)
Автор: ey 12.07.2008 22:49
Народ, вопрос по теме. Использовал раньше графический режим VGA 640 на 480... После чего узнал о визуальных страницах, в программе, где я увидел работу визуальных страниц, использовался режим EGA 640 на 350...(( когда я перевёл на VGA 640 на 480, экран начал дергаться. Пришлесь работать в EGA 640 на 350 (пиксели длинее в высоту чем в длину). Ну ничего, изхитрялся работать и так, НО сейчас мне нужно именно 640 на 480 и чтобы работали видеостраницы... Никто по этому поводу не может высказаться и выложить код?))
заранее спасибо
Автор: volvo 12.07.2008 23:05
Цитата
НО сейчас мне нужно именно 640 на 480 и чтобы работали видеостраницы
В режиме Graph 640*480 всего одна видеостраница, нулевая (больше не будет, потому что эта страница занимает 640*480/8 = 38400 байт в памяти видеоадаптера, что больше половины 64-килобайтного сегмента)... Так что переключать-то, собственно, нечего. Поэтому-то и использовался в том коде режим 640*350 (там уже 2 видеостраницы. Можешь использовать 640*200, там их вообще 4).
Автор: Гость 12.07.2008 23:28
Как в ФПС переключать видео страницы?
Автор: spectrum 10.10.2008 19:38
люди помогите плз. обясните чайнику как открыть файл из сообщения, если он в паскале длжен быть(прога есь)?
Автор: Lapp 14.10.2008 2:40
Цитата(spectrum @ 10.10.2008 15:38)
люди помогите плз. обясните чайнику как открыть файл из сообщения, если он в паскале длжен быть(прога есь)?