Pascal - Setvisualpage i Setactivepage (migotanie)

0

Witam. Mam pewien problem z migotaniem w trybie graficznym. Oto przykładowy program, który miga, a moim zdaniem nie powinien:


 uses crt2,graph; {crt2 poniewaz mam run time error w zwyklym crt}
procedure init;
var s,m:integer;
begin
 s:=EGA;
 m:=EGAHi;
 initgraph(s,m,'D:\Programs\Turbo\BP\BGI');
end;

procedure proc;
var x:integer;
begin
x:=1;
settextstyle(1,0,1);
repeat

setvisualpage(0);
outtextxy(x,100,'COS TAM...');
setactivepage(0);
cleardevice;

setvisualpage(1);
outtextxy(x,100,'COS TAM...');
setactivepage(1);

delay(100); 
{Jesli za duzy delay to zmiencie na mniejszy, 
    poniewaz u mnie 100 to jak 20}
cleardevice;

x:=x+1;
IF x>640 THEN x:=1;
until keypressed;
end;

begin
 init;
 proc;
closegraph;
end.  

Jak widać zmieniłem sterownik na EGH, ponieważ VGA w ogóle pokazywał głupoty. Ustawiłem moduł EGAHi, który sprawia, że migotanie jest mniejsze, ale i tak widać, że wciąż występuje migotanie. Z góry dzięki za pomoc.

0

Mruganie spowodowane przełączeniem się na inny obszar pamięci graficznej, nie unikniesz tego.
Animacje możesz zrobić np tak:

procedure proc;
var x:integer;
begin
  x:=1;
  settextstyle(1,0,1);
  repeat
    SetColor(BLACK);
    outtextxy(x,100,'COS TAM...');
    x:=x+1;
    if x>640 then x:=1;
    SetColor(WHITE);
    outtextxy(x,100,'COS TAM...');
    delay(100);
  until keypressed;
end;
0

A nie da się za pomocą komend zawartych w temacie?

0
_13th_Dragon napisał(a)

Mruganie spowodowane przełączeniem się na inny obszar pamięci graficznej, nie unikniesz tego.
bzdura.

@McJacob: komentarze w http://4programmers.net/Turbo_Pascal/FAQ/Co_zrobi%C4%87_aby_nie_skaka%C5%82_obraz_w_trybie_graficznym_przy_animacji_, a konkretniej - zanim przełączysz stronę - coś takiego:

procedure sync; assembler;
asm
  mov dx,03DAh
@1:
  in al,dx
  test al,1000b
  jz @1
end;

inna sprawa, że podane rozwiązanie znajduje się w FAQ działu delphi/pascal. rączka by uschła od użycia wyszukiwarki?

0

Byłem na tej stronie, tylko że wolałem żeby tryb był VGAHi (640x480) A tam jest inny (320x200) i musiałbym przeprogramować cały program... Dzięki za pomoc :) Następnym razem dokładnie poszukam, czy czasem taki temat nie był wcześniej napisany.

0

rany, ludzie, myślcie. przecież synchronizacja z powrotem plamki jest niezależna od aktualnej rozdzielczości. czytałeś ten artykuł (nota bene słabej jakości), ale z komentarzami się nie zapoznałeś? a wydawało mi się, że napisałem w poprzednim poście "komentarze w http://4programmers.net/Turbo_Pascal/FAQ/Co_zrobi%C4%87_aby_nie_skaka%C5%82_obraz_w_trybie_graficznym_przy_animacji_"...

0

tylko że ja pixelów nie numerowałem i nie dawałem do zmiennych tylko na żywca wpisywałem współrzędne

procedure sync; assembler;
asm
  mov dx,03DAh
@1:
  in al,dx
  test al,1000b
  jz @1
end; 

Przykro mi, ale ta procedura sprawia, że grafika załamuje się w niektórych miejscach... Zamiast pomagać to szkodzi. Może masz jakąś radę?

0
McJacob napisał(a)

tylko że ja pixelów nie numerowałem i nie dawałem do zmiennych tylko na żywca wpisywałem współżędne
ka

cleardevice masz w złym momencie wywoływane - czyści aktywną i jednocześnie pokazywaną stronę.
czekasz na powrót plamki
pokazujesz stronę B
ustawiasz aktywną stronę A
czyścisz i rysujesz co trzeba
czekasz na powrót plamki
pokazujesz stronę A
ustawiasz aktywną stronę B
czyścisz i rysujesz co trzeba
....

współrzędne przez RZ

0
 
procedure proc;
var y,i:integer;
begin
y:=480;
settextstyle(2,0,7);
repeat


FOR i:=1 TO 50 DO
outtextxy(150,y+(i*20),'Tutaj jest przykladowy tekst');

 sync;
 delay(10);
 cleardevice;
 y:=y-1;

until keypressed;
end;

Wszystko jest ok aż do 6,7 linjiki która się pojawia na ekranie - potem zaczyna tekst mrugać i zwalniać...

0

delay!!! czekasz na powrót plamki, a potem czekasz 10 ms żeby odświeżyć obraz akurat jak plamka będzie gdzieś w jego połowie. łapy pourywam za taką głupotę.
pętla { delay. sync. cleardevice. rysowanie. }
wiesz co to jest powrót plamki? rozumiesz w jaki sposób jest tworzony obraz na monitorze crt (i pośrednio lcd)? rozumiesz co to jest czekanie na powrót plamki i po co się to robi? nie? google!!!

jeśli rysowanie trwa zbyt długo, to obraz i tak będzie migać - aby tego uniknąć stosuje się rysowanie w buforze lub przełączanie aktywnej i wyświetlanej strony, ewentualnie robi się to pod windows i/lub directx lub pokrewnych, a nie korzysta z czegoś rodem z epoki programowania łupanego.

zwalnianie po kilku sekundach to zupełnie inna sprawa. systemy nt 5.x (np. XP) zwalniają działanie programów dos po kilku sekundach od naciśnięcia ostatniego klawisza. możesz to zablokować wciskając num lock. używanie programów napisanych pod dos, kiedy masz ich dużo nowsze i lepsze wersje to po prostu nekrofilia i masochizm.

0

pętla { delay. sync. cleardevice. rysowanie. }
Wiem przecież!! Zmieniłem i i tak znika gdzieś w połowie obraz!
I nie rób z siebie jakiegoś nie wiadomo jakiego mistrza. Po to założyłem ten temat żeby trzymać odpowiedź!

0

otrzymałeś odpowiedzi. zwyczajnie ich nie rozumiesz, a po powyższym poście wnioskuję, że porady masz gdzieś i/lub nie umiesz czytać ze zrozumieniem.
с Богом.

0

Zastosowałem Twoje porady, tylko że one nie działają...

0
McJacob napisał(a)

Zastosowałem Twoje porady, tylko że one nie działają...

ŁF napisał(a)

jeśli rysowanie trwa zbyt długo, to obraz i tak będzie migać - aby tego uniknąć stosuje się rysowanie w buforze lub przełączanie aktywnej i wyświetlanej strony, ewentualnie robi się to pod windows i/lub directx lub pokrewnych, a nie korzysta z czegoś rodem z epoki programowania łupanego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1