ART1 (4)







Jak wyświetlić plik BMP w QBASIC'






Jak wyświetlić plik
BMP w QBASIC'u

Opisywana metoda jest bardzo prosta i działa również w innych językach np.
Pascal'u, C++, asmeblerze (nie działa tylko w ZDZICHu, ale tylko dlatego, że nie ma tam
instrukcji która odczytuje dane z pliku ;-).

Przejdźmy do sedna : nie znam formatu BMP. Jednak można napisać konwerter plików z
BMP na ... własny format pisząc program w VB, nawet nie muszę znać formatu pliku BMP.
Ten plik BMX ma bardzo łatwy format, który znam i mogę zastosować w programie. To jest
cały sekret. A teraz omówię po kolei najważniejsze rzeczy a na końcu dla
zaintersowanych przepisze tutaj źródło.

1. Budowa pliku BMX :
Budowa pliku jest bardzo łatwa. Niestety szerokość i wysokość obrazu musimy
pamiętać (nie chciałem zbytnio komplikować programów). W Qbasic'u można stosować
aż 16 kolorów. Jeden bajt to opis koloru. Jeśli bajt X ma kod Ascii 0 to znaczy, że
kolor jest 0 czyli czarny. Jeśli nie wiesz o co mi chodzi, to przeczytaj następny punkt,
tam sÄ… dalsze informacje.

2. Algorytm konwertera
Konwerter działa na prostej zasadzie : 2 pętle for odczytują po kolei każdy
punkt. Jeśli dany kolor jest taki sam, jak jeden z 16 dostępnych w Qbasic'u, to zapisuje
do pliku numer koloru. Jeśli jednak dany kolor nie istnieje w Qbasic'u (czy w Turbo
Pascalu, lub jakim kolwiek innym języku programowania, gdzie tryb graficzny udostępnia
16 kolorów) to zapisuje wartość 0 (kolor czarny).

3. Kolor przeźroczysty
Tutaj jest dowolność. Nie ma czegoś takiego jak kolor przeźroczysty, ale
możemy, zrzec się jednego koloru na korzyść koloru przeźroczystego.

4. Szybkość
Program konwertujący jest wolny i będzie :( najgorsze jest to, że
wyświetlanie pliku BMX jest wolne, ale tutaj nic nie da się zrobic (winna jest funkcja
(przerwanie) 10h która jest odpowiedzialna za wyświetlenie punktu na ekranie.
Próbowałem pobawić się adresowaniem bezpośrrednio do pamięci, ale QBASIC mi się
zawiesił i zrezygnowałem :( Jednak nie musisz się o to martwić, jeśli wyświetlasz
małe pliki. Program konwertujący jeszcze może być wolny, bo plik konwertuje się tylko
raz i możemy się poświęcić, ale skoro to przerwanie jest takie wolne to katastrofa
(nie możemy napisać porządnej gry). Niestety, ale instrukcja PSET w Qbasic'u i PutPixel
w pascal'u, to jest odwołanie do tego wolnego przerwania. Popytam się ludzi może uda mi
się napisać szybszą wersję.

5. Zastosowanie
Gry (o ile uda Ci się przyśpieszyć algorytm wyświetlania pliku BMX), przydaje
się do wyswietlenia małego Logo.

6. Uwagi końcowe
Qbasic nie uznaje instrukcji Color, jeśli jest tryb graficzny (wszystkie
instrukcje Color, pod SCREEN 12 są uznawane za błąd Za to Turbo Basic nic nie ma
przeciwko temu)

To już właściwie tyle. Musisz po prostu pobawić się konwerterem i zamieszczonymi
samplami. Ponieważ źródło konwertera jest długie i zawiera 2 formy, to tutaj go nie
przytocze. Za to źródła programików wyświetlających pliki BMX poniżej zamieszczam :

Wyświetlenie pliku BMX
RysX=120
RysY=242
PoczX=(640)/2-(RysX/2)
PoczY=(480/2)-(RysY/2)
Screen 12

Open "rys.bmx" for input as #1
for a=1 to RysX
for b=1 to RysY
Y$=input$(1,1)
Y=asc(Y$)
pset(PoczX+a,PoczY+b),Y
next b
next a
close #1

color 14,0
Locate 7,31
Print "Przygody Punka Franka"

do
'NIC
loop while inkey$=""

To samo, ale w Pascal'u
Tym razem to samo, ale w Pascal'u. Jednak następne sample już będę pisał
tylko w QB (to zin dla znających VB i języki pochodne a nie dla Pascal'owiczów) :
Program BMX;
uses crt,graph;
var Karta,Tryb,a,b,PozX,PozY:integer;
P:text;
D:char;
BEGIN
PozX:=320-60;
PozY:=240-121;
Karta:=detect;
InitGraph(Karta,Tryb,'f:\programo\tp7\bgi');

Assign(P,'rys.bmx');
Reset(P);
for a:=1 to 120 do Begin
for b:=1 to 242 do Begin
Read(P,D);
PutPixel(Pozx+a,Pozy+b,ord(D));
end;
end;
close (P);

setcolor(5);
settextstyle(1,0,5);
outtextxy(50,50,'Przygody Punka Franka');

asm {To jest lepsze od Repeat until keypressed}
mov ah,7
int 21h
end;

closegraph;
END.

Kolor przeźroczysty
Fajny efekt, no nie ??? Ale teraz przytocze lepsze zródło : teraz będą 2
rysunki jeden na drugim, gdzie zastosuje kolor przeźroczysty (biały - 15). Po prostu
Punk Franek będzie na tle krajobrazu :

' Przyklad podobny do podobnego, ale uzylem tu koloru
przezroczytego
' kolor bialy (15) jest przezroczysty (nakladam 1 rysunek na drugi)

KolorPrzezroczysty=15 'numer koloru przezroczytstego

Screen 12
open "obraz.bmx" for input as #1
PozX=int(640/2-250/2)
PozY=int(480/2-350/2)

' Narysujemy tlo
for a=1 to 250
if inkey$=chr$(27) then end 'jesli nacisne ESC, to program zamknie sie
'mimo iz nie wyswietli do konca pliku
for b=1 to 350
Z$=input$(1,1)
Z=asc(Z$)
pset(Pozx+a,Pozy+b),Z
next b
next a
Close #1

'Teraz rysujemy Punka Franka, ale tak, aby tˆo bylo przezroczyste
PozX=PozX+50
PozY=PozY+50
Open "rys.bmx" for input as #1
for a=1 to 120
if inkey$=chr$(27) then end 'ESC
for b=1 to 242
Z$=input$(1,1)
Z=asc(Z$)
if Z<>KolorPrzezroczysty then Pset(Pozx+a,Pozy+b),Z
next b
Next a
close #1

do
'NIC
loop while inkey$=""

Teraz to dopiero jest niezły efekt !!! Szkoda, że tak długo trzeba czekać ... A i
jeszcze jedno : tutaj dodałem obsługę klawisza ESC.

Tutaj możesz ściągnąć sample + pliki BMX (5 KB). A tutaj konwerter plików BMP na BMX + pliki BMP (5 KB).

Jelcyn




Wyszukiwarka

Podobne podstrony:
ART1 (18)
art1 (16)
ART1 (17)
art1
ART1 (10)
art1
ART1 (6)
art1
art1
slowa klucz mec art1
art1

więcej podobnych podstron