|
Forum Chrześcijańskie Aby wszyscy stanowili jedno Jn 17,21
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
Wysłany: Pią 6:27, 22 Sty 2021 Temat postu: Raycasting 3D QuickBasic |
|
|
REM ta wersja programu zajmuje sie glownie obrazkiem na scianie
REM poprzednie proby znikna ze scian
DEF SEG = 0
SCREEN 13: COLOR 15
TYPE rekord
znak AS STRING * 1
poczatek AS INTEGER
koniec AS INTEGER
xwtabl AS INTEGER
ywtabl AS INTEGER
wysokosc AS INTEGER
END TYPE
DIM elementy(0 TO 310) AS rekord
DIM sinus(0 TO 3599)
DIM cosinus(0 TO 3599)
DIM t$(0 TO 99)
REM deklaracje tych zmiennych maja na celu ograniczenie ich wielkosci
REM czyli zwiekszenia predkosci
DIM xgracza AS INTEGER, ygracza AS INTEGER
DIM kier AS INTEGER, K AS INTEGER, kat AS INTEGER
DIM n AS INTEGER, ktora AS INTEGER
REM tworzenie tablicy sinusow i cosinisow
REM podawanych w stopniach * 10
pi = 3.14159
REM przelicznik stopni na radiany xrad=(pi*xstop)/180
FOR I = 0 TO 3599
s = SIN((pi * I / 10) / 180)
c = COS((pi * I / 10) / 180)
sinus(I) = INT(s * 100) / 100
cosinus(I) = INT(c * 100) / 100
NEXT I
REM tablica labiryntu
t$(0) = "#####################################################################################################"
t$(1) = "#KCBDBCBD0QRSQRSQRSQRSQRSQRSQRSQRSQRSQRSQRSQRSQRSQRSQRS====CBDBCBDBCBDBCBDBCBDBCBDBC===============K#"
t$(2) = "#G.................................................................................................I#"
t$(3) = "#E.................................................................................................I#"
t$(4) = "#F..:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::..I#"
t$(5) = "#E..:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::..I#"
t$(6) = "#G..:::::::::///////////////////////////////:::::::::::::::::::::::::::::::::::::::::::::::::::::..I#"
t$(7) = "#E.........::///////////////////////////////::.....................................................I#"
t$(8) = "#F.........:://%%%%%%%%%%%%%%%%%%%%%%%%%%%//::.....................................................I#"
t$(9) = "#K======K..:://%%%%%%%%%%%%%%%%%%%%%%%%%%%//::..K==================================================K#"
t$(10) = "########I..:://%%>>>>>>>>>>>>>>>>>>>>>>>%%//::..I###################################################"
t$(11) = "#K======K..:://%%%%%%%%%%%>>>>%%%%%%%%%%%%//::..K====================K#"
t$(12) = "#G.........:://%%%%%%%%%%%>>>>%%%%%%%%%%%%//::.......................G#"
t$(13) = "#E.........::///////////%%>>>>%%////////////::.......................E#"
t$(14) = "#F..:::::::::///////////%%>>>>%%////////////:::::::::::::::::::::::..F#"
t$(15) = "#E..:::::::::::::::::://%%>>>>%%//:::::::::::::::::::::::::::::::::..E#"
t$(16) = "#G..:::::::::::::::::://%%>>>>%%//:::::::::::::::::::::::::::::::::..G#"
t$(17) = "#E..................:://%%>>>>%%//::.................................E#"
t$(18) = "#F..................:://%%>>>>%%//::.................................F#"
t$(19) = "#K===============K..:://%%>>>>%%//::..KDBCBDBCBDBCBDBCBDBCBDBCBDBCBDBK#"
t$(20) = "#################I..:://%%>>>>%%//::..I################################################"
t$(21) = "#################I..:://%%>>>>%%//::..KYXYWYXYW======================================K#"
t$(22) = "#################I..:://%%>>>>%%//::.................................................G#"
t$(23) = "#K===============K..:://%%>>>>%%//::.................................................E#"
t$(24) = "#I..................:://%%>>>>%%//:::::::::::::::::::::::::::::::::::::::::::::::::..F#"
t$(25) = "#I..................:://%%>>>>%%//:::::::::::::::::::::::::::::::::::::::::::::::::..E#"
t$(26) = "#I..:::::::::::::::::://%%>>>>%%//////////////////////:::::::::::::::::::::::::::::..G#"
t$(27) = "#I..............:::::://%%>>>>%%//////////////////////::.............................E#"
t$(28) = "#I..............:://////%%>>>>%%%%%%%%%%%%%%%%%%%%%%//::.............................F#"
t$(29) = "#K===========K..:://////%%>>>>%%%%%%%%%%%%%%%%%%%%%%//::..KDBCBDBCBDBCBDBCBDBCBDBCBDBK#"
t$(30) = "#############I..:://%%%%%%>>>>>>>>>>>>>>>>>>>>>>>>%%//::..I############################"
t$(31) = "#KBCBDBCBDBCBK..:://%%%%%%>>>>>>>>>>>>>>>>>>>>>>>>%%//::..K==========K#"
t$(32) = "#I..............:://%%>>>>>>>>>>>>>>>>>>>>>>>>>>>>%%//::.............G#"
t$(33) = "#I..............:://%%>>>>>>>>>>>>>>>>>>>>>>>>>>>>%%//::.............E#"
t$(34) = "#I..:::::::::::::://%%%%%%%%%%%%%%%%>>>>>>>>>%%%%%%%//:::::::::::::..F#"
t$(35) = "#I..:::::::::///////%%%%%%%%%%%%%%%%>>>>>>>>>%%%%%%%//:::::::::::::..E#"
t$(36) = "#I.........:://///////////////////%%>>>>>>>>>%%//::..................G#"
t$(37) = "#I.........:://%//////////////////%%>>>>>>>>>%%//::..................E#"
t$(38) = "#K======K..:://%//:::::::::::::://%%>>>>>>>>>%%//::..K===============K#"
t$(39) = "########I..:://%//:::::::::::::://%%>>>>>>>>>%%//::..I#########################################"
t$(40) = "#K======K..:://%//::..........:://%%>>>>>>>>>%%//::..K=======================================K#"
t$(41) = "#G.........:://%//::..........:://%%>>>>>>>>>%%//::..........................................I#"
t$(42) = "#E.........:://%//::..KSRQ=K..:://%%>>>>>>>>>%%//::..........................................I#"
t$(43) = "#F..::::::::://%//::..I####I..:://%%>>>>>>>>>%%//::::::::::::::::::::::::::::::::::::::::::..I#"
t$(44) = "#E..::::::::://%//::..I####I..:://%%%%%%%%%%%%%//::::::::::::::::::::::::::::::::::::::::::..I#"
t$(45) = "#G..:://///////%//::..I####I..:://%%%%%%%%%%%%%//::..........................................I#"
t$(46) = "#E..:://///////%//::..I####I..:://///////////%%//::..........................................I#"
t$(47) = "#F..:://%%%%%%%%//::..I####I..:://///////////%%//::..KDBCBDBCBDBCBDBC========================K#"
t$(48) = "#E..:://%%%%%%%%//::..I####I..::::::::::::://%%//::..I#################"
t$(49) = "#G..:://%%>>>>%%//::..I####I..::::::::::::://%%//::..K===============K#"
t$(50) = "#E..:://%%>>>>%%//::..I####I.............:://%%//::..................I#"
t$(51) = "#F..:://%%>>>>%%//::..I####I.............:://%%//::..................I#"
t$(52) = "#E..:://%%>>>>%%//::..I####K==========K..:://%%//::::::::::::::::::..I############"
t$(53) = "#G..:://%%>>>>%%//::..I###############G..:://%%//::::::::::::::::::..KBCBDBCBDBCK#"
t$(54) = "#E..:://%%>>>>%%//::..I###############E..:://%%//////////////////::.............I#"
t$(55) = "#F..:://%%>>>>%%//::..I###############F..:://%%//////////////////::.............I#######"
t$(56) = "#E..:://%%>>>>%%//::..I###############E..:://%%%%%%%%%%%%%%%%%%//:::::::::::::..K=====I#"
t$(57) = "#I..:://%%>>>>%%//::..I###############G..:://%%%%%%%%%%%%%%%%%%//:::::::::::::........G#"
t$(58) = "#I..:://%%>>>>%%//::..I###############E..:://%%>>>>>>>>>>>>>>%%/////////////::........E#"
t$(59) = "#I..:://%%>>>>%%//::..I###############G..:://%%>>>>>>>>>>>>>>%%/////////////::::::::..F#"
t$(60) = "#I..:://%%>>>>%%//::..I###############E..:://%%>>>>>>>>>>>>>>%%%%%%%%%%%%%////////::..E#"
t$(61) = "#I..:://%%>>>>%%//::..I###############F..:://%%>>>>>>>>>>>>>>%%%%%%%%%%%%%////////::..G#"
t$(62) = "#I..:://%%>>>>%%//::..I###############E..:://%%>>>>>>>>>>>>>>>>>>>>>>>>>%%%%%%%%//::..E#"
t$(63) = "#I..:://%%>>>>%%//::..I###############G..:://%%>>>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//::..F#"
t$(64) = "#I..:://%%>>>>%%//::..I###############E..:://%%>>>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//::..E#"
t$(65) = "#I..:://%%>>>>%%//::..I###############F..:://%%>>>%%//////////////////////%%>>%%//::..G#############################"
t$(66) = "#I..:://%%>>>>%%//::..I###############E..:://%%>>>%%//////////////////////%%>>%%//::..K===========================K#"
t$(67) = "#I..:://%%>>>>%%//::..I###############I..:://%%>>>%%//:::::::::::::::::://%%>>%%//::..............................I#"
t$(68) = "#I..:://%%>>>>%%//::..I###############I..:://%%>>>%%//:::::::::::::::::://%%>>%%//::..............................I#"
t$(69) = "#I..:://%%>>>>%%//::..K===============K..:://%%>>>%%//::..............:://%%>>%%//::::::::::::::::::::::::::::::..I#"
t$(70) = "#I..:://%%>>>>%%//::.....................:://%%>>>%%//::..............:://%%>>%%//::::::::::::::::::::::::::::::..I###########"
t$(71) = "#I..:://%%>>>>%%//::.....................:://%%>>>%%//::..K========K..:://%%>>%%//////////////////////////////::..K=========K#"
t$(72) = "#I..:://%%>>>>%%//::::::::::::::::::::::::://%%>>>%%//::..G########I..:://%%>>%%//////////////////////////////::............I#"
t$(73) = "#I..:://%%>>>>%%//::::::::::::::::::::::::://%%>>>%%//::..E########I..:://%%>>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//::............I#"
t$(74) = "#G..:://%%>>>>%%//::.....................:://%%>>>%%//::..F########I..:://%%>>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//::::::::::::..G#"
t$(75) = "#E..:://%%>>>>%%//::.....................:://%%>>>%%//::..E########I..:://%%>>>>>>>>>>>>%%////////////////////::::::::::::..E#"
t$(76) = "#F..:://%%>>>>%%//::..K===============K..:://%%>>>%%//::..G########I..:://%%>>>>>>>>>>>>%%//////////////////////////////::..F#"
t$(77) = "#E..:://%%>>>>%%//::..I###############E..:://%%>>>%%//::..E########I..:://%%>>>>>>>>>>>>%%//::::::::::::::://///////////::..E#"
t$(78) = "#G..:://%%>>>>%%//::..I###############G..:://%%>>>%%//::..F########I..:://%%>>>>>>>>>>>>%%//::::::::::::::://%%%%%%%%%//::..G#"
t$(79) = "#E..:://%%>>>>%%//::..I###############E..:://%%>>>%%//::..E########I..:://%%>>>>>>>>>>>>%%//::...........:://%%>>>>>%%//::..E#"
t$(80) = "#F..:://%%>>>>%%//::..I###############F..:://%%>>>%%//::..G########I..:://%%>>>>>>>>>>>>%%//::...........:://%%>>>>>%%//::..F###########"
t$(81) = "#E..:://%%>>>>%%//::..I###############E..:://%%>>>%%//::..E########I..:://%%>>>>>>>>>>>>%%//::..K=====K..:://%%>>>>>%%//::..K=========K#"
t$(82) = "#G..:://%%>>>>%%//::..I###############G..:://%%>>>%%//::..F########I..:://%%>>>>>>>>>>>>%%//::..I#####I..:://%%>>>>>%%//::............G#"
t$(83) = "#E..:://%%>>>>%%//::..I###############E..:://%%>>>%%//::..E########I..:://%%>>>>>>>>>>>>%%//::..I#####I..:://%%>>>>>%%//::............E#"
t$(84) = "#F..:://%%>>>>%%//::..I###############F..:://%%>>>%%//::..G########I..:://%%>>>>>>>>>>>>%%//::..I#####I..:://%%>>>>>%%//::::::::::::..F#"
t$(85) = "#E..:://%%>>>>%%//::..I###############E..:://%%>>>%%//::..E########I..:://%%>>>>>>>>>>>>%%//::..I#####I..:://%%>>>>>%%//::::::::::::..E#"
t$(86) = "#G..:://%%>>>>%%//::..I###############G..:://%%>>>%%//::..F########I..:://%%>>>>>>>>>>>>%%//::..K=====K..:://%%>>>>>%%////////////::..G#"
t$(87) = "#E..:://%%>>>>%%//::..I###############E..:://%%>>>%%//::..E########I..:://%%>>>>>>>>>>>>%%//::...........:://%%>>>>>%%////////////::..E#"
t$(88) = "#F..:://%%>>>>%%//::..I###############F..:://%%>>>%%//::..G########I..:://%%>>>>>>>>>>>>%%//::...........:://%%>>>>>%%%%%%%%%%%%//::..F#"
t$(89) = "#E..:://%%>>>>%%//::..I###############E..:://%%>>>%%//::..E########I..:://%%>>>>>>>>>>>>%%//::::::::::::::://%%>>>>>%%%%%%%%%%%%//::..E#"
t$(90) = "#G..:://%%%%%%%%//::..I###############G..:://%%%%%%%//::..F########I..:://%%%%%%%%%%%%%%%%//::::::::::::::://%%%%%%%%%%%%%%%%%%%//::..G#"
t$(91) = "#E..:://%%%%%%%%//::..I###############E..:://%%%%%%%//::..E########I..:://%%%%%%%%%%%%%%%%///////////////////%%%%%%%%%%%%%%%%%%%//::..E#"
t$(92) = "#F..::////////////::..I###############F..::///////////::..G########I..:://////////////////////////////////////////////////////////::..F#"
t$(93) = "#E..::////////////::..I###############E..::///////////::..E########I..:://////////////////////////////////////////////////////////::..E#"
t$(94) = "#G..::::::::::::::::..I###############G..:::::::::::::::..F########I..::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::..G#"
t$(95) = "#E..::::::::::::::::..I###############E..:::::::::::::::..E########I..::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::..E#"
t$(96) = "#G....................I###############G...................G########I..................................................................G#"
t$(97) = "#E....................I###############E...................E########I..................................................................E#"
t$(98) = "#K====================K###############KDBCBDBCBDBCBDBCBDBCK########K====================BCBDBCBDBCBDBCBDBCBD==========================K#"
t$(99) = "########################################################################################################################################"
REM tablica rysunku
a01$ = "000000000808080808085A5A5A5A5A5A5A5A5A5A5A5A00000000000000000000"
a02$ = "00000808080808085A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A000000000000"
a03$ = "000808080808085A5A5A5A5A5A000F5A5A5A5A5A5A5A5A0C0C5A5A5A5A5A0000"
a04$ = "080808080808085A5A5A5A5A0009095A5A5A5A5A5A5A5A5A0C0C5A5A5A5A5A00"
a05$ = "080808080808085A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A0C0C5A5A5A5A5A00"
a06$ = "080808080808085A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A0C0C5A5A5A5A5A00"
a07$ = "080808080808085A5A5A5A5A0009095A5A5A5A5A5A5A5A5A0C0C5A5A5A5A5A00"
a08$ = "000808080808085A5A5A5A5A5A000F5A5A5A5A5A5A5A5A0C0C5A5A5A5A5A0000"
a09$ = "00000808080808085A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A0000000000"
a10$ = "000000000808080808085A5A5A5A5A5A5A5A5A5A5A5A00000000000000000000"
a11$ = "000000002F2F2F2F000000004F4F4F4F000000006A6A6A6A000000003D3D3D3D"
a12$ = "1F1F1F1F000000003F3F3F3F000000007A7A7A7A000000002C2C2C2C00000000"
REM **************************** dane startowe
dal = 150
kier = 0: REM 0 stopni
xgracza = 25
ygracza = 20
REM ************************************* petla glowna
powtorz:
REM ********** PETLA FOR - BADANIE KOLEJNYCH KATOW
REM t1 i t2 - pomiar predkosci
REM petla for liczona jest w stopniach
REM zmienna k bezposrednio wyznacza tutaj takze wspolrzedna ekranu
REM kier - kierunek gracza, kat - kierunek badania widocznosci
REM xb, yb - wspolrzedne badanych punktow
REM zostana zaokraglone dopiero po stwierdzeniu sciany
ktora = -1
t1 = PEEK(1132)
FOR K = -150 TO 150 STEP 5
ktora = ktora + 1
kat = K + kier
IF kat < 0 THEN kat = 3600 + kat
IF kat > 3599 THEN kat = kat - 3600
xb = xgracza: REM x badania
yb = ygracza: REM y badania
c = cosinus(kat): s = sinus(kat)
REM petla badania widocznosci
petla:
xb = xb + c: yb = yb + s
znak$ = MID$(t$(INT(yb)), INT(xb) + 1, 1)
IF znak$ = ":" THEN xb = xb + c + c: yb = yb + s + s: znak$ = MID$(t$(INT(yb)), INT(xb) + 1, 1): GOTO omin
IF znak$ = "/" THEN xb = xb + c * 4: yb = yb + s * 4: znak$ = MID$(t$(INT(yb)), INT(xb) + 1, 1): GOTO omin
IF znak$ = "%" THEN xb = xb + c * 6: yb = yb + s * 6: znak$ = MID$(t$(INT(yb)), INT(xb) + 1, 1): GOTO omin
IF znak$ = ">" THEN xb = xb + c * 8: yb = yb + s * 8: znak$ = MID$(t$(INT(yb)), INT(xb) + 1, 1)
omin:
IF znak$ <> "." AND znak$ <> ":" AND znak$ <> "/" AND znak$ <> "%" AND znak$ <> ">" THEN
xb = INT(xb): yb = INT(yb)
dx = xgracza - xb: dy = ygracza - yb
odleglosc = SQR(dx ^ 2 + dy ^ 2)
wys = INT((dal / odleglosc) * 7)
COLOR 28: REM KOLOR DLA ELEMENTOW NIEOKRESLONYCH
IF znak$ = "K" THEN COLOR 28
IF znak$ = "I" THEN COLOR 26
IF znak$ = "=" THEN COLOR 30
REM wpis do tablicy
elementy(ktora).znak = znak$
elementy(ktora).xwtabl = xb
elementy(ktora).ywtabl = yb
elementy(ktora).wysokosc = wys
IF wys > 0 THEN GOSUB linia
GOTO wyjscie
END IF
GOTO petla
wyjscie:
NEXT K
GOSUB dotablicy
t2 = PEEK(1132)
REM koniec rysowania planszy
COLOR 15: LOCATE 1, 1: PRINT "dt="; t2 - t1
REM ************* gracz ma wplyw na kolejny ruch
czekaj:
I$ = INKEY$
IF I$ = "" THEN GOTO czekaj
POKE 1050, PEEK(1052): REM czyszczenie bufora klawiatury
IF I$ = CHR$(0) + "K" THEN kier = kier - 50
IF I$ = CHR$(0) + "M" THEN kier = kier + 50
IF kier < 0 THEN kier = 3600 + kier: REM plus czyli tutaj minus
IF kier > 3599 THEN kier = kier - 3600
IF I$ = CHR$(0) + "H" THEN GOSUB WPRZOD
IF I$ = CHR$(0) + "P" THEN GOSUB wtyl
GOTO powtorz
REM ************************** GOSUB-RETURN dla ruchu wprzod
WPRZOD:
xs = xgracza
ys = ygracza
xgracza = xgracza + cosinus(kier) * 2
ygracza = ygracza + sinus(kier) * 2
REM ****************** zakaz wchodzenia na mur
znak$ = MID$(t$(ygracza), xgracza + 1, 1)
IF znak$ <> "." AND znak$ <> ":" AND znak$ <> "/" AND znak$ <> "%" AND znak$ <> ">" THEN xgracza = xs: ygracza = ys
RETURN
REM *********************** GOSUB-RETURN dla ruchu w tyl
wtyl:
xs = xgracza
ys = ygracza
xgracza = xgracza - cosinus(kier) * 2
ygracza = ygracza - sinus(kier) * 2
REM ****************** zakaz wchodzenia na mur
znak$ = MID$(t$(ygracza), xgracza + 1, 1)
IF znak$ <> "." AND znak$ <> ":" AND znak$ <> "/" AND znak$ <> "%" AND znak$ <> ">" THEN xgracza = xs: ygracza = ys
RETURN
REM *********************** GOSUN RETURN dla rysowania zwyklych linii
REM nie obrazek - obrazek potem
linia:
pomoc1 = K + 150
pomoc2 = K + 150 + 4
IF znak$ = "Q" OR znak$ = "R" OR znak$ = "S" THEN GOTO wroc
REM zwykla linia
LINE (pomoc1, 120 - wys)-(pomoc2, 120 + wys), , BF
wroc:
LINE (pomoc1, 0)-(pomoc2, 120 - wys - 1), 150, BF
LINE (pomoc1, 120 + wys + 1)-(pomoc2, 200), 20, BF
RETURN
REM *******************************************************
REM GOSUB RETURN - przetworzenie danych tablicy ekranowej
dotablicy:
n = ktora
REM badanie poczatku wystpowania elementu - znaku, ale
REM zgadzac musza sie tez jego wspolrzedne w tablicy labiryntu
FOR I = 0 TO n
IF I = 0 THEN elementy(1).poczatek = 0: GOTO konczpetle
IF elementy(I).znak = elementy(I - 1).znak AND elementy(I).xwtabl = elementy(I - 1).xwtabl AND elementy(I).ywtabl = elementy(I - 1).ywtabl THEN elementy(I).poczatek = elementy(I - 1).poczatek: GOTO konczpetle
elementy(I).poczatek = I
konczpetle:
NEXT I
REM w odwrotna strone - badanie konca wystepowanie elementu
FOR I = n TO 0 STEP -1
IF I = n THEN elementy(I).koniec = n: GOTO konczpetle2
IF elementy(I).znak = elementy(I + 1).znak AND elementy(I).xwtabl = elementy(I + 1).xwtabl AND elementy(I).ywtabl = elementy(I + 1).ywtabl THEN elementy(I).koniec = elementy(I + 1).koniec: GOTO konczpetle2
elementy(I).koniec = I
konczpetle2:
NEXT I
REM ****************************************************
REM zbadaj czy Q,R,S znajduja sie w kolejnych kolumnach tablicy ekranowej
I = -1
petlarysowania:
I = I + 1: REM DAWNIEJ FOR I = 0 TO n - NIE STOSOWAC PETLI BO BEDZIE MIGAC
REM CZYLI WIELE RAZY TO SAMO SPRAWDZAC
wys = elementy(I).wysokosc
xp = elementy(I).poczatek * 5
xk = elementy(I).koniec * 5 + 4
srednia = INT((xp + xk) / 2)
jednaczwarta = INT((xp + srednia) / 2)
trzyczwarte = INT((srednia + xk) / 2)
pomoc1 = xp: pomoc11 = jednaczwarta
pomoc2 = jednaczwarta + 1: pomoc22 = srednia
pomoc3 = srednia + 1: pomoc33 = trzyczwarte
pomoc4 = trzyczwarte + 1: pomoc44 = xk
dh = (wys / 32) * 2
IF elementy(I).znak = "Q" THEN
FOR ii = 0 TO 31
pozycja = ii * 2 + 1
poziom = 120 - wys + ii * dh
col = VAL("&H" + MID$(a01$, pozycja, 2))
LINE (pomoc1, poziom)-(pomoc11, poziom + dh), col, BF
col = VAL("&H" + MID$(a02$, pozycja, 2))
LINE (pomoc2, poziom)-(pomoc22, poziom + dh), col, BF
col = VAL("&H" + MID$(a03$, pozycja, 2))
LINE (pomoc3, poziom)-(pomoc33, poziom + dh), col, BF
col = VAL("&H" + MID$(a04$, pozycja, 2))
LINE (pomoc4, poziom)-(pomoc44, poziom + dh), col, BF
NEXT ii
I = elementy(I).koniec: GOTO petlarysowania
END IF
REM *************************************
IF elementy(I).znak = "R" THEN
FOR ii = 0 TO 31
poziom = 120 - wys + ii * dh
pozycja = ii * 2 + 1
col = VAL("&H" + MID$(a05$, pozycja, 2))
LINE (pomoc1, poziom)-(pomoc11, poziom + dh), col, BF
col = VAL("&H" + MID$(a06$, pozycja, 2))
LINE (pomoc2, poziom)-(pomoc22, poziom + dh), col, BF
col = VAL("&H" + MID$(a07$, pozycja, 2))
LINE (pomoc3, poziom)-(pomoc33, poziom + dh), col, BF
col = VAL("&H" + MID$(a08$, pozycja, 2))
LINE (pomoc4, poziom)-(pomoc44, poziom + dh), col, BF
NEXT ii
I = elementy(I).koniec: GOTO petlarysowania
END IF
REM *************************************
IF elementy(I).znak = "S" THEN
FOR ii = 0 TO 31
poziom = 120 - wys + ii * dh
pozycja = ii * 2 + 1
col = VAL("&H" + MID$(a09$, pozycja, 2))
LINE (pomoc1, poziom)-(pomoc11, poziom + dh), col, BF
col = VAL("&H" + MID$(a10$, pozycja, 2))
LINE (pomoc2, poziom)-(pomoc22, poziom + dh), col, BF
col = VAL("&H" + MID$(a11$, pozycja, 2))
LINE (pomoc3, poziom)-(pomoc33, poziom + dh), col, BF
col = VAL("&H" + MID$(a12$, pozycja, 2))
LINE (pomoc4, poziom)-(pomoc44, poziom + dh), col, BF
NEXT ii
I = elementy(I).koniec: GOTO petlarysowania
END IF
IF I < n GOTO petlarysowania
RETURN
|
|
Powrót do góry |
|
|
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
Wysłany: Wto 19:07, 26 Sty 2021 Temat postu: |
|
|
DEF SEG = 0: REM Ustawienie segmentu pamieci dla instrukcji Peek i Poke
SCREEN 13
REM Nowy typ powstal aby zebrac dane o punktach badanych podczas
REM badania ich widocznosci oraz natepnych ich danych
TYPE rekord
znak AS STRING * 1: REM znak jaki wystepuje w tablicy labiryntu
poczatek AS INTEGER: REM poczatek wystepowania tego znaku gdy wystepuje wielokrotnie
koniec AS INTEGER: REM koniec wystepowania tego znaku gdy wystepuje wielokrotnie
xwtabl AS INTEGER: REM wspolrzedna x tego znaku w tablicy labiryntu
ywtabl AS INTEGER: REM wspolrzedna y tego znaku tablicy labiryntu
wysokosc AS INTEGER
END TYPE
DIM elementy(0 TO 310) AS rekord
REM deklaracje tablic, zwykle pierwszy element o indeksie 0
DIM t$(0 TO 99)
DIM labi(0 TO 160, 0 TO 15) AS STRING * 1
REM deklaracje tych zmiennych maja na celu ograniczenie ich wielkosci
REM czyli zwiekszenia predkosci
DIM xgracza, ygracza, n, ktora AS INTEGER
DIM ii, jj, przes, pozp, pozk, xp, xk, r, wys AS INTEGER
CONST pi = 3.14159
REM ...przelicznik stopni na radiany xrad=(pi*xstop)/180
REM mapa geometrii labiryntu.
REM cyfry i litery wyznaczaja POLA a nie punkty
REM Litery zarezerwowane beda dla obrazkow na scianach
REM A - sciana pozioma
REM B - sciana pionowa
REM C - krawedz, bloczek widoczny
REM D - krawedz, bloczek niewidoczny
REM kropka, drukropek, "/", "%" oraz ">" oznaczaja punkty
REM oddalone od scian i pozwalaja na skok wektora badania o kilka pozycji
REM znak # - bezwzgledny mur
t$(0) = "##############################################################################################################################################################"
t$(1) = "#DAAAAAAAAAAAAAAAAD###DAAAAAAAAAAAAAAAAAAAAAD###DAAAAAAD##DAAAAAD######DAAAAAD##DAAAAAAAAAAAAAAAAD###DAAAAAAAAAAAAAAAAAAAAAD###DAAAAAAD##DAAAAAD######DAAAAAD#"
t$(2) = "#B................B###B.....................B###B......B##B.....B######B.....B##B................B###B.....................B###B......B##B.....B######B.....B#"
t$(3) = "#B.::::::::::::::.B###B.:::::::::::::::::::.B###B.::::.B##B.:::.B######B.:::.B##B.::::::::::::::.B###B.:::::::::::::::::::.B###B.::::.B##B.:::.B######B.:::.B#"
t$(4) = "#B....://///////:.CAAAC.:/:.......:///////:.B###B.://:.CAAA.:/:.DAAAAAAD.:::.B##B.:////////////:.CAAAC.://///////////////:.B###B.://:.CAAA.:/:.DAAAAAAD.:::.B#"
t$(5) = "#DAAC.:/%%%%%%%/:.......:/:.CAAAC.:/%%%%%/:.B###B.://:......:::..........:::.B##D.:/%%%%%%%%%%/:.......:/:::::::::/%%%%%/:.B###B.://:......:::..........:::.B#"
t$(6) = "###CB.:/%>%/////:::::::::/:.Q###B.:/%>>>%/:.CAAAC.://:::::::.......:::::::::.CAAC.:/%>>>>%/////:::::::::/:.......:/%>>>%/:.CAAAC.://:::::::.......::........B#"
t$(7) = "####B.:/%>%/:::::::://////:.R###B.:/%>>>%/:.......::::::///:.CAAAC.:///////:......:/%>>>>%/:::::::://////:.CAAAC.:/%>>>%/:.......::::::///:.CAAAC.::.CAAAAAAD#"
t$(8) = "#DAAC.:/%%%/:......:/%%%%/:.S###B.:/%%%%%/::::::.......:///:.B###B.:/%%%%%/:......:/%%%%%%/:......:/%%%%/:.B###B.:/%%%%%/::::::.......:///:.B###B.::.B########"
t$(9) = "#B....://///:.CAAC.://////:.B###B.:////////////:.CAAAC.:///:.B###B.:///////:.CAAC.:////////:.CAAC.://////:.B###B.:////////////:.CAAAC.:///:.B###B.::.CAAAAAAD#"
t$(10) = "#B.::::::::::.B##B.::::::::.B###B.::::::::::::::.B###B.:::::.B###B.:::::::::.B##B.::::::::::.B##B.::::::::.B###B.::::::::::::::.B###B.:::::.B###B.::........B#"
t$(11) = "#B............B##B..........B###B................B###B.......B###B...........B##B............B##B..........B###B................B###B.......B###B...........B#"
t$(12) = "#DAAAAAAAAAAAAD##DAAAAAAAAAAD###DAAAAAAAAAAAAAAAAD###DAAAAAAAD###DAAAAAAAAAAAD##DAAAAAAAAAAAAD##DAAAAAAAAAAD###DAAAAAAAAAAAAAAAAD###DAAAAAAAD###DAAAAAAAAAAAD#"
t$(13) = "##############################################################################################################################################################"
REM Przetworzenie ciagow znakowych labiryntu na tablice znakowa
REM PRINT LEN(t$(13)); "..."
FOR yy = 0 TO 13
FOR xx = 0 TO 157
pom$ = MID$(t$(yy), xx + 1, 1)
IF pom$ = "" THEN pom$ = "#"
labi(xx, yy) = pom$
NEXT xx
t$(yy) = "": REM czyszczenie pamieci
NEXT yy
GOSUB zaladujobraz
REM **************************** dane startowe
dal = 50: REM przelicznik optyczny dla obliczenia wysokosci sciany
kier = 0: REM kierunek patrzenia gracza ustawiony na 0 stopni
xgracza = 7: REM wspolrzedne gracza w tablicy labiryntu
ygracza = 6
REM ************************************* petla glowna
REM ********** PETLA FOR - BADANIE KOLEJNYCH KATOW
REM t1, t2 i dalsze - pomiar predkosci
REM petla for liczona jest w stopniach
REM zmienna k bezposrednio wyznacza tutaj takze wspolrzedna ekranu
REM kier - kierunek gracza, kat - kierunek badania widocznosci
REM xb, yb - wspolrzedne badanych punktow
REM zostana zaokraglone do xbint =int(xb+0.5)
REM zaokraglone, a nie obciete
POWTORZ: REM miejsce powrotu po kolejnym ruchu gracza
ktora = -1: REM ustawienie pozycji zapisania elementu w tablicach ekranowych
t1 = PEEK(1132)
FOR K = -150 TO 150 STEP 4: REM petla kata badania, krok co 4 stpnie (i co 4 pixele)
ktora = ktora + 1
kat = (K / 10) + kier
IF kat < 0 THEN kat = 360 + kat: REM poprawki dla przeliczania stopni
IF kat > 359.9 THEN kat = kat - 360: REM w przedziale <0-360)
xb = xgracza: REM ustalenie wpolrzenych nowego badania
yb = ygracza
s = SIN((pi * kat) / 180)
c = COS((pi * kat) / 180)
REM petla badania widocznosci
petla:
xb = xb + c
yb = yb + s
GOSUB zaokraglij: REM zaokraglowe wartosci miejsca badania
znak$ = labi(xbint, ybint): REM odczytanie badanego znaku
skok = 0: REM tutaj nastepuje przyspieszenie badania
IF znak$ = ":" THEN skok = 1: GOTO omin
IF znak$ = "/" THEN skok = 2: GOTO omin
IF znak$ = "%" THEN skok = 3: GOTO omin
IF znak$ = ">" THEN skok = 4
omin:
IF skok > 0 THEN
xb = xb + c * skok
yb = yb + s * skok
GOSUB zaokraglij
znak$ = labi(xbint, ybint)
END IF
IF skok = 0 AND znak$ <> "." THEN
elementy(ktora).xwtabl = xbint: REM musza byc przed gosub
elementy(ktora).ywtabl = ybint
GOSUB przeciecie
REM wpis danych elementu do tablicy ekranowej
elementy(ktora).znak = znak$
elementy(ktora).wysokosc = wys
GOTO wyjscie
END IF
GOTO petla: REM koniec petli badania daego kierunku
wyjscie:
NEXT K: REM koniec badania pola widzenia
t2 = PEEK(1132): REM pomiar czasu
GOSUB dotablicy: REM skok do alizy elementow
t3 = PEEK(1132): REM pomiar czasu
GOSUB linia: REM RYSOWANIE Z TABLICY
t4 = PEEK(1132): REM pomiar czasu
i = -1
GOSUB petlarysowania: REM rysowanie obrazkow na scianach
REM koniec rysowania planszy
COLOR 15: LOCATE 1, 1:
PRINT "bad.wid="; t2 - t1
PRINT "przetw="; t3 - t2
PRINT "rys="; t4 - t3
REM ********************************************************
REM ************* gracz ma wplyw na kolejny ruch
REM ********************************************************
czekaj:
i$ = INKEY$
IF i$ = CHR$(27) THEN END
IF i$ = "" THEN GOTO czekaj
POKE 1050, PEEK(1052): REM czyszczenie bufora klawiatury
IF i$ = CHR$(0) + "K" THEN kier = kier - 5
IF i$ = CHR$(0) + "M" THEN kier = kier + 5
IF kier < 0 THEN kier = 360 + kier: REM plus czyli tutaj minus
IF kier > 359.9 THEN kier = kier - 360
IF i$ = CHR$(0) + "H" THEN GOSUB WPRZOD
IF i$ = CHR$(0) + "P" THEN GOSUB wtyl
GOTO POWTORZ
REM ************************** GOSUB-RETURN dla ruchu wprzod
WPRZOD:
xs = xgracza
ys = ygracza
REM krok wprzod gracza nastpeje po linii kata wiedzenia
s = SIN(pi * kier / 180)
c = COS(pi * kier / 180)
xgracza = xgracza + 2 * c
ygracza = ygracza + 2 * s
REM ****************** zakaz wchodzenia na mur
znak$ = labi(xgracza, ygracza)
IF znak$ <> "." AND znak$ <> ":" AND znak$ <> "/" AND znak$ <> "%" AND znak$ <> ">" THEN xgracza = xs: ygracza = ys
RETURN
REM *********************** GOSUB-RETURN dla ruchu w tyl
wtyl:
xs = xgracza
ys = ygracza
s = SIN(pi * kier / 180)
c = COS(pi * kier / 180)
xgracza = xgracza - 2 * c
ygracza = ygracza - 2 * s
REM ****************** zakaz wchodzenia na mur
znak$ = labi(xgracza, ygracza)
IF znak$ <> "." AND znak$ <> ":" AND znak$ <> "/" AND znak$ <> "%" AND znak$ <> ">" THEN xgracza = xs: ygracza = ys
RETURN
REM ****************************************************************
REM ***** GOSUB RETURN - przetworzenie danych tablicy ekranowej
REM ****************************************************************
dotablicy:
n = ktora: REM n to liczba elementow tablic ekranowych
REM badanie poczatku wystepowania elementu - znaku, ale
REM zgadzac musza sie tez jego wspolrzedne w tablicy labiryntu
FOR i = 0 TO n
IF i = 0 THEN elementy(0).poczatek = 0: GOTO konczpetle
IF elementy(i).znak = elementy(i - 1).znak AND elementy(i).xwtabl = elementy(i - 1).xwtabl AND elementy(i).ywtabl = elementy(i - 1).ywtabl THEN elementy(i).poczatek = elementy(i - 1).poczatek: GOTO konczpetle
elementy(i).poczatek = i
konczpetle:
NEXT i
REM w odwrotna strone - badanie konca wystepowanie elementu
FOR i = n TO 0 STEP -1
IF i = n THEN elementy(i).koniec = n: GOTO konczpetle2
IF elementy(i).znak = elementy(i + 1).znak AND elementy(i).xwtabl = elementy(i + 1).xwtabl AND elementy(i).ywtabl = elementy(i + 1).ywtabl THEN elementy(i).koniec = elementy(i + 1).koniec: GOTO konczpetle2
elementy(i).koniec = i
konczpetle2:
NEXT i
RETURN
REM ******************************************************************
REM *************** GOSUN RETURN dla rysowania zwyklych linii
REM *************** rysowanie odbywa sie z tablicy
linia:
FOR i = 0 TO n: REM n - ustalony WCZEJSNIEJ ROZMIAR TABLIC EKRANOWYCH
ktory = i - elementy(i).poczatek
wys = elementy(i).wysokosc
znak$ = elementy(i).znak
COLOR 28: REM KOLOR DLA ELEMENTOW NIEOKRESLONYCH
IF znak$ = "A" THEN COLOR 26
IF znak$ = "B" THEN COLOR 30
pomoc1 = i * 4
pomoc2 = i * 4 + 3: REM plus zalezy od ustalonej dokladnosci ekranowej
REM czyszczenie podlogi i sufitu (lub nieba) z poprzednich rysunkow
IF ASC(znak$) >= 81 THEN GOTO nierysuj: REM obrazki nie rysowane tutaj
IF wys <= 0 THEN wys = 0: GOTO nierysuj
IF wys > 120 THEN wys = 120
LINE (pomoc1, 0)-(pomoc2, 120 - wys - 1), 150, BF
LINE (pomoc1, 120 + wys + 1)-(pomoc2, 200), 20, BF
REM zwykla linia
LINE (pomoc1, 120 - wys)-(pomoc2, 120 + wys), , BF
nierysuj:
NEXT i
REM nierysuj:
RETURN
REM *************************************************************
REM obliczenie punktow przeciecia
przeciecie:
xb = xb - .1 * c: REM wspolrzedna badania cofnieta o 0.1 cosinusa
yb = yb - .1 * s: REM wspolrzedna badania cofnieta o 0.1 sinusa
GOSUB zaokraglij
back$ = labi(xbint, ybint)
IF ASC(back$) < 64 THEN GOTO znalazlem
GOTO przeciecie
znalazlem:
odleglosc = SQR((xgracza - xb) ^ 2 + (ygracza - yb) ^ 2)
wys = INT((dal / odleglosc) * 7)
RETURN
REM********************** prawidlowe zaokraglanie xb yb
zaokraglij:
xbint = INT(xb)
ulamek = ABS(xb - INT(xb))
IF xb > 0 AND ulamek >= .5 THEN xbint = xbint + 1
IF xb < 0 AND ulamek >= .5 THEN xbint = xbint - 1
ybint = INT(yb)
ulamek = ABS(yb - INT(yb))
IF yb > 0 AND ulamek >= .5 THEN ybint = ybint + 1
IF yb < 0 AND ulamek >= .5 THEN ybint = ybint - 1
RETURN
REM *************************************************************
REM ******* Od tego miejsca beda umieszczane procedury
REM ******* zwiazane z naklejaniem obrazkow
zaladujobraz:
DIM obraz(0 TO 23, 0 TO 31) AS STRING * 1
DIM a$(0 TO 31)
REM 24x32
a$(0) = "0F0F0F0F0F0F0101010101010101010101010101010E0E0E"
a$(1) = "0F0F0F0F0F010101010202020202020201010101010E0E0E"
a$(2) = "0F0F0F0F0101010102020202020202020201010101010E0E"
a$(3) = "010101010101010202020602020202020202010101010101"
a$(4) = "010101010101020202020602020202060202020101010101"
a$(5) = "010101010102020202020602020202060202020201010101"
a$(6) = "010101010102020202020602020206020202020201010101"
a$(7) = "010101010102020602020602020206020206020201010101"
a$(8) = "010101010102020602020206020206020206020201010101"
a$(9) = "010101010102020206020206020602020602020201010101"
a$(10) = "010101010102020206020206020602020602020201010101"
a$(11) = "010101010102020202060206020602020602020201010101"
a$(12) = "010101010102020202060206060602060202020201010101"
a$(13) = "010101010102020202020606060606020202020201010101"
a$(14) = "010101010102020602020206060602020206020201010101"
a$(15) = "010101010101020206020206060602020602020101010101"
a$(16) = "080808080808080202060206060602060202080808080808"
a$(17) = "080808080808080802020606060606020208080808080808"
a$(18) = "080808080808080808020206060602020808080808080808"
a$(19) = "080808080808080808080806060608080808080808080808"
a$(20) = "080808080808080808080806060608080808080808080808"
a$(21) = "070707070707070707070706060607070707070707070707"
a$(22) = "070707070707070707070706060607070707070707070707"
a$(23) = "070707070707070707070706060607070707070707070707"
a$(24) = "070707070707070707070706060607070707070707070707"
a$(25) = "070707070707070707070706060607070707070707070707"
a$(26) = "070707070707070707070706060607070707070707070707"
a$(27) = "070707070707050707070706060607070507070705070707"
a$(28) = "070707070707020707070706060607070207070702070707"
a$(29) = "020202020202020202020606060606020202020202020202"
a$(30) = "020202020202020202060606060606060202020202020202"
a$(31) = "020202020202020202020202020202020202020202020202"
FOR y = 0 TO 31
FOR x = 0 TO 23
obraz(x, y) = CHR$(VAL("&H" + MID$(a$(y), x * 2 + 1, 2)))
NEXT x
a$(y) = "": REM czyszczenie pamieci
NEXT y
RETURN
REM **************************************************
REM ******************** Rysowanie znakow Q,R,S
REM **************************************************
REM zbadaj czy Q,R,S znajduja sie w kolejnych kolumnach tablicy ekranowej
REM wczesniej jest i = -1
petlarysowania:
i = i + 1: REM DAWNIEJ FOR I = 0 TO n - Nie stosowac petli FOR
REM bo bedzie migac, czyli kilka razy to samo sprawdzac.
REM Lepiej aby prostokaty zachodzily na siebie niz aby byla jakas luka.
REM ustalenie danych pikselowych
REM program przewiduje zmienna wysokosc elementu
wys = elementy(i).wysokosc
xp = elementy(i).poczatek * 4: REM wspolrzedna poczatku elementu
xk = elementy(i).koniec * 4 + 3: REM wspolrzedna konca elementu
wysp = elementy(elementy(i).poczatek).wysokosc: REM wysokosc pierwszego elementu wsrod elementow identycznyc
wysk = elementy(elementy(i).koniec).wysokosc: REM wysokosc ostatniego elementu wsrod elementow identycznych
r = xk - xp + 1: REM dlugosc wystepowania
REM danego elementu w tablicy ekranowej od 1 zaczynajac
dxe = r / 8: REM jednostkowa szerokosc danego koloru
REM (sposrod 8 przypadajacych na jeden element)
rh = wysk - wysp: REM roznica wysokosci ekranowej pierwszej i ostatniej kolumny tego samego elementu
dw = rh / 8: REM jednoskowa wysokosc ekranowa danej komorki tablicy obrazka
IF elementy(i).znak = "Q" THEN przes = 0: GOTO rysujmatryce
IF elementy(i).znak = "R" THEN przes = 8: GOTO rysujmatryce
IF elementy(i).znak = "S" THEN przes = 16: GOTO rysujmatryce
REM *************************************
IF i < n GOTO petlarysowania
COLOR 0: LINE (304, 0)-(304, 200)
RETURN
REM ------------------- wskok przez GOTO i powrot przez GOTO
rysujmatryce:
dm0 = PEEK(1132)
FOR jj = 0 TO 7: REM petla kolumn rysunku
wys = wysp + dw * jj: REM wys -tutaj wysokosc polowkaowa sciany w tym miescu
dh = (wys / 32) * 2: REM jednostowa wysokosc komorki tablicy obrazka
LINE (xp + dxe * jj, 0)-(xp + dxe * (jj + 1), 120 - wys), 150, BF
LINE (xp + dxe * jj, 120 + wys + dw * 8 - 1)-(xp + dxe * (jj + 1), 200), 20, BF
FOR ii = 0 TO 31
pozp = 120 - wys + ii * dh: REM wysokosc gornej krawedzi komorki obrazka
pozk = pozp + dh: REM wysokosc dolnej krawedzi komorki obrazka
LINE (xp + dxe * jj, pozp)-(xp + dxe * (jj + 1), pozk), ASC(obraz(jj + przes, ii)), BF
NEXT ii
NEXT jj
i = elementy(i).koniec: REM pominiecie badania tych samych znakow w tablicy ekranowej
dm1 = PEEK(1132)
GOTO petlarysowania
|
|
Powrót do góry |
|
|
|
|
Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
|