kategoria: AMOS
[#211] Re: Tworzenie gier

@tukinem, post #210

Zaraz sprawdzę. Moment.

Ostatnia aktualizacja: 08.08.2021 11:26:41 przez mastaszek
[#212] Re: Tworzenie gier

@tukinem, post #210

Przed instrukcją Dual Playfield daj "Wait 10" i napisz czy zadziałało

Te ekrany masz na odwrót. Zrób tak:

Wait 10
Dual Playfield 1,0
Dual Priority 0,1

Teraz ekran z obrazkiem jest na drugim planie. A po otwarciu pierwszego planu, musisz go wyczyścić kolorem nr 0, czyli przezroczystym. Generalnie spróbuj tak:

Screen Open 0,320,200,4,Lowres <ekran do wycięcia boba
Paper 0: Print "bobek jakis"
Get Bob 0,1,0,0 to 40,8

Screen Open 1,320,256,8,Lowres < ekran "tło"
Hide: Curs Off: Flash Off
Load Iff "level1"

Screen Open 0,320,256,4,Lowres < ekran pierwszoplanowy
Curs Off: Flash Off
Cls 0 < musi być wyczyszczony kolorem 0, żeby ekran pod nim był widoczny
Wait 10 < zaczekaj chwilę przed Dual Playfield
Dual Playfield 1,0
Dual Priority 0,1


Paste Bob 50,50,1
Screen Swap

Repeat
Until KeyState(69)

Screen Close 1
Erase All







Ostatnia aktualizacja: 08.08.2021 11:51:42 przez mastaszek
[#213] Re: Tworzenie gier

@mastaszek, post #212

Dobrze miałem screeny porobione. Wait 10 pomogło. CLS 0 sprawiło, że tło jest czarne. Teraz muszę znowu boba przerobić w PPaincie na 4 kolorowego.
[#214] Re: Tworzenie gier

@tukinem, post #213

"Dobrze miałem screeny porobione. Wait 10 pomogło. CLS 0 sprawiło, że tło jest czarne." < Tłem ma zostać obrazek IFF. Na "czarno" trzeba wyczyścić pierwszoplanowy ekran, żeby był przezroczysty. Na odwrót miałeś ;)
[#215] Re: Tworzenie gier

@mastaszek, post #214

Nie no miałem jak mi napisałeś. Drugoplanowy ekran Screen1 miałem 8 kolorowy z tapetą. Potem pierwszoplanowy Screen0 4 kolorowy. Teraz wczytuję boba na pierwszoplanowym ale kolory mam zmienione. Chyba zrobię to sprajtem żeby użyć osobnej palety kolorów abym mógł mu nadać oryginalne kolory. Próbowałem zwykłą tabelą dwuwymiarową ale faktycznie tabeli TAB(320,256) nie da się stworzyć :D za duże parametry. Jak zrobię tego sprajta do porządku to zacznę zabawę z tymi komendami które mi podałeś wczoraj. Jestem ciekaw jak to wyjdzie.
[#216] Re: Tworzenie gier

@tukinem, post #215

Na sprajcie zrób głównego bohatera, a resztę na PASTE BOBach.

Paleta w Dual Playfield to

ekran (kolory 0-7)
ekran (kolory 8-15)

Kolory ustawiasz za pomocą Colour (nrKol)=$rgb
Paletę (całą, czyli kol 0-15) ustawiasz na głównym ekranie już po włączeniu Dual Playfield.

Ostatnia aktualizacja: 08.08.2021 14:49:45 przez mastaszek
[#217] Re: Tworzenie gier

@mastaszek, post #216

Paleta zostaje ta sama, tylko kolory sprite muszę ustawić.
[#218] Re: Tworzenie gier

@mastaszek, post #216

Czemu paletę mogę jedynie ustawić na Screen1? (tam gdzie ładuję tapetę)
Tzn nie paletę, a kolory sprite'a. Komendy COLOUR 48,$... dla sprite'a działają tylko w SCREEN1
[#219] Re: Tworzenie gier

@tukinem, post #206

Zawsze możesz zrobić np. kafle szerokie na 2px a wysokie na 16. Jak Ci tam wygodniej. Jak pokaflujesz mapę to będzie mniej liczenia niż per-pixel, wydaje mi się.
[#220] Re: Tworzenie gier

@tukinem, post #218

Paletę ustalasz na Screen 1 dla OBU ekranów i dla sprajta. Ustawiasz od razu wszystkie kolory (ekranów) 0-15 i dla sprajta też.

Po prostu przed pętlą główną przełącz na chwilę na ekran 1, ustaw paletę i przełącz z powrotem na ekran pierwszoplanowy.

Screen 1
Colour(0)=$rgb
Colour(1)=$rgb
Colour(...)=$rgb
Screen 0
[#221] Re: Tworzenie gier

@mastaszek, post #207

- kopiujesz zawartość ekranu (aktualnie iff z tłem) do BANKU (POINT (x,y) po obrazku i POKE do banku)

jak to wykonać?
Zrobiłem pętlę:
FOR I=0 TO 320
FOR J=0 TO 256
POKE 8,POINT(I,J)
NEXT:NEXT

POKE to wpisywanie do rejestru, PEEK to wczytywanie, ale nie mogę jeszcze tego pojąć za bardzo. Wpisałem tak, jak mi podałeś, ale zrobiłem RESERVE AS WORK 8,81920 'czyli 320x256. Co oznacza komenda POCZATEKBANKU=START(8)? W trybie bezpośrednim wpisuję START(8) to mi wyskakuje Synax Error. Po wpisaniu PEEK(8) to samo. Nie rozumiem jak skopiować ekran do pamięci. Domyślam się, że będzie się kopiować nr koloru każdego piksela tak?
[#222] Re: Tworzenie gier

@tukinem, post #221

Bank to po prostu zarezerwowany dla nas obszar pamięci. Funkcja Start(NrBanku) zwraca początek tego obszaru pamięci.

RESERVE AS WORK 8,81920
POCZATEKBANKU=START(8)

For J=0 to 255
For I=0 to 319
Poke POCZATEKBANKU+I+J*320,POINT(I,J)
Next
Next
[#223] Re: Tworzenie gier

@mastaszek, post #222

Wpisałem tak i mi się emulator wiesza. Error K10 mi wyskakuje :/

Już mam. Zamiast POCZATEKBANKU to wpisywałem 8
OK. Odpalam program, wczyta wszystko do banku. Przerywam program (CTRL+C) i wchodzę w tryb bezpośredni. Wpisuję PEEK(8) np. i dalej Synax Error. Nie pokazuje mi zapisanych danych w pamięci.

Ostatnia aktualizacja: 08.08.2021 16:07:07 przez tukinem

Ostatnia aktualizacja: 08.08.2021 16:08:55 przez tukinem
[#224] Re: Tworzenie gier

@tukinem, post #223

Z banku czytasz:

KOLOR=Peek (POCZATEKBANKU+x+y*320)

Ostatnia aktualizacja: 08.08.2021 16:17:42 przez mastaszek
[#225] Re: Tworzenie gier

@mastaszek, post #224

Wpisałem coś takiego:
Print At(0,0);Peek(X Screen(X Mouse)+Y Screen(Y Mouse*319);


Jednak nic mi nie wyświetla. Chyba wszystko wyskakuje na Screen1, a ja mam ustawione na Screen0. Ale to skomplikowane :) już się pogubiłem
[#226] Re: Tworzenie gier

@tukinem, post #225

podeślij cały kod
[#227] Re: Tworzenie gier

@mastaszek, post #226

Screen Open 0,320,256,4,Lowres
Load Iff "bob4"

Get Sprite 1,66,0 To 80,10
Get Sprite 2,0,0 To 16,10
Get Sprite 3,0,11 To 16,21
Get Sprite 4,0,22 To 16,32
Get Sprite 5,17,0 To 32,10
Get Sprite 6,17,11 To 32,21
Get Sprite 7,17,22 To 32,32
Get Sprite 8,31,0 To 48,10
Get Sprite 9,31,11 To 48,21
Get Sprite 10,31,22 To 48,32



Screen Open 1,320,256,8,Lowres

Curs Off : Flash Off
Load Iff "level1"
Colour 48,$CCC
Colour 49,$A20
Colour 50,$FFF
Colour 51,$E88

Screen Open 0,320,256,4,Lowres
Curs Off : Flash Off
Cls 0
Double Buffer
Wait 10
Dual Playfield 1,0
Dual Priority 0,1
Autoback 0




Reserve As Work 8,81920
POCZATEK=Start(8)

For I=0 To 319
For J=0 To 255
Poke Start(8)+I+J*319,Point(I,J)
Next
Next



Repeat
Screen 0
Pen 2
Screen 1
Print At(0,0);Peek(X Screen(X Mouse)+Y Screen(Y Mouse)*319);" ";
Sprite 1,X Hard(148),Y Hard(190),1

Until Key State(69)
Screen Close 1





Nawet gdy jeżdżę myszą po pustych polach to mi pokazuje liczby np. 31, 255,192,129... A jeżdżąc po miejscach, gdzie są kolory to też raz pokazuje numer a raz nie. Poza tym te liczby to nie są numery kolorów chyba

Ostatnia aktualizacja: 08.08.2021 16:35:24 przez tukinem
[#228] Re: Tworzenie gier

@mastaszek, post #226

Powiem Ci, że zrobiłem identycznie, ale na jednym ekranie bez Dual Playfield itd. Działa :)

Screen Open 0,320,256,16,Lowres
Curs Off : Flash Off
Load Iff "level1"
Reserve As Work 8,81920

For I=0 To 319
For J=1 To 255
Poke Start(8)+I+J*320,Point(I,J)
Next : Next

Repeat
Print At(0,0);Peek(Start(8)+X Screen(X Mouse)+Y Screen(Y Mouse)*320);" ";



Until Key State(69)



Erase All
[#229] Re: Tworzenie gier

@tukinem, post #228

W tej wersji z Dual Playfield podmień końcówkę na to poniżej. Poprawiony PEEK i dodany SCREEN SWAP. Screen Swap podmienia ekran widoczny z buforowanym. Mi to poniżej działa i pokazuje kolor pod wskaźnikiem myszy. Ustaw Amigę w winUAE na 'fastes possible', bo amos długo sczytuje te kolory do banku i trzeba poczekać zanim dojdzie do głównej pętli.

Screen 0
Paper 0
Pen 2

Repeat
Print At(0,0);Peek(POCZATEK+X Screen(X Mouse)+Y Screen(Y Mouse)*320);" ";
Sprite 1,X Hard(148),Y Hard(190),1
Screen Swap

Until Key State(69)

Ostatnia aktualizacja: 08.08.2021 17:00:20 przez mastaszek
[#230] Re: Tworzenie gier

@mastaszek, post #229

Dalej mi wyświetla głupoty. Nie wiem co mam poknocone w tym kodzie, ale ten bez Dual Playfield działa bardzo dobrze. Nie wiem czy jest sens żeby używać tej komendy
[#231] Re: Tworzenie gier

@mastaszek, post #229

No trochę się namęczyłem przez błąd w książce. Dziwiło mnie, że wchodząc sprajtem w kolory pokazywało mi głupoty, a wchodząc myszą było dobrze. W książce pisze:
X Hard(X) - funkcja przelicza współrzędną ekranową (graficzną) x ekranu bieżącego na współrzędną sprzętową
X Screen(X) - funkcja przelicza współrzędną ekranową x ekranu bieżącego na współrzędną sprzętową.
Y Hard(Y) i Y Screen(Y) to samo.

Dziwiło mnie, że dwie różne funkcje są identyczne. Okazuje się, że jednak X Screen(X) i Y Screen(Y) przelicza współrzędną sprzętową na współrzędną ekranową. Dobrze mówię? Funkcje Hard wstawia się przy sprajtach, a funkcje X Screen przy myszy np. żeby wiedzieć współrzędną ekranową a nie sprzętową. Ale w przykładach pod opisami komendy X Screen i Y Screen już błędu nie ma :)
[#232] Re: Tworzenie gier

@tukinem, post #230

Jest sens Dual Playfielda, bo wtedy masz do czyszczenia tylko jeden 4 kolorowy ekran i nie musisz się martwić o nieruchome elementy tła.

Skopiuj i uruchom to. Po uruchomieniu musisz poczekać (dłuższą chwilę) aż zapiszą się dane do banku. To trwa, dlatego przyspiesz procka w winUAE ustawiając Fastest Possible i wyłącz Cycle Exact. Powinien się pojawiać numer koloru pod wskaźnikiem myszy.

*******************************

Screen Open 0,320,256,4,Lowres
Load Iff "bob4"

Get Sprite 1,66,0 To 80,10
Get Sprite 2,0,0 To 16,10
Get Sprite 3,0,11 To 16,21
Get Sprite 4,0,22 To 16,32
Get Sprite 5,17,0 To 32,10
Get Sprite 6,17,11 To 32,21
Get Sprite 7,17,22 To 32,32
Get Sprite 8,31,0 To 48,10
Get Sprite 9,31,11 To 48,21
Get Sprite 10,31,22 To 48,32

Screen Open 1,320,256,8,Lowres

Curs Off : Flash Off
Load Iff "level1"
Colour 48,$CCC
Colour 49,$A20
Colour 50,$FFF
Colour 51,$E88

Screen Open 0,320,256,4,Lowres
Curs Off : Flash Off
Cls 0
Double Buffer
Wait 10
Dual Playfield 1,0
Dual Priority 0,1
Autoback 0

Reserve As Work 8,81920
POCZATEK=Start(8)

Screen 1
For I=0 To 319
For J=0 To 255
Poke POCZATEK+I+J*320,Point(I,J)
Next
Next

Screen 0
Paper 0
Pen 2

Repeat

Print At(0,2),Peek(POCZATEK+X Screen(X Mouse)+Y Screen(Y Mouse)*320);" ";
Sprite 1,X Hard(148),Y Hard(190),1
Screen Swap

Until Key State(69)
Screen Close 1
Erase All

Ostatnia aktualizacja: 08.08.2021 20:23:58 przez mastaszek
[#233] Re: Tworzenie gier

@mastaszek, post #232

Dobra mam to. Zamiast mnożyć "J"*320 to mnożyłem *319. Miesza się trochę przez to że ostatnia liczba to 319, bo 0 jest pierwsze. Teraz działa. A co do tych komend to mam rację? Chyba mam błąd w książce odnośnie X Screen i Y Screen.

Ostatnia aktualizacja: 08.08.2021 20:37:52 przez tukinem
[#234] Re: Tworzenie gier

@mastaszek, post #232

link
Wrzucam skompilowaną wersję.
Z fizyki zrobiłem trzymanie się trawki, spadanie oraz wspinanie się po drabince i schodzenie z drabinki.
Faktycznie rysując poziomy w taki sposób można szybko dołożyć wszystkie naraz, lecz wczytywanie poziomu jest strasznie długie na 7MHz. Dziwne, bo komendy typu PEEK i POKE należą do Asemblera z tego, co w książce pisze, więc powinno być szybciutko.

ESC : wyjście z gry

Ostatnia aktualizacja: 08.08.2021 22:27:16 przez tukinem
[#235] Re: Tworzenie gier

@tukinem, post #234

Amosowy POINT(x,y) jest powolny. Ale gotowy bank można zapisać do pliku na dyskietkę:

save "bank1",8

I potem zamiast od nowa go przeliczać, można wczytać bank z pliku:

load "bank1",8
[#236] Re: Tworzenie gier

@mastaszek, post #235

No tak, albo OPEN OUT i później odczytać OPEN IN.
[#237] Re: Tworzenie gier

@tukinem, post #236

Nie, bo to co wcześniej napisałem od razu wczytuje cały bank z pliku do pamięci. To co innego niż OPEN IN/OUT.

Jeśli zrobisz OPEN IN/OUT to potem znowu musisz zarezerwować bank i przenieść do niego dane z pliku, czyli będzie trzeba długo czekać.
[#238] Re: Tworzenie gier

@mastaszek, post #237

A można zapisać bank do pliku ABK i później go odczytać?

Ostatnia aktualizacja: 09.08.2021 10:29:47 przez tukinem
[#239] Re: Tworzenie gier

@tukinem, post #238

Już głupie pytania zadaję :)
Teraz z pliku szybciutko wczytuje, ale za to widzę, że plik z danymi zajmuje 80kB. Patrząc przyszłościowo, to gra mająca 11 poziomów będzie zawierać ponad 880kB, a to już przekracza jedną dyskietkę. Sporo jak na gierkę z 1991 roku :D no ale to właśnie albo szybkość albo oszczędność...
[#240] Re: Tworzenie gier

@tukinem, post #239

Możesz spakować każdy plik i rozpakowywać "w locie" na pomocą powerpackera a dokładnie programu PPatcher
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem