RETRO KUTAK – tehnologija prošlih decenijaStandar Basic

lekcija 5 – Škola programiranja u standardnom bejziku C64

Ova lekcija detaljno objašnjava rad sa hardverskim i softverskim sprajtovima na Commodore 64, uključujući visokorezolucijske i multikolorne primere, uz objašnjenje binarnih i decimalnih vrednosti, memorijskih lokacija i POKE komandi. Naučićete funkcije LEFT$, RIGHT$, MID$, READ, DATA, RESTORE i GET, a znanje ćete primeniti u izradi jednostavne arkadne igre „Trka Formule 1“ u BASIC-u. Idealno za ljubitelje retro programiranja, edukaciju početnika i one koji žele da kombinuju teoriju i praksu na C64.

RETRO KUTAK

LEKCIJA PRVA LINK

LEKCIJA DRUGA LINK

LEKCIJA TREĆA LINK

LEKCIJA ČETVRTA LINK

LEKCIJA PETA LINK

LEKCIJA ŠESTA LINK

LEKCIJA SEDMA LINK

Programiranje comodere 64 : lekcija peta

Sličice oživite i u vožnju krenite (rad sa sprajtovima)

Dobrodošli na peti čas „Male škole programiranja na Commodore 64 u BASIC-u“. Danas ćemo  nastaviti sa upoznavanjem mogućnosti i naredbi C64 računara. Dajemo kao i obično neke savete i primere za ono što učimo.

 

Počnimo kao i obično sa savetima i objašnjenjima

 

Sprajtovi

Šta su sprajtovi? Jednostavan odgovor je da su to sličice koje su definisane od strane programera i koje možemo pomerati po ekranu bez obzira u kom smo grafičkom modu. Kod C64 postoje tzv. hardverski sprajtovi. To znači da kreiranje i upravljanje ovim sličicama podržava sam sistem računara što značajno olakšava njihovo definisanje i korišćenje. Mogu se kreirati i tzv.softverski sprajtovi što je značajnije teže jer programer mora voditi računa o gomilu stvari koje su mu već omogućene postojanjem hardverskih sprajtova i isti nisu tako efikasni. Zato su kod C64 hardverski sprajtovi najbitniji. Uglavnom se koriste kod video igara (naročito arkadnih). Problem je korišćenje sprajtova putem standardnog bejzik programa zbog njegove izuzetne sporosti, pa se uglavnom koriste u mašinskim programima. Takođe kad je standardni bejzik u pitanju koriste se isključivo u tekstualnom modu iz razloga što ne bi imalo smisla koristiti ih u grafičkom modu visoke ili multikolor rezolucije (o njima u sledećoj lekciji), jer kada bi se istovremeno iscrtavala grafika dobili bi smo jedan frejm u 5 sekundi (i to ako imamo sreću). Kao i kod grafike i zvuka nema odgovarajuće standardne bejzik C64 naredbe za njihovo definisanje, uključivanje. pokretanje itd. (što bi nam i te kako olakšalo posao ali šta je tu je) pa ćemo morati koristiti memorijsku mapu za ono što želimo. Ima ih ukupno 8. Možemo ih pokretati po horizontali i vertikali na ekranu (320×200 tačaka),duplo uvećati po X ili Y osi, detektovati da li su se sudarili međusobno ili sa pozadinom itd.

Kako ih defenišemo?

Sprajtovi su sličice koje se u visokoj rezoluciji crtaju sa 24×21 tačaka, a u multikolor rezoluciji 12×21 tačaka. Jedan sprajt zauzima ukupno 63 bajta. Isti se iscrtava u matrici 3 x 21 bajta- 24 tačaka za horizontalu (3 x 8 tačaka/bita kod visoke rezolucije u dve boje ili kod multikolora 3 x 4 tačaka (dva bita po tački) što daje 12 tačaka multikolor u četri boje ili ukupno 24 bita) i 21 tačaka za vertikalu. Kombinacijom tih bajtova i unosom njihove vrednosti u memorijsku mapu zaduženu za sprajtove dobijamo željenu sličicu. Oni mogu biti i animirani (uglavnom i jesu) brzim učitavanjem različitih vrednosti u memoriju sprajta što se da videti u svim video igricama ali to nije moguće uraditi u standardnom bejziku da bi bilo iskoristivo zbog, kako smo to već napomenuli, velike sporosti istog. 

Visokorezolucijski sprajt

Kao što smo rekli ovaj sprajt je dimenzije 24×21 tačaka u dve boje (u stvari boja lica bit 1 plus providnost-boja pozadine bit 0)

Tabela u excel formatu za lakše izračunavanje  downloadKreiranje sprajtova

Preporučujem da napravite na papiru ili računaru ovakav šablon:

 

                                  B I N A R N E   V R E D N O S T I                                   decimalne vrednosti

red765432107654321076543210
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

 

Da ne bude zabune bitovi u bajtu se obeležavaju od 0 do 7 počev od desne prema levoj strani po težini. To su sa nulom ukupno 8 bita i nose vrednosti (bit/vrednost) 0/1, 1/2, 2/4, 3/8, 4/16, 5/32, 6/64, 7/128. Preporučujemo da kada nacrtate željenu sličicu uzmete digitron, prebacite na binarni deo otkucate 8 bita iz šablona i vidite koliko to decimalno vredi. Takođe možete napraviti u excel tabeli šablon za obračunavanje decimalnih vrednosti ili koristiti neki program skinut sa interneta. Naravno možete i sami da izračunate bez upotrebe digitrona i računara (ako imate vremena i volje preporučujemo ovo poslednje, dobro je za vežbu moždanih sinapsi). U gore datom šablonu bitovi su odvojeni mrežom zadebljano, normalno, zadebljano, tako da je lako znati koji bit pripada kom bajtu.

Nacrtajmo sada sportska kola/formulu 1 i pretvorimo ih u decimalnu vrednost po bajtovima. Koristićemo slovo Q kao logičku jedinicu, a prazno polje kao logičku nulu. Naravno na vama je da odaberete kako ćete to uraditi 

                                  B I N A R N E   V R E D N O S T I                                   decimalne vrednosti

red765432107654321076543210
1000
2000
3QQQQQQQQ60060
4QQQQQQQQQQQQQQQQQQQQ63255252
5QQQQQQQQQQQQQQQQQQQQ63255252
6QQQQQQQQQQQQQQQQQQQQ63255252
7QQQQQQQQQQQQQQQQQQQQ63255252
8QQQQQQQQQQQQ3255192
9QQQQQQQQQQQQ3255192
10QQQQQQQQ3195192
11QQQQQQQQ3195192
12QQQQQQQQ3195192
13QQQQQQQQ3195192
14QQQQQQQQQQQQ3255192
15QQQQQQQQQQQQ3255192
16QQQQQQQQ02550
17QQQQQQQQQQQQQQQQQQQQ63255252
18QQQQQQQQ60060
19QQQQQQQQQQQQQQQQQQQQ63255252
20QQQQQQQQ60060
21000

 

Nisam baš vešt u crtanju ali se nadam da ovaj crtež može da prođe kao formula.

Sada je vreme da ovaj sprajt unesemo u memoriju i prikažemo ga na ekranu i zato ćemo se poslužiti sledećim programom:

10 FOR I=832 TO 894

20 READ M

30 POKE I,M

40 NEXT I

U linijama od 10 do 40 smeštamo naš sprajt u memorijske adrese od 832 do 894 (63 bajta). Pogledajte u ovom tekstu naredbe READ i DATA

50 POKE 53269,1

Ovde preko adrese za kontrolu sprajta uključujemo prvi (svaki bit uključuje/isključuje jedan sprat od 0 do 7)

60 POKE 2040,13

Sprajtovi se smeštaju po blokovima od 64 bajta. U memorijsku lokaciju zaduženu za adresu prikaza prvog sprajta 2040 unosimo vrednost 13 (2040-prvi,… 2047-osmi sprajt). To znači da smo odredili  memorijsku lokaciju za prikaz prvog sprajta adresu 832 (13*64) na kojoj smo učitali naš sprajt

70 POKE 53248,170:POKE 53264,0

Da bi smo za ovaj sprajt odredili horizontalni položaj na ekranu treba u adresu 53248 za X osu prvog sprajta uneti vrednost od 0 do 255 (53248-prvi,53250-drugi,  … 53262-osmi sprajt). Pošto je horizontala po kome se sprajt može kretati 320 tačaka fali nam još 65 tačaka. Konstruktori su to rešili dodeljivanjem još jednog bita u memorijskoj lokaciji 53264 za svaki od 8 sprajtova. Ako setujemo ovaj bit (53264,1 za prvi sprajt, svaki sprajt ima svoj bit od 0 do 7) koji nosi vrednost 256 i tu dodamo 255 iz osnovne X lokacije, onda je X kordinata istog povećana na 511 od kojih nam treba samo 320 (ako preteramo nećemo videti sprajt)

80 POKE 53249,70

Ovde dajemo vrednost Y kordinate vertikalnog položaja unosom vrednosti od 0 do 255 u memorijsku lokaciju 53249 za prvi sprajt (53249-prvi,53251-drugi… 53263-osmi sprajt). Pošto Y osa ima maksmalnu vrednost od 200 tačaka tu nema nikakvih problema. I ovde važi da ako preteramo sa vrednošću izačićemo sa ekrana

90 REM POKE 53277,1: POKE 53271,1

Ovaj programski red je neaktivan. Služi ukoliko želimo da dupliramo veličinu sprajta po X i/ili Y osi. Svaki sprajt ima svoj bit u ovim memorijskim adresama

100 POKE 53287,3

U adresu boje za prvi sprat unosimo vrednost za boju koju želimo (adrese se kreću od 53287-prvi do 53295-osmi sprajt)

110 END

Kraj programa

1000 DATA 0,0,0

1010 DATA 0,0,0

1020 DATA 60,0,60

1030 DATA 63,255,252

1040 DATA 63,255,252

