SUPER HIPER TURBO PREDKOSC PALETKI:Na wstepie pochwale sie pewnym osiagnieciem. Chyba w pierwszym poscie pisalem o tym czego brakuje mi w instrukcji 'if then'
Moze jeszcze raz. Brakowalo mi takiej konstrukcji ( przyklad):
10 if a==1 then
{
if b==1 then print b;
if c==1 then print c;
if d==1 then print d
}
Czyli gdy faktycznie a=1 to sprawdzane sa zawsze kolejne 3 warunki. To co oferuje spectrum to:
8000 LET a=1: LET b=1: LET c=1: LET d=1
8010 IF a=1 THEN PRINT a;: IF b=1 THEN PRINT a;: IF c=1 THEN PRINT c;: IF d=1 THEN PRINT d
Tu jest niby wszystko OK i na ekranie faktycznie zobaczylem 1111. Jednak wystarczy zmienic w kodzie np b=0
i na ekranie... pojawi sie tylko 1 jedynka. Dlaczego? no zx spectrum calkiem rozsadnie po napotkaniu falszu przestaje dalej sprawdzac zawartosc linj i przechodzi do nastepnej. Pierwsze co mi sie nasunelo to wykorzystanie go sub np tak:
8000 LET a=1: LET b=0: LET c=1: LET d=1
8010 IF a=1 THEN gosub 9000
...
...
9000 PRINT a;
9010if b=1 THEN PRINT b;
9020 if c=1 THEN PRINT c;
9030 IF d=1 THEN PRINT d
9040 RETURN
Dziala fajnie. Do wiekszych obliczen jak w sam raz. Jednak to o czym chcialem napisac to jeszcze inne rozwiazanie. Zamiast sie rozpisywac to ten sam przyklad jeszcze raz:
8000 LET a=1: LET b=0: LET c=1: LET d=1
8010 IF a=1 THEN PRINT a;: PRINT b AND b=1;: PRINT c AND c=1;: PRINT d AND d=1
Wynik na ekranie: 1011
Ta! dam!
I wlasnie to rozwiazanie zastosowalem w sterowaniu w mojej wezowej grze( ktora mam nadziej powstanie tu kiedys
)
************
*
DZIEN DRUGI*
************
Dzisiaj bedzie "z gorki". Wszystko przygotowane, wiec sterowanie powinno pojsc latwo.
Instrukcja PRINT AT wyswietli paletke w odpowiednim miejscu, a 'LET' updejtuje zawartosc tablicy a.
No to do roboty:
Sterowanie bedzie sie odbywalo klawiszami 'v' w lewo i 'b' w prawo. Nie bedzie zadnych obliczen gdzie paletka ma sie znalezc tylko bede zwiekszal 'posl' i 'posr' o zmienna 'predkosc'.
Naciskajac klawisz 'v' pos++ lub gdy nacisne klawisz b to wtedy pos--
Wyglada na kaszke z mleczkiem... jednak gdy bede juz na pos==56 ( objechalem caly osmiokat do okola) to gdybym dodal jeszcze 1 (56++) to wylece poza zakres zadeklarowany tablicy c(56). Potrzebuje sprytny mechanizm ktory sprawi ze:
56+1 -->1
z kolej w druga strone. Gdy bede naciskal klawisz 'b' :
1-1 -->56
O tym wlasnie pisalem na poczatku dzisiejszego postu. Czyli:
'v'
LET pos=pos+(-56 AND pos>56)
'b'
LET pos=pos+(56 AND pos<1)
Paletke zrobie z 3 spectrumowych znakow 143.
5315 FOR i=pos-2 TO pos
5320 PRINT AT b(i),c(i);CHR$ (143): LET a(b(i),c(i)-4)=1
5340 NEXT i
Oczywiscie cala paletke rysuje tylko jeden raz na poczatku gry. Pozniej bede dorysowywal tylko jeden znak w kierunku ruch i usowal jeden znak na samym koncu paletki.
Co mi jeszcze przyszlo do glowy? to to ze moge latwo zrobic turbo predkosc paletki
Po prostu skopiuje ruch pod kazdym z klawiszy. Da to 3 predkosci paletki oraz... olbrzymia i nieczytelna linie kodu:
110 IF k$="v" THEN LET turbor=0: LET turbol=turbol+(1 AND turbol<8): LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol>4 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol=8 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56)
...
ale czego sie nie robi by zobaczyc cieknaca struzke sliny na skamienialych twarzach zazdrosnych asemblerowcow! Okej, wyraznie widac o czym mowilem, mowiac o zastosowaniu AND, widac tez ze to ze zx spectrum przestaje czytac linie w momencie napotakania falszu w warunku instrukcji 'IF'. Po prostu gdy paletka porusza sie wolno, zx spectrum odczytuje tylko 1/3 linii. Gdy przyspiesza 2/3 i przy maksymalnej predkosci odczytuje ja do konca gdyz wszystkie 'IF' zwracaja prawde.
Doszedl niestety jeszcze jeden warunek tzn zeruje predkosc gdy zaden klawisz nie jest nacisniety:
105 IF k$="" THEN LET turbor=0: LET turbol=0
No to na dzisiaj chyba wystarczy.
Poniewaz wczoraj nic nie napisalem, to dzisiaj w ramach samo -ukarania uporzadkowalem nieco kod mojej gry:
10 CLS
20 GO SUB 5000
30 GO SUB 5100
40 GO SUB 5300
95 REM ******************
98 REM *GLOWNA PETLA GRY*
99 REM ******************
100 LET k$=INKEY$
105 IF k$="" THEN LET turbor=0: LET turbol=0
110 IF k$="v" THEN LET turbor=0: LET turbol=turbol+(1 AND turbol<8): LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$
(143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56):
IF turbol>4 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b
(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol=8 THEN LET posl=posl+predkosc: LET
posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0:
LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56)
120 IF k$="b" THEN LET turbol=0: LET turbor=turbor+(1 AND turbor<8): LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$
(143): LET a(b(posr),c(posr)-4)=1: PRINT AT b(posl),c(posl);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF
turbor>4 THEN LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): LET a(b(posr),c(posr)-4)=1: PRINT AT b(posl),c
(posl);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF turbor=8 THEN LET posr=posr-predkosc: LET posr=posr
+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): LET a(b(posr),c(posr)-4)=1: PRINT AT b(posl),c(posl);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET
posl=posl-predkosc: LET posl=posl+(56 AND posl<1)
1995 REM ******************
1997 REM *KONIEC PETLI GRY*
1999 REM ******************
2000 GO TO 100
2015 REM ************
2017 REM ** **
2020 REM ************
5000 REM DEKLARACJA ZMIENNYCH
5002 REM DIM a-pole gry, DIM bic-x,y paletki, DIM d rysowanie i czyszczenie sladow paletki
5005 PRINT AT 21,0;"Inicjalizacja danych"
5010 DIM a(21,21): DIM b(56): DIM c(56)
5020 LET posl=3: LET posr=1: LET predkosc=1: LET turbol=0: LET turbor=0: LET pos=5
5030 LET k$=""
5090 RETURN
5100 REM PRZYGOTOWANIE POLA GRY
5102 REM WARTOSCI TAB 0-woda, 1-paletka lub krzak, 2-jablko, 4-trawa
5105 REM PLANSZA KWADRATOWA
5110 FOR x=1 TO 21
5120 FOR y=1 TO 21
5130 LET a(x,y)=4
5140 NEXT y
5150 NEXT x
5200 REM OSMIOKAT
5210 LET xc=11: LET yc=11
5220 FOR i=0 TO 6
5230 LET a(xc+10,yc+3-i)=0: LET a(xc+10-i,yc-4-i)=0: LET a(xc+3-i,yc-10)=0: LET a(xc-4-i,yc-10+i)=0
5240 LET a(xc-10,yc-3+i)=0: LET a(xc-10+i,yc+4+i)=0: LET a(xc-3+i,yc+10)=0: LET a(xc+4+i,yc+10-i)=0
5248 REM trasa paletki x
5250 LET b(i+1)=xc+10: LET b(i+8)=xc+10-i: LET b(i+15)=xc+3-i: LET b(i+22)=xc-4-i: LET b(i+29)=xc-10: LET b(i+36)=xc-10+i: LET b(i+43)=xc-3+i: LET b(i+50)
=xc+4+i
5258 REM trasa paletki y
5260 LET c(i+1)=yc+3-i+4: LET c(i+8)=yc-4-i+4: LET c(i+15)=yc-10+4: LET c(i+22)=yc-10+i+4: LET c(i+29)=yc-3+i+4: LET c(i+36)=yc+4+i+4: LET c(i+43)=yc+10+4:
LET c(i+50)=yc+10-i+4
5270 NEXT i
5290 RETURN
5300 REM RYTSOWANIE ELEMENTOW GRY
5310 CLS
5315 FOR i=pos-2 TO pos
5320 PRINT AT b(i),c(i);CHR$ (143): LET a(b(i),c(i)-4)=1
5340 NEXT i
5390 RETURN
7000 REM ****************************
7002 REM TESTY -do usuniecia na koncu
7006 REM ****************************
7010 FOR x=1 TO 21
7020 FOR y=1 TO 21
7030 PRINT AT x,y+4;a(x,y)
7040 NEXT y
7050 NEXT x
7090 RETURN
Reasumijac dzisiejszy kod. Mam ruchoma paletke, ktora jezdzi po boku osmiokata. Gdy naciskam klawisz -palteka rusza powoli by zaraz przyspieszy raz i za chwilke gdy wydaje sie to juz zupelnie niemozliwe
zx spectrum przyspiesza jeszcze raz.