Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Graph

Автор: sheka 12.06.2009 21:21

я хочу сделать мультипликацию с помощью видеостраниц.
вопрос:
когда делаю вывод с помощью setactivepage,setvisualpage - после вывода второй страицы содержимое первой смещается куда-то вниз, а не исчезает.
а если делаю как прочитал в одной книге:

Код
procedure init;
var gd,gm:integer;
begin
gd:=detect;
initgraph(gd,gm,'');
if gd in [HercMono,EGA,EGA64,MCGA,VGA] then  / разница в наличии
  if gd<>HercMono then  SetGraphMode(gm-1);   \ этих строчек
end;

то изображение получается искаженным (вытянутым по вертикали).

почему? должно ли так быть?

Автор: volvo 12.06.2009 21:29

Вообще-то надо инициализировать режим, в котором больше одной видеостраницы. В режиме VgaHi страница всего одна, он не пойдет. Инициализируй графику так:

g_driver := VGA; g_mode := VGAMed;
InitGraph(g_driver, g_mode, '');
и учти, что разрешение = 640*350 при двух видеостраницах

Автор: sheka 13.06.2009 2:35

а три страницы нельзя?

Автор: Lapp 13.06.2009 3:30

Цитата(sheka @ 12.06.2009 23:35) *
а три страницы нельзя?
Нет)).
Наличие двух страниц дает принципиальную возможность подготовки данных для визуализации без мелькания. Это как бы необходимость. Две страницы позволяют обработать любую ситуацию. Три (четыре, пять..) - это уже типа для удобства. Это лишнее.

Автор: sheka 13.06.2009 3:54

то есть если мне надо больше, то просто заменять рисунок на предыдущей?

Автор: volvo 13.06.2009 4:11

Да, просто меняешь рисунок и переключаешься на другую страницу.

Вся суть - в том, что самого процесса перерисовки не видно, смена активной страницы происходит мгновенно (по-моему, за один проход луча по экрану, но я могу ошибаться), и не видно мерцания, которое получается, когда стирается старое, и рисуется новое изображение, поскольку вот это самое затирание старого и рисование нового делается на НЕактивной странице, а показывается тебе сразу результат...

В принципе, есть видеорежимы и с четырьмя страницами (это EGA -> EGALo и VGA -> VGALo), но ты будешь только путаться с ними. В 4-х видеостраницах есть смысл только, если у тебя всего 4 кадра, ты сразу заполняешь все 4 страницы, каждую своим кадром, а потом просто меняешь активную страницу... Во всех остальных случаях выгоднее работать с 2-мя страницами...

Автор: Lapp 13.06.2009 4:50

Цитата(volvo @ 13.06.2009 1:11) *

смена активной страницы происходит мгновенно (по-моему, за один проход луча по экрану, но я могу ошибаться)
Грубо говоря, между проходами. То есть этот проход делался из страницы 0, а следующий будет из страницы 1. Мигание исключено, если правильно подготовить данные.

Автор: Ozzя 15.06.2009 11:44

Цитата
Мигание исключено, если правильно подготовить данные.

Вроде как нужно отслеживать vertical retrace?



Автор: Lapp 15.06.2009 11:53

Цитата(Ozzя @ 15.06.2009 8:44) *
Вроде как нужно отслеживать vertical retrace?
Я полагаю, что SetVisualPage это делает. Никогда не наблюдал проблем с этим. Впрочем, это было настолько давно..

Автор: Ozzя 15.06.2009 12:13

Не знаю кода от Borland не видел, но мигание при SetVisualPage даже на 386DX-40 явное. Снимается только ожиданием VR

Автор: Lapp 15.06.2009 14:46

Цитата(Ozzя @ 15.06.2009 9:13) *
мигание при SetVisualPage даже на 386DX-40 явное. Снимается только ожиданием VR
Хым, странно.. Как грится, "либо одно из двух, либо я не прав")). Не помню мигания.. И проверить негде сейчас((.

Автор: volvo 15.06.2009 15:15

Все зависело от версии VBE (VESA BIOS Extension), на версии 1.2 при SetVisualPage не было синхронизации с VerticalRetrace, и надо было добавлять код ожидания вручную. Начиная со второй VBE это делается автоматически. Оззя, ты ж TMT-шник? Посмотри описание SetVisualPage в доках на TMT, зачем там по твоему введен второй параметр? wink.gif

Автор: Ozzя 17.06.2009 17:28

volvo
Стесняюсь сказать, но на сей 3-шке VGA стоит 256 kb (Phoenix BIOS). Так что, никаким vBE здеся и не пахнет близко blink.gif
Всё тестировалось на VGA Med.
Видел я код тмтшный, он как раз на vbe и based. 4-ка ТМТ ж не держит 640х350Х4bit
А, кстати, где-то на сорсах Вадим Бодров объяснял сей глюк/фичу. Пороюсь, постраюсь найти