1050 DATA 63,255,252

1060 DATA 63,255,252

1070 DATA 3,255,192

1080 DATA 3,255,192

1090 DATA 3,195,192

1100 DATA 3,195,192

1110 DATA 3,195,192

1120 DATA 3,195,192

1130 DATA 3,255,192

1140 DATA 3,255,192

1150 DATA 0,255,0

1160 DATA 63,255,252

1170 DATA 60,0,60

1180 DATA 63,255,252

1190 DATA 60,0,60

1200 DATA 0,0,0

Od linije 1000 do 1200 su podaci o izgledu našeg sprajta

Postoje još razne mogućnosti koje možemo uraditi sa sprajtovima (kao što je detekcija sudara dva sprajta ili sprajta sa pozadinom i td.). Videćemo ih u praktičnom radu

Multikolorni sprajt

Ovaj sprajt je dimenzije 12×21 tačaka u četri boje (boja lica, dodatna boja 1, dodatna boja 2 i providnost-boja pozadine)

Što se tiče rada sa multikolornim sprajtom najlakše je ako napravimo dva šablona (glavni i pomoćni). Takođe radi lakšeg orentisanja redovi šablona su obojeni. Sve to ovako izgleda:

Glavni šablon:                           

                          

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

 

Prvo možete primetiti da je šablon duplo manji po horizontali od šablona za sprajt visoke rezolucije. Razlog je što se odvajaju po dva bita za jednu tačku i ova dva bita daju 4 kombinacije (tri boje plus transparencija). To takođe znači da je multikolor tačka dva puta veća po horizontali od tačke visoke rezolucije.

U ovoj formi uneli bismo kako želimo da izgleda naš multikolorni sprajt i upisivali bi smo oznake za boje npr. P-plava, C-crvena, B-crna itd. Zatim bi smo dodelili kombinacije P-01, C-11, B-10. Četvrta kombinacija 00 je transparentna – vidi se pozadina.

Onda bi smo sve te kombinacije po bojama uz glavnog šablona uneli u pomoćni koji izgleda ovako:

 

                                 B I N A R N E   V R E D N O S T I                                   decimalne vrednosti

red765432107654321076543210
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

 

Da vidimo primer kako bi to sve izgledalo:

C – CRVENA – 01

Z – ZELENA – 10

P – PLAVA – 11

“  “ – TRANSPARENTNA (BOJA KOJA JE ODREĐENA POZADINOM) – 00

                          

                          

1
2ZZZZZZZZZZ
3ZPPPPPPPPZ
4ZPPPPPPPPZ
5ZPCCCCCCPZ
6ZPCCCCCCPZ
7ZPCCPZ
8ZPCCPZ
9ZPCCPZ
10ZPCCPZ
11ZPCCPZ
12ZPCCPZ
13ZPCCPZ
14ZPCCPZ
15ZPCCCCCCPZ
16ZPCCCCCCPZ
17ZPPPPPPPPZ
18ZPPPPPPPPZ
19ZZZZZZZZZZ
20
21

 

Sada ćemo zameniti ove oznake sa bitovima koje smo malopre dali za svaku boju C- crvena – 01, Z- zelena – 10, P- plava – 11, prazna mesta sa 00 i sve ovo uneti u pomoćnoj formi. Zatim ćemo tako dobijene kombinacije prevesti u decimalne brojeve

 

 

                                  B I N A R N E   V R E D N O S T I                                 decimalne vrednosti

red765432107654321076543210
1000000000000000000000000000
200101010101010101010100042170168
300101111111111111111100047255248
400101111111111111111100047255248
50010110101010101011110004585120
60010110101010101011110004585120
7001011010000000001111000450120
8001011010000000001111000450120
9001011010000000001111000450120
10001011010000000001111000450120
11001011010000000001111000450120
12001011010000000001111000450120
13001011010000000001111000450120
14001011010000000001111000450120
150010110101010101011110004585120
160010110101010101011110004585120
1700101111111111111111100047255248
1800101111111111111111100047255248
1900101010101010101010100042170168
20000000000000000000000000000
21000000000000000000000000000

 

Ostaje nam još da ovaj sprajt prenesemo u memoriju računara i prikažemo ga. To postižemo na sledeći način:

 

10 FOR I=832 TO 894

20 READ M

30 POKE I,M

40 NEXT I

50 POKE 53269,1

60 POKE 2040,13

70 POKE 53248,170:POKE 53264,0

80 POKE 53249,70

90 REM POKE 53264,1: POKE 53271,1

Od programske linije 10 do 90 je potpuno identično kao kod sprajta visoke rezolucije

100 POKE 53276,1

U ovoj memorijskoj adresi uključujemo multikolor za prvi sprajt (svaki bit jedan sprajt 0-7)

110 POKE 53287,5

Ova adresa određuje boju kod kombinacije 10 za multikolor tačku. Takođe ova boja jedina može biti različita od ostalih multikolor sprajtova (adrese se kreću od 53287-prvi do 53295-osmi sprajt). Kao što vidite to su iste adrese koje koristimo i za jedinu boju kod visokorezolucijskog sprajta.

