Mam kolejne pytanko dotyczace grafiki. jak napisac procedure cleardevice ktora blyskawicznie czysci ekran? bo czyszczenie pixel po pixelu dosc dlugo schodzi a podobno sa jakies instrukcje w asemblerze blyskawicznie zerujace banki pamieci. czy ktos cosik wie na ten temat?? No i jesli kto by wiedzial jak zaiplementowac stronicowanie ekranu bylbym wdzieczny.
A co ty chcesz czyscic?? Canvas'a??
A co ty chcesz czyscic?? Canvas'a??
A co to canvas ? ? ?
nie no chce po prostu szybko wyczyscic ekran
Podaj może jakieś szczególy, w czym to chcesz mieć. Bo jeśli w pascalu przy module graph, to jest właśnie funkcja cleardevice, która czyści ekran.
Podaj może jakieś szczególy, w czym to chcesz mieć. Bo jeśli w pascalu przy module graph, to jest właśnie funkcja cleardevice, która czyści ekran.
Wiem ze taka jest, ale ja sobie napisalem wlasny prymitywny tryb graficzny (800x600 , 24 bit koloru) i tam mi jest potrzebne samemu napisac to cleardevice. przydaley by sie tez bardzo procedury setactivepage i setvisualpage... albo zrodlo do graph.tpu to moze sobie sam skumam jak to dziala i przerobie.
[ot]
Źródło grapha niewiele ci da. Potrzebujesz zródło sterownika bgi obsługującego taki tryb
Nie wiem czy Ci to zadziala no ale jesli nie masz lepszych pomyslow to moze sprobuj tak:
procedure linia(x:word);assembler;
asm
mov ax,4f06h
mov bx,0
mov cx,x
int 10h
end;
wywolanie linia(800) powinno ustawic dlugosc linii na 800 i wtedy liczba linii bedzie taka ile tylko da vram.
procedure przesun(x,y:integer);assembler;
asm
mov ax,4f07h
mov bx,0
mov cx,x
mov dx,y
int 10h
end;
Ta procedura powinna przesunac ekran do punktu (x,y) - to znaczy powinien on stac sie punktem (0,0) na ekranie.
Zatem wywolanie przesun(0,0) pokaze pierwsze 800x600 pixli natomiast
przesun(0,600) powinno dac drugie to znaczy drugi ekran a przesun(0,1200) - trzeci i tak dalej ile tylko da vram. W ten sposob dostaniesz Twoje upragnione visualpage:))))
Teraz czyszczenie. W trybie 24 bitowego koloru na 800x600 jeden ekran zajmie az 21 bankow i jeszcze kawalek 22-ego. Z tego powodu moze lepiej drugi ekran sobie ustalic nie ma linię 600 ale na 601 (chodzi o to zeby ekran konczyl sie wraz z bankiem zeby przy czyszczeniu nie trzeba bylo dzielic banku choc mozna to na partego zrobic i bedzie troche oszczedniej - dokladnie o jedna linię)
const vga:word=$a000;// ja nie wiem czy zawsze to jest ten adres
procedure clearbank(bank:word);
asm
mov ax, $4f05
mov bx,0
mov dx,bank
int 10h
push es
mov cx, 32769;
mov es,[vga]
xor di,di
mov al,0
mov ah,al
rep stosw
pop es
end;
No i teraz jak chcesz wyczyscic piewsza strone (linie od 0 do 599) musisz wywolac for i:=0 to 21 do czyscbank(i);
dla drugiej strony to bedzie dla i od 22 do 43 no i tak dalej.
Nie wiem czy Ci to pomoze, nie gwarantuje ze wszytsko zadziala, ja to specjalnie dla Ciebie odgrzebalem - od dawna nie piszę w turbo pascalu i nawet slabo pamietam jak ja to pisalem i jak tego uzywalem
no ale powodzenia :)))
Heh , za długo pisałem i logowanie poszało ........ no , gdzies poszło :)
Nie wiem czy mnie poznajecie po charakterze pisma ale ten anonim na gorze to właśnie ja ;p
A tak swoją droga Wyder, to to bedzie Ci wolno dzialaoło z tymi bankami. Jelsi juz chcesz robic to pod dosem to polecalbym djgpp (c++ lub pascal do wyboru) i tam masz gotowa bibliotekę allegro operujaca na liniowym odwzorowaniu ram<->vram co jest duzo szybsze.
Wielkie dzieki miszczu! widze ze na tym forum to chyba tylko ty sie znasz na programowaniu!! Jak tylko wezne sie za robienie tego programu to sprawdze czy to zadziala i dam ci znac! To bedzie gdzies tak do tygodnia, bo musze sie uporac z innymi przedmiotami.... robie to pod dosem bo musze zrobic w pascalu na zaliczenie. jak tylko sie z tym uporam koncze z pascalem i przucam sie na c. dobra ide spac. jak to zaimplementuje to napisze czy dziala! jeszcze raz dzieki!
Ojoj - no nie przesadzaj . Tu sporo osob zna sie na wielu rzeczach dotyczacych programowania bardzo dobrze. Tyle ze wiekszosc jednak pisze pod windows i moze nawet nie zetknela sie z programowaniem pod dosem bo to stare dzieje:)
Aha, ten anonim wyzej to ja - wyder. to jeszcze jedno pytanko z ciekawosci: O co chodzi z tymi zurawiami ? Pozdrawiam!
cholera co to ma byc ? jeden post na 15 min ? >?? ??
Wiem ze wiele osob sie zna. Moze nie chodzi o to ze umiesz ale o to ze jestes sklonny pomoc! Specjalnie dla nieznajomej osoby grzebac za jakimis starociami! szacunek! pozdrawiam!
Chcialbym oficjalnie podziekowac tutaj Marmarowi!! stary wielkie dzieki!!! wszystko dziala !! dokladnie o to mi chodzilo!!! wyrazy uznania, szacunku i wdziecznosci pod adresem tego prze goscia!!!
o co chodzi z tymi zurawiami? ? ?
Z żurawiami chodzi o ostrożność wobec przekonania, że jakies rozwiązania są jedynie słuszne a inne są gorsze:)
hej jescze jedno pytanie Marmarze! czy procedura line okresla dlugosc lini czy miejsce w ktorym sie ona ma konczyc liczac od zera? bo na drugiej stronie u gory sie mi pojawia maly pasek z wczesniejszej strony, siegajacy polowy dlugosci, i nie wiem czy to jest spowodowane
Połowy długosci? A czy to czasem nie jest pasek wysokosci 1 pixelka siegajacy : 64102422-8006003=1792
1792 div 3=597 a wiec 597-ego pixelka?
Jesli tak to znaczy ze nie przeczytales dokladnie tego co napsialem. ;) Mianowicie, poniewaz 22 banki siegaja troche dalej niz jeden ekran to zeby nie wprowadzac dodatkowego kodu do funcji czyszczenia zaproponowalem Ci bys drugi ekran zaczal nie od 600-ej linii a od 601 , spisujac jedna linie na strate i pozbywajac sie problemu.
Jesli to inny pasek (grubszy niz 1 pixelek i siegajcy nie 597 pixelka)to nie bardzo wiem skad sie bierze. Napsiz cos wiecej moze cos zaradzimy.
Mam problem z tym kasowaniem bankow, mianowicie uruchamiam to w petli dla okreslonej liczby bankow ale kasuje sie tylko jeden waski pasek na ekranie ... A co do tych stron to juz mi dziala ok, w zasadzie zostalo tylko to czyszczenie. Ale z tym juz sobie moze jakos poradze. Dzieki Marmar!