Część piąta - czas na ożywienie intra...
Dzisiaj ożywimy nieco nasze intro. Ostatnio przygotowaliśmy sobie grafikę, spróbujmy ją dzisiaj zacząć wykorzystywać w naszej grze, Na początek przypomnę, jak mamy ustawione dane:
Dane:
$95c0-$9fff grafika tytułowa
$9c00-$9fff fonty do gry
$8240-$855f P1
$8560-$887f T4
$8880-$8b9f T5
$8ba0-$8ebf T6
$8ec0-$91df T7
$91e0-$94ff T8
Wczytujemy teraz Turbo Basic, nasze dane (BLOAD"D:DANE.DAT") oraz nasz dotychczasowy kod gry (LOAD"D:GRA1.TB"). Poke 756,$9c (kto przypomni, co to robi?) i listujemy naszą grę. Na początek nieco namieszamy w naszej procedurze INTRO:
100 PROC INTRO
101 GRAPHICS 24:POKE 710,0:POKE 709,
15:POKE 756,$9C
102 MOVE $95C0,DPEEK(88),1600
142 COLOR %1:TEXT 10,100,"Tu b dzie
intro"
150 IF PEEK(53279)<>6 THEN 150
190 ENDPROC
Do dzieła. Na początek zróbmy małą modyfikację:
102 FOR I=39 TO %0 STEP -1
103 MOVE $95C0+1600-I*40,DPEEK(88)
+I*40,40
104 NEXT I
Proszę uruchomić kod. Co się dzieje? Mamy pętlę for-next, która przesyła nam linia po linii naszą grafikę tytułową na początek adresu ekranu. Pamiętamy, że mamy 40 linii, więc licząc od 39 do zera przesuwamy wszystko linia po linii, dostając odwrócony obraz... Dodajmy sobie w linii 103 małe opóźnienie, aby się przyjrzeć, jak to wygląda:
103 MOVE $95C0+1600-I*40,DPEEK(88)+I*40,40:PAUSE 10
Teraz wszystko widać jak na dłoni. W linii 103 możemy oczywiście od razu wyliczyć adres końca grafiki (1600 bajtów szesnastkowo to $640, $95C0+$640=$9C00, pamiętamy że liczymy od zera, czyli $9BFF), wtedy zadziała nieco szybciej (mam mniej liczenia), ale dla naszego przykładu nie robi to różnicy (dobra, dłuższy kod mamy - ale o tym w ostatnim odcinku będzie). Dodajmy nieco więcej "życia" do intra. Mamy 192 linie, najpierw wyświetlmy naszą grafiką na dole ekranu:
103 -MOVE $95C0+1600-I*40,DPEEK(88)+6000+I*40,40:PAUSE 10
Pamiętamy o czasowym zapisywaniu gry (SAVE"D:GRA2.TB" - przypominam tylko) i sprawdzamy. Działa? Działa. Skąd wartość 6000? To proste - nasza grafika ma 1600 bajtów, cały ekran to 7680 - od wielkości ekranu odejmujemy 1600 bajtów, pamiętamy, że liczymy od zera więc odejmujemy jeszcze 40 bajtów, z pewnych przyczyn chcę mieć jedną linię pustą - więc odejmuję jeszcze 40 bajtów... Teraz wszystko przesuńmy w górę (wcześniej proponuję usunąć pauzę - już nie jest nam potrzebna):
105 FOR I=151 TO %1 STEP -%1
106 MOVE DPEEK(88)+I*40,DPEEK(88)+I*40-40,1600
107 NEXT I
W linii 105 określiliśmy skąd przesuwamy nasz obraz (od której linii) i do której (wartość jeden, bo linijkę dalej przesuwamy na adres ekranu), w linii 106 wpisujemy jak przesuwamy. Proszę się pobawić wartościami zmieniając 40 na inne wartości (najlepiej wielokrotność czterdziestu).
Dobrze, mamy napis na górze, ale... Odwrócony. Coś z tym trzeba zrobić... Można to zrobić przepisując z buforem bezpośrednio z ekranu nasze dane lub wykorzystać nasz obrazek z pamięci (ja wolę tak zrobić). Dopiszmy kawałek kodu:
109 FOR I=%0 TO 39
110 MOVE DPEEK(88)+40,DPEEK(88),1600
111 MOVE $95C0+I*40,DPEEK(88)+1560,40
112 NEXT I
Linia 110 przesuwa nam obrazek w górę, natomiast w linii 111 pobieramy jedną linię z naszego obrazka i zapisujemy ją jako ostatnia linia obrazka tytułowego na naszym ekranie. W ten sposób w prosty sposób uzyskaliśmy prosty efekt rolowania obrazka tytułowego.
Zakładam, że w intrze chcemy też wykorzystać grafikę z naszej konwersji. Jesteśmy w trybie graficznym, nic nie stoi na przeszkodzie, wykorzystajmy grafikę T7, ale najpierw zróbmy sobie część ramki - bo czemu nie? Zasada jest taka, że instrukcja MOVE (lub -MOVE, która działa "od tyłu") możemy się poruszać na ekranie (bez sztuczek) na granicy pełnych bajtów. Nasze obrazki mają 80x80px, więc narysowana część ramki nie powinna nachodzić nam na pełne bajtu obrazka - trzeba uważać szczególnie na linię pionową. Sprawa jest prosta - każdy bajt (w naszym trybie) to odpowiednik ośmiu pikseli. Spróbujmy dodać kod:
120 COLOR %1
121 PLOT 42,50:DRAWTO 140,50
122 PLOT 46,46:DRAWTO 46,140
125 FOR I=%0 TO 79
126 MOVE $8EC0+I*10,DPEEK(88)+2086+I*40,10
127 NEXT I
Co ten kod robi? To proste:
Linia 120 - ustawia nam kolor
Linia 121 - rysuje poziomą część ramki
Linia 122 - rysuje pionową część ramki
U mnie jest to tak dobrane, aby była drobna przerwa między naszym obramowaniem a rysunkiem. Proszę pobawić się tymi wartościami. Pozostałe linie dodają nam rysunek. Proszę teraz uruchomić program.
Coś nam tu chyba nie pasuje, prawda? Mała modyfikacja linii 142 załatwi nam sprawę:
142 COLOR %1:TEXT 10,145,"Tu b dzie intro"
Prawda, że lepiej? To na zakończenie dzisiejszej lekcji jeszcze jedna, drobna modyfikacja wyświetlania obrazka, według mnie uatrakcyjniająca nasze dzieło:
125 FOR I=%0 TO 78 STEP %2
126 MOVE $8EC0+I*10,DPEEK(88)+2086+I*40,10
127 MOVE $91D6-I*10,DPEEK(88)+5246-I*40,10:PAUSE %2
128 NEXT I
Analizę pozostawiam Wam. Jak zwykle oczekuję komentarzy, czy wszystko jest jasne. W następnym odcinku dodamy sobie teksty do intra.
W załączniku atr z bieżącą wersją - pracujemy na wersji gra1.tb, dochodzimy do wersji gra2.tb. Smacznego.
Post's attachmentsroboczy_big_po.7z 71.85 kb, liczba pobrań: 12 (od 2019-12-17)
Tylko zalogowani mogą pobierać załączniki.
Sikor umarł...