120 POKE 53285,2

Ova adresa određuje boju kod kombinacije 01 za multikolor tačku

130 POKE 53286,3

Ova adresa određuje boju kod kombinacije 11 za multikolor tačku

Kombinacija 00 je transparentna (vidi se pozadina) i samim tim nema memorijsku adresu za boju

1000 DATA 0,0,0

1010 DATA 42,170,168

1020 DATA 47,255,248

1030 DATA 47,255,248

1040 DATA 45,85,120

1050 DATA 45,85,120

1060 DATA 45,0,120

1070 DATA 45,0,120

1080 DATA 45,0,120

1090 DATA 45,0,120

1100 DATA 45,0,120

1110 DATA 45,0,120

1120 DATA 45,0,120

1130 DATA 45,0,120

1140 DATA 45,85,120

1150 DATA 45,85,120

1160 DATA 47,255,248

1170 DATA 47,255,248

1180 DATA 42,170,168

1190 DATA 0,0,0

1200 DATA 0,0,0

Od linije 1000 do 1200 su podaci o izgledu našeg multikolornog sprajta. Sve ostalo što je rečeno za visokorezolucijski sprajt važi i za multikolorni.

Naravno tu postoje i razne programske cake. Naprimer ako nam treba jedna sličica za koju želimo da bude visokorezolucije ali da ime više boja možemo uključiti više visokorezolucijskih sprajtova raznih boja i staviti jedan preko drugog i koristeći transparenciju izmeštati boje po želji i još mnogo interesantnih stvari.

Krenimo sa današnjom lekcijom

Danas ćemo naučiti još neke funkcije

LEFT$ – Uzimanje iz tekstualne promenljive željeni broj karaktera počev od leve strane 

                sadržaja zadate promenljive

Format funkcije je:

LEFT$ (A$,B)

Često nam je potrebno da iz neke tekstualne promenljive izdvojimo željene karaktere. Ova funkcija nam omogućava da to uradimo počev od leve strane teksta u zadatoj promenljivoj i da uzmemo onoliko karaktera koliko navedemo pod  Argumentom „B“ (Argument može da bude broj ili promenljiva). Rezultat možemo odmah prikazati ili ga smestiti u neku željenu tekstualnu promenljivu

Primer:

10 A$=“PRVI DRUGI TRECI“

20 PRINT LEFT$(A$,4)

Posle pokretanje programa na ekranu će se ispisati „PRVI“

 

RIGHT$ – Uzimanje iz tekstualne promenljive željeni broj karaktera počev sa desne strane 

                   sadržaja zadate promenljive

Format funkcije je:

RIGHT$ (A$,B)

Ova naredba izvlači iz zadate tekstualne promenljive željene karaktere počev od njene desne strane. Sve ostalo što važi za predhodnu funkciju važi i ovde

Primer:

10 A$=“PRVI DRUGI TRECI“

20 PRINT RIGHT$(A$,5)

Posle pokretanje programa na ekranu će se ispisati „TRECI“

MID$ – Uzimanje iz tekstualne promenljive željeni broj karaktera počev od sredine sadržaja

              zadate promenljive

Format funkcije je:

MID$ (A$,A,B)

Ova naredba će nam iz zadate tekstualne promenljive izvući željene karaktere počev od karaktera zadatog argumentom „A“ za željeni broj karaktera zadatih argumentom „B“. Ostalo je kao i kod dve predhodne funkcije

Primer:

10 A$=“PRVI DRUGI TRECI“

20 PRINT MID$(A$,6,5)

Posle pokretanje programa na ekranu će se ispisati „DRUGI“

Vreme je za nove naredbe i primere.

READ, DATA – čitanje podataka upisanih u program

Ove dve naredbe idu uvek zajedno. Naredba READ čita podatke koje su navedene u naredbi DATA i smešta ih u željene numeričke ili tekstualne promenljive. Veoma korisno kada moramo da unesemo veliku količinu podataka u raznim promenljivima iz programa. Ukoliko pokušamo da unesemo pogrešnu vrednost (tekstualnu umesto numeričku) ili ne bude više podataka prilikom pozivanja naredbe READ dobićemo poruke o grešci „Syntax error“ odnosno „Out of data“

Formati naredbe su:

READ A – DATA 5

READ X$ – DATA „PROBNO“ – možemo upisati znake navoda kod teksta ali nije obavezno

READ A,X$,A(I),X$(M,5)… – DATA 5,PROBNO,1,PRVI…

Primer:

10 PRINT „IME“,“PREZIME“,“BR.BODOVA“

20 FOR I=1 TO 3

30 READ I$,P$,B

40 PRINT I$,P$,B

50 NEXT I

60 DATA ZOKA,ZOKIC,25

70 DATA MIKI,MIKIC,70

80 DATA PETAR,PETROVIC,55

Kada startujemo program u prvom redu 10 će se ispisati zaglavlje. Zatim u programskom redu 20 aktiviramo petlju sa 3 ciklusa. U redu 30 čitamo podatke iz DATA naredbe i iste se smeštaju u tekstualne promenljive I$ (ime),P$ (Prezime) i numeričku promenljivu B (broj bodova). Red 40 štampa ove podatke sa razmakom. Red 50 odrađuje 3 ciklusa i svakim prolazom se učitavaju i štampaju sledeći podaci iz DATA naredbi. Od reda 60 do 80 su DATA podaci koje koristimo. Imajte u vidu da ne moraju da se pišu u posebnom redu za svakog korisnika. To je sve zbog preglednosti inače mogli smo da napišemo u 60 redu DATA ZOKA,ZOKIC,25,MIKI,MIKIC,70,PETAR, PETROVIC,55 dok god može da stane u dva programska reda

Kada se program startuje dobijemo sledeće:

IME          PREZIME          BR.BODOVA

ZOKA       ZOKIC                  25

MIKI         MIKIC                  70

PETAR     PETROVIC           55

 

RESTORE –  Ova naredba omogućava da se čitanje podataka naredbom READ iz naredbe

                        DATA ponovo vrati na prvi podatak u DATA naredbi 

Oblik naredbe:

RESTORE

Primer:

10 FOR I=1TO 10

20 READ A

30 PRINT A,

40 NEXT I

50 RESTORE

60 GOTO 10

70 DATA 3,7,8,9,2,99,2,2,55,77,88,77

U liniji 10 postavljamo petlju sa 10 ciklusa, Programski red 20 čita numerički podatak. Linija 30 štampa taj podatak. Linija 40 završava petlju kada se prestigne zadata krajnja vrednost. To znači da će prikazati 10 podataka datih u data liniji i zanemariti ostale ukoliko ih ima. U programskom redu 50 dajemo naredbu RESTORE kojom čitanje podataka iz DATA naredbe vraćamo na prvi (u našem slučaju na prvi broj 3). Programski red 60 stvara beskonačnu petlju i da nismo dali naredbu RESTORE dobili bi smo poruku o nedostatku podataka „Out of data“. U liniji 70 se nalazi DATA naredba koja sadrži podatke koji će biti pročitani naredbom READ 

GET – Očitavanje pretisnutog tastera

Ova naredba očitava tastaturu i rezultat očitavanja (jedan karakter) smešta u zadate numeričke i tekstualne promenljive.

Ukoliko se traži numerički a pretisne se tekstualni taster dobija se poruka o grešci „Syntax error“

Format naredbe:

GET A$

GET A

GET A$,B$,C$,A,B…

Naredba GET može primiti maksimalno 10 promenljivih.

Primer:

10 GET A$

15 IF A$=“A“ THEN PRINT “ PRITISNUO SI A“;

20 PRINT A$;:GOTO 10

Kada startujemo ovaj program računar će čekati da se pritisne neki taster i kada se to desi ispisaće ga na ekranu osim ako to ne bude slovo A. Ukoliko jeste pojaviće se poruka „Pritisnuo si A“ i program će nastaviće dalje sa ispisom slova koje pretiskate.

Na kraju dana dajmo sebi oduška i napravimo jednu arkadu. Ništa nije bolje od aktiviranje moždanih čelija od ovoga. Zamislite formulu kojoj je cilj da ostane što duže na stazi i samim tim pobere što je moguće više poena. Naravno da ne bude sve ružičasto pobrinule su se prepreke u vidu ograde puta koje ne smete da udarite. Ukoliko se vaša formula sudari sa ogradom 50 puta igri je kraj i daje se ukupni broj poena koji je do tada postignut.

Pa da počnemo sa izradom naše prve, jedinstvene, nikad viđene arkade (obično preterivanje. ali malo marketinga ne može da škodi)

Šalu na stranu krećemo sa programiranjem i pritom ćemo objašnjavati korak po korak

10 PRINT „(SHIFT+CLR/HOME)“

Prvo naravno brišemo ekran

20 XK=170:SU=0:PO=0

Postavljamo početnu vrednost za horizontalni položaj sprajta i brišemo promenljive za detekciju sudara i broja poena

30 GOSUB 11000

Odlazimo na podprogram gde se ispisuje početni ekran i malo uputstvo.zatim se dodeljuju boje okvira,pozadine i karaktera. Takođe setujemo zvuk koji će, koliko toliko, imitirati rad motora

40 GOSUB 10000

Idemo na podprogram gde se učitava i aktivira sprajt kojim ćemo upravljati tokom ove vožnje

50 PRINT „(SHIFT+CLR/HOME)“

Ponovo brišemo ekran

60 L=15:D=15

Ovde imamo početno određivanje veličine leve i desne ivice ograde

70 X$=“ ######################################“

U tekstualnu promenljivu X$ smeštamo jedan razmak i 38 # karaktera koji sačinjavaju ogradu preko cele staze. Ekran može prikazati u jednom redu maksimalno 40 karaktera ali ostavićemo jedan prazan karakter sa leve i desne strane ekrana. Razlog je ukoliko se red ispuni za svih maksimanih 40 karaktera sledeća naredba PRINT će ostaviti jedan prazan red što ne želimo

80 L$=LEFT$(X$,L)

Kod promenljive L$ unosimo levu ivicu ograde koja u početku ima 15 karaktera uzetih iz promenljive X$ sa leve strane

90 M$=“        “

Promenljiva M$ sadrži 9 praznih (space) karaktera i predstavlja put po kome vozimo.

100 D$=RIGHT$(X$,D)

Ovde u promenljivi D$ unosimo desnu ivicu ograde koja takođe u početku ima 15 karaktera uzetih iz promenljive X$ ovog puta sa desne strane. Kada uzmemo u obzir levu ivicu ograde, put i desnu ivicu ograde dobijamo ukupno 39 karaktera u redu. Gore smo napomenuli zašto ne želimo da ih bude 40

110 T=INT(RND(0)*2)+1

U ovom redu formiramo slučajan broj od 1 do 2 i isti unosimo u promenljivu T

120 IF T=1 THEN L=L-1:D=D+1

U slučaju da je vrednost promenljive T = 1 skraćujemo levu ivicu ograde za 1 i povećavamo desnu za 1 (put skreće ulevo)

130 IF T=2 THEN L=L+1:D=D-1

U slučaju da je vrednost promenljive T = 2 uvećavamo levu ivicu ograde za 1 i skraćujemo desnu za 1 (put skreće udesno)

140 IF L=0 THEN L=L+1:D=D-1

U slučaju da smo došli do same krajnje leve ivice ograde uvećavamo levu ivicu za 1 i umanjujemo desnu za 1 (sprečavamo da put skroz nestane na levoj strani ekrana)

150 IF D=0 THEN D=D+1:L=L-1

U slučaju da smo došli do same krajnje desne ivice ograde uvećavamo desnu ivicu za 1 i umanjujemo levu za 1 (sprečavamo da put skroz nestane na desnoj strani ekrana)

160 PRINT L$+M$+D$

Ova programska linija prikazuje trenutnu levu ivicu ograde,put i trenutnu desnu ivicu ograde i samim tim daje nam stazu po kojoj vozimo.

170 POKE 54273,20:POKE 54273,25

U ovoj programskoj liniji povećavamo i smanjujemo visinu tona i na taj način imitiramo zvuk motora

180 GOSUB 9000

Odlazimo na podprogram u kojem upravljamo vozilom, proveravamo da li je došlo do sudara i ako ih je više od 50 završavamo vožnju

190 GOTO 80

Ovde se ponovo vraćamo na programski red 80 i time pravimo beskonačnu petlju sve dok ne bude ispunjen uslov za kraj programa

9000 A=PEEK(197)

Nalazimo se u prvom podprogramu. Ova linija ispituje vrednost u memorijskoj adresi 197 koja služi za očitavanje tastature. Svaki pritisak na taster daje različit broj vezan za isti koji se upisuje na ovoj memorjskoj lokaciji i koji možemo da ispitamo.  Vrednost očitane tastature smeštamo u promenljivu A

9010 IF A=10 THEN XK=XK-5

Ovde proveravamo da li je očitana vrednost jednaka broju 10 što znači da je pritisnut taster A. Ako jeste umanjujemo horizontalnu poziciju sprajta za 5 – skretanje ulevo (Ako je umanjimo samo za 1 vozilo se presporo kreće da bi moglo da izbegne prepreku)

9020 IF XK<20 AND IN=0 THEN XK=20

U slučaju da je XK promenljiva (X hotizontalna kordinata vozila) manja od 20 i indikator IN je nula u XK stavljamo vrednost 20 da vozilo ne bi više moglo da ide u levo i tako nestane sa ekrana. Zbog čega nam je potreban indikator IN? Ovaj indikator će biti jednak 1 kada budemo pokretali vozilo na desnu stranu i pređemo vrednost X kordinate od 255.  Kada je na nuli znači da nije pređena ova vrednost

9025 IF XK<0 AND IN=1 THEN XK=255:POKE 53264,0:IN=0

Ovde imamo ispitivanje da li je kordinata vozila manja od nule i indikator IN jednak jedinici što znači da je vozilo prešlo granicu od 255 tačaka. Iz tog razloga gasimo deveti bajt prvog sprajta koji teži 256, za kordinatu vozila stavljamo vrednost 255 i poništavamo indikator

9030 IF A=18 THEN XK=XK+5

U slučaju da je očitana vrednost tastature jednaka broju 18 znači da je pritisnut taster D. Onda   uvećavamo horizontalnu poziciju sprajta za 5 – skretanje udesno

9040 IF XK>255 THEN XK=0:POKE 53264,1:IN=1

U slučaju da je XK promenljiva veća od 255 to znači da izlazimo iz opseka mogućnosti osmobitnog broja pa je potrebno uključiti deveti bajt sprajta koji se nalazi na adresi 53264 (svaki bit za jedan sprajt 0-7) i postaviti promenljivu XK na nulu (deveti sprajt nosi težinu 256 + vrednost promenljive/X kordinate). Inače kao što rekosmo sprajt po horizontali može ići do 320 tačaka

