Помощь - Поиск - Пользователи - Календарь
Полная версия: Setactivepage - глюк
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Palux
Пишу на Паскале лабу с использованием Graph.
Суть задачи:
Рисуется рандомная картинка (линиями и кружочками) потом она
проподает и появляется луч фанарика, который двигается и ее
освещает.

Для это я использау 2 страници. Проблема в том, что они накладываются одна на другую (где то пополам) при смене страниц.

Подскажите под. че делать ....
Лабу надо быстро сдавать sad.gif
Altair
а какой графический режим используешь? не все режимы имеют видеостраницы...
тогда в них происходят просто разделения экрана при попытке их использования..
Palux
блин .... а как узнать какой?
На глаз 640х480х16 blink.gif
Archon
detect'ом наверно определился не тот режим который ты хотел. Исходник кинь, поправим.
Altair
Цитата
Многостраничный вывод возможен только на EGA
(256Кб), (S)VGA и Hercules
.


А вот так выглядит проверка поддерживает ли выбранные детектом драйвер страницы:



{...}
d:=detect;
if d in[HercMono,EGA,EGA64,MCGA,VGA] then
{поддерживает}
else {нет страниц}
{...}
end.

volvo
Цитата(Archon @ 15.06.05 13:54)
detect'ом наверно определился не тот режим который ты хотел.
Detect-ом может и тот определился, но Detect дает лучший из доступных режимов, поэтому устанавливать придется вручную:
Gd:=Ega;
Gm:=EgaHi; { 640x350x16 + 2 страницы }
InitGraph(Gd, Gm, Path);
Palux
Режим 640x480 VGA
исходник
Код

Gd := Detect;
InitGraph(Gd, Gm, 'f:\bp\bgi');
If GraphResult <> grOk
Then Halt(1);

mode:=GetModeName(GetGraphMode);
SetActivePage (1);
SetVisualPage (1);

 Repeat
 Begin
  SetColor (Random(15));
  Line (Random(GetMaxX-2)+1,Random(GetMaxY-2)+1,
        Random(GetMaxX-2)+1,Random(GetMaxY-2)+1);
 End
 Until KeyPressed;

SetActivePage (0);
SetVisualPage (0);

Palux
заработало с EGA, EGAHi ,но разрешение какоето неприкольное....
Мне бы с VGA, но с ним не работает
Altair
А чего ты хочешь добиться в программе? ты же все равно на 1 страницу выводишь... зачем тебе они тогда вообще?
Palux
ну скажите еще ченить, мне эту лабу уже здать надо
Palux
Oleg_Z,
я хочу добиться эффекта освещения в темноте рисунка фанариком (световое пятно). А как по другому сделать то? Если начальный экран загнать в массив каконить (GetImage), то как из него потом доставать кусочки, которые надо засветить?
А тут удобно (я тык думаю):
Перевлючил актив страницу, взял кусок, опять переключил, обрезал по кругу, положил .....
Palux
может у меня изначально неправельный подход?
Тады как сделать по правельному?
Archon
Да нормалёк... Делай по своему. А разрешением придётся пожертвовать, я сам от чего-то выше 320x200x256 давно отказался(муторно слишком, а чужие модули использовать не хочу).

Цитата
Если начальный экран загнать в массив каконить (GetImage), то как из него потом доставать кусочки, которые надо засветить?

Достать-то можно, только весь экран в большом разрешении загнать будет сложно(640*480*4=153600 байт ...да нет если указатель на массив тады можно...мысли в слух... smile.gif )
volvo
Palux, держи исходник для начала... Учти, при больших значениях радиуса будет притормаживать. И попробуй (если это не устроит) переделать, как тебе нужно... ;)
Код
uses crt, graph;

var
 buffer: array[1 .. 10000] of byte;
 curr: integer;

procedure get_square(x, y, r: integer);
var ix, iy: integer;
begin
 setactivepage(0);
 curr := 0;
 for iy := y - r to y + r do
   for ix := x - r to x + r do begin
     inc(curr);
     buffer[curr] := getpixel(ix, iy);
   end;
 setactivepage(1);
end;

procedure put_circle(x, y, r: longint);
var ix, iy: integer;
begin
 curr := 0;
 for iy := y - r to y + r do
   for ix := x - r to x + r do begin
     inc(curr);
     if (sqr(x - ix) + sqr(y - iy) <= sqr(r) then
       putpixel(ix, iy, buffer[curr]);
   end;
end;

procedure darkcircle(x, y, r: integer);
begin
 setfillstyle(solidfill, black);
 bar(x - r, y - r, x + r, y + r);
end;

var
 gd, gm: integer;
 x, y, i: integer;
const r = 20;

begin
 Gd := ega;
 Gm := egahi;
 InitGraph(Gd, Gm, '');
 If GraphResult <> grOk Then Halt(1);

 SetActivePage(0);
 SetVisualPage(0);

 Repeat
   SetColor (Random(15));
   Line (Random(GetMaxX-2)+1,Random(GetMaxY-2)+1,
         Random(GetMaxX-2)+1,Random(GetMaxY-2)+1);
 Until KeyPressed;
 while keypressed do readkey;

 SetActivePage(1);
 SetVisualPage(1);

 x := getmaxx div 2; y := getmaxy div 2;

 repeat
   get_square(x, y, r);
   put_circle(x, y, r);
   delay(22000);
   darkcircle(x, y, r);
   inc(x, 10);
 Until KeyPressed;
 while keypressed do readkey;

 closegraph;
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.