9050 IF XK>64 AND IN=1 THEN XK=XK-5

Ovde proveramo da li je horizontalna vrednost veća od 64 i da li je indikator IN jednak jedinici. Ako jeste to znači da smo prešli granicu od 320 tačaka (256+64) i da vozilo ne bi dalje išlo udesno i samim tim nestalo sa ekrana umanjujemo kordinatu za 5.

9200 POKE 53248,XK

Unosimo u memorijsku adresu horizontalne kodinate prvog sprajta vrednost XK promenljive i samim tim pokrećemo vozilo levo/desno zavisno od ispunjenja gore datih uslova

9210 PO=PO+1

Povećavamo vrednost poena igrača za 1

9300 IF PEEK(53279)=1 THEN PRINT „SUDAR“;SU:SU=SU+1

Ovde testiramo da li je došlo do sudara sprajta sa pozadinom (koju čini bilo koji karakter) i ukoliko jeste setuje se bit sprajta kod koga je došlo do sudara (u našem slučaju prvi sprajt, svaki sprajt ima svoj bit od 0 do 7) u memorijskoj lokaciji 53279 zaduženoj za detekciju sudara sa pozadinom. Ukoliko je došlo do sudara ispisuje se „SUDAR“ i broj koliko je sudara do tada došlo (Ako vam smeta ovo ispisivanje izbacite ga. Lično mislimo da je interesantno i doprinosi tenziji igre pogotovo kada je put gotovo na samoj levoj ivici jer onda ima veoma mali prostor za manervisanje). Zatim se promenljiva SU povećava za 1

9310 IF SU>50 THEN GOTO 12000

Ukoliko je promenljva SU veća od 50 došlo je do više od 50 sudara i program odlazi na programsku liniju 12000 gde se ispisuju poeni, postavlja pitanje za novu igru i ukoliko odgovorimo sa N program se završava

9500 RETURN

Povratak na naredbu posle GOSUB koja je pozvala ovaj podprogram

10000 FOR I=832 TO 894

U ovom podprogramu formiramo,uključujemo i podešavamo sprajt. Prvo aktiviramo petlju koja će promenljvoj I dodeliti početnu vrednost 832 (memorijska adresa od koje upisujemo sprajt) i ići do krajnje vrednosti 894 (memorijska adresa kojom završavamo upis sprajta)

10010 READ M

Ovde čitamo podatke iz DATA naredbe i vrednost dodeljujemo promenljivoj M

10020 POKE I,M

Unosimo u promenljivoj I koja sadrži lokaciju memorije u kojoj se unosi sprajt vrednost  promenljive M koja je očitana iz DATA naredbi

10030 NEXT I

Završavamo petlju unosom svih 63 bajta opisa sprajta u memoriju rezervisanu za čuvanje istog

10140 POKE 53269,1

Memorijska adresa 53269 uključuje prvi sprajt unosom vrednosti 1 (svaki sprajt ima svoj bit od 0 do 7)

10150 POKE 2040,13

Adresa 2040 određuje u kom bloku memorije od 64 bajta se nalazi upisan sprajt. U ovom slučaju to je blok 13 (13*64=832) (2040-prvi,… 2047-osmi sprajt)

10160 POKE 53248,170:POKE 53264,0

Postavljamo poćetnu horizontalnu vrednost X kordinate sprajta u memorjskoj lokaciji 53248 za prvi sprajt (53248-prvi,53250-drugi,  … 53262-osmi sprajt) na 170. Deveti bit u memoriskoj lokaciji 53264 je resetovan (na nuli)

10170 POKE 53249,70

Postavljamo vrednost Y kordinate prvog sprajta na 70 (53249-prvi,53251-drugi… 53263-osmi sprajt)

10180 POKE 53287,3

Postavljamo vrednost boje za prvi sprajt. (53287-prvi,53288-drugi,… 53294-osmi sprajt)

10210 RESTORE

Vraćamo čitač DATA podataka na prvi podatak

10220 RETURN

Povratak na glavni program

10500 DATA 0,0,0

10510 DATA 0,0,0

10520 DATA 60,0,60

10530 DATA 63,255,252

10540 DATA 63,255,252

10550 DATA 63,255,252

10560 DATA 63,255,252

10570 DATA 3,255,192

10580 DATA 3,255,192

10590 DATA 3,195,192

10600 DATA 3,195,192

10610 DATA 3,195,192

10620 DATA 3,195,192

10630 DATA 3,255,192

10640 DATA 3,255,192

10650 DATA 0,255,0

10660 DATA 63,255,252

10670 DATA 60,0,60

10680 DATA 63,255,252

10690 DATA 60,0,60

10700 DATA 0,0,0

Od programske linije 10500 do 10700 su podaci izgleda našeg sprajta

11000 PRINT „(SHIFT+CLR/HOME)(CTRL+2)“

Ovaj podprogram ispisuje početni ekran. Prvo se ekran briše i boja karaktera postavlja na belu

11010 PRINT „TRKA FORMULE 1“;

11020 PRINT „KOMANDE SU A – LEVO, D – DESNO“

11030 PRINT „TREBA IZDRZATI STO DUZE I ZARADITI STO VISE POENA“

11040 PRINT „MOZETE NAPRAVITI NAJVISE 50 SUDARA“

11045 PRINT „BILO KOJI TASTER ZA POCETAK IGRE“

Od programske linije 11010 do 11045 ispisuje se naslov i uputstvo za igrače

11050 POKE 53280,3:POKE 53281,12

Postavljamo boju okvira na svetlo plavu a pozadinu na svetlo sivu (imitacija asfalta, ima smisla zar ne?)

11060 GET A$:IF A$=““ THEN GOTO 11060

U ovoj programskoj liniji očitavamo tastaturu pomoću GET naredbe i smeštamo vrednost pritisnutog tastera u promenljivu A$. Ukoliko nije pretisnut nijedan taster odlazimo ponovo na istu liniju (dok ne pretisnemo neki taster ne idemo dalje )

11070 FOR I=54272 TO 54300:POKE I,0:NEXT I

Ovde brišemo sve parametre za zvuk i setujemo isti za korišćenje

11080 POKE 54296,8

Jačina zvuka na 8 (maksimalno 15)

11090 POKE 54278,240

Aktiviranje stalnog zvuka prvog kanala

11100 POKE 54276,33

Postavljanje oblika zvuka prvog kanala na testerasti

11120 POKE 54272,100: POKE 54273,20

Početna visina tona prvog kanala (niži i viši bajt)

11200 RETURN

Povratak na glavni program

12000 PRINT „(SHIFT+CLR/HOME)FORMULA JE SUVISE OSTECENA. IGRI JE KRAJ“

Od ove linje počinje završetak programa. Brišemo ekran, ispisujemo poruku o oštećenju vozila

12010 PRINT „ZARADIO SI UKUPNO“;PO;“POENA“:POKE 53269,0

Ispisujemo koliko je poena ostvareno i gasimo prvi i jedini sprajt. Ako ovo ne uradimo sprajt ostaje na ekranu i posle završetka programa

12020 FOR I=54272 TO 54300:POKE I,0:NEXT I

Prekidamo zvuk (brišemo sve njegove parametere). Ako ovo ne učinimo čućemo zvuk i posle završetka programa

12030 PRINT „MOZE JOS JEDNA IGRA? (M/N)“

Ovde postavljamo pitanje za još jednu igru. Pitate se zašto umesto D/N (DA/NE) stoji M/N (MOŽE/NEMOŽE). Tako je, pogodili ste.  Pošto za kretanje koristimo A i D tastere velika je verovatnoća da ćemo držati pritisnut taster D kada dođe do poslednjeg 50 sudara i samim tim odmah startovti novu igru

12040 GET A$:IF A$=““ THEN GOTO 12040

Pomoću naredbe A$ očitavamo tastaturu. Ako nije pretisnut nijedan taster vrtiće se u petlji. Možda ste se pitali zašto smo za upravljanje sprajtom koristili čitanje memorijske adrese 197 i ispitivali njenu vrednost a ne naredbu GET. Odgovor je prost, naredba GET čeka da se taster stisne i u stalnoj je petlji dok se to ne desi, a memorijska adresa 197 vrši stalno očitavanje tastature bez obzira da li je taster pritisnut ili ne i samim tim program se ne prikida dok se ne pretisne željeni taster

12050 IF A$=“M“ THEN GOTO 10

Ukoliko je pritisnut taster M idemo na novu igru

12060 IF A$=“N“ THEN END

Ukoliko je pritisnut taster N igri je kraj

12070 GOTO 12040

Ukoliko nije pritisnut nijedan od traženih tastera ponovo se vraćamo na očitavanje tastature

Kao što ste videli uz malo truda može se napraviti arkadna igrica i u bejziku. Naravno sve je to sporo i nezgrapno, pa zamislte da još ima više od jednog sprajta koji kontrolišete… Ali ako išta više morate se složiti da je bilo zabavno. Pokušajte da dodate nešto ovom programu. Npr. umesto jednobojnog sprajta ubacite multikolor (formula u tri boje + transparentna). Prilikom krajnjeg sudara učinite da formula izgleda kao da je pretrpela veliko oštećenje, stavite drugi karakter koji više liči na ogradu puta, promenite zvuk da bolje imitira rad motora i još mnogo toga šta vam padne na pamet.

Ovim završavamo za danas.

Tabela u excel formatu za lakše izračunavanje  downloadKreiranje sprajtova

Skini lekciju u pdf formatu z aofline čitanjeLekcija peta

Uživajte u programiranju na starom dobrom debeljku (ili C verziji ili emulatoru ili …)

LEKCIJA PRVA LINK

LEKCIJA DRUGA LINK

LEKCIJA TREĆA LINK

LEKCIJA ČETVRTA LINK

LEKCIJA PETA LINK

LEKCIJA ŠESTA LINK

LEKCIJA SEDMA LINK

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *