kategoria: AMOS
[#571] Re: Tworzenie dem

@Don_Adan, post #569

Jak wpadnę na wzór użycia komendy Pof w stosunku do danego poziomu to i dane poziomów zrobię w jednym pliku i dane rekordów będą w jednym pliku.
[#572] Re: Tworzenie gier

@juen, post #570

Oooo, dzięki :)
[#573] Re: Tworzenie dem

@tukinem, post #566

Dim T_NAME$(10)
Dim T_MOVE(10),T_PUSH(10)


Global SB_10,DLG_LISTY
Global SCIEZ$
Global T_MOVE(),T_PUSH(),T_NAME$()


SCIEZ$=Dir$+"skore/" : Rem katalog z cala lista haj skore


If Length(10)=0 Then Reserve As Data 10,20000

SB_10=Start(10) : Rem adres poczatku banku nr 10

DLG_LISTY=140 : Rem dlugosc jednej listy 'hi score' liczona w bajtach



TYMCZ_POKAZ_HAJ_SKORE

Bell
Wait Key



TYMCZ_WPISZ_TABLICE

POZIOM=1 : Rem numer poziomu ( maksymalnie 99 )


WPIS_SKORE_DO_RAM[POZIOM]


TYMCZ_ZMAZ_TABLICE: Rem kasujemy dane w tablicy tymczasowej


ODCZYT_SKORE_Z_RAM[POZIOM]

TYMCZ_POKAZ_HAJ_SKORE


ZAPIS_BANKU

End

Rem 8********************************************>

Procedure TYMCZ_POKAZ_HAJ_SKORE
'
Print At(0,0);" ------ TOP TEN -------"
For I=1 To 10

Print At(0,I*2);I;"."
Print At(4,I*2);T_NAME$(I)
Print At(14,I*2);" Moves:";T_MOVE(I)
Print At(26,I*2);" Pushes:";T_PUSH(I)
Next I

'
End Proc

Procedure TYMCZ_ZMAZ_TABLICE
'
For I=1 To 10

T_NAME$(I)=""
T_MOVE(I)=0
T_PUSH(I)=0

Next I

End Proc

Procedure TYMCZ_WPISZ_TABLICE
'
Restore TDANE

For I=1 To 10

Read N$
Read M
Read P

T_NAME$(I)=N$
T_MOVE(I)=M
T_PUSH(I)=P

Next I
'
TDANE:
Data "MirekGirek",100,50
Data "Franiula",120,60
Data "Zygi Rogal",140,70
Data "Dyzio",200,120
Data "Rysio",300,150
Data "Stasio",400,200
Data "BasioAsio",480,240
Data "Miecios",500,300
Data "Zbyniuro",1100,500
Data "Wacek",2000,1000

End Proc


Procedure WPIS_SKORE_DO_RAM[N]
'
POZ=N : Rem numer poziomu (odczyt parametru z procedury)

ADR=SB_10+POZ*DLG_LISTY : Rem poczatek danych listy numer poz

Rem ---- zapis ruchow i pchniec do RAM ----

For I=1 To 10

RUCHY=T_MOVE(I)
Doke ADR,RUCHY : Rem zapis ruchu (2 bajty)
ADR=ADR+2

PCHNIEC=T_PUSH(I) : Rem zapis pchniecia (2 bajty)
Doke ADR,PCHNIEC
ADR=ADR+2

Next I

Rem ---- zapis imion do RAM ----

For I=1 To 10

'
IMIE$=T_NAME$(I) : Rem odczyt lancucha z tablicy
DLUGT=Len(IMIE$) : Rem dlugosc imienia
If DLUGT>10 Then DLUGT=10 : Rem maksymalnie 10 znakow

For J=1 To 10 : Rem petla dla 10 znakow

If J<=DLUGT
ZN$=Mid$(IMIE$,J,1) : Rem odczyt kolejno znak po znaku
ZNK=Asc(ZN$) : Rem wartosc kodu ascii odczytanego znaku
Poke ADR,ZNK : Rem zapis wartosci znaku do RAM
Else
Poke ADR,32 : Rem jesli nie ma juz znakow wypelnij spacjami
End If
Inc ADR
Next J

Next I

'
End Proc


Procedure ODCZYT_SKORE_Z_RAM[N]
'
POZ=N : Rem numer poziomu (odczyt parametru z procedury)

ADR=SB_10+POZ*DLG_LISTY : Rem poczatek danych listy numer poz

Rem ---- odczyt ruchow i pchniec z RAM ----

For I=1 To 10

RUCHY=Deek(ADR) : Rem odczyt ruchu (2 bajty)
T_MOVE(I)=RUCHY : Rem zapis ruchu w tablicy
ADR=ADR+2

PCHNIEC=Deek(ADR) : Rem odczyt pchniecia (2 bajty)
T_PUSH(I)=PCHNIEC : Rem zapis pchniec w tablicy
ADR=ADR+2

Next I

Rem ---- odczyt imion z RAM ----

For I=1 To 10

IMIE$=""

For J=1 To 10 : Rem petla dla 10 znakow

ZNK=Peek(ADR) : Rem odczyt wartosci znaku do RAM
ZN$=Chr$(ZNK) : Rem kod ascii odczytanego znaku
IMIE$=IMIE$+ZN$ : Rem dodanie do lancucha kolejno znak po znaku
Inc ADR

Next J

T_NAME$(I)=IMIE$ : Rem zapamietanie lancucha w tablicy

Next I

'
End Proc


Procedure ZAPIS_BANKU

ADR=SB_10 : Rem poczatek adresu calej listy w RAM

DLUG=100*DLG_LISTY : Rem zapis listy wynikow dla 100 poziomow

Bsave SCIEZ$+"top10.dat",ADR To ADR+DLUG

Print "zapisano liste na dysk..."

End Proc



Sortowanie robisz sobie na tablicach tymczasowych T_name$, T_move, T_push a pozniej wywolujesz odpowiednio procedury
WPIS_SKORE_DO_RAM[N] i ODCZYT_SKORE_Z_RAM[N] gdzie N to numer listy dla danego poziomu N.
Dlugosc listy 14kb dla 100 poziomow od 1 do 99. (numer 0 listy jest nieuzywany, zeby nie pogubic sie w numeracji).
[#574] Re: Tworzenie dem

@selur, post #573

Przez 10 lat bym do tego nie doszedł rozczytywać to będę przez kolejne 2 tygodnie przerosło to moje oczekiwania. Mam jedno pytanie do Ciebie, bo już kiedyś to zauważyłem w temacie od Xandy odnośnie przygodówki. Czy przypisując jakąś zmienną np. po prostu a=tabela(x), nie prościej jest używać dalej w kodzie tabela(x)? Po co sobie mnożyć tyle zmiennych? Szybciej jest wtedy? Przykładowo jak zrobiłem tak:
PLIK$="DANE/"+Right$(Str$(NUMER_LEVELU),2)+".TXT"
Open Out 1,PLIK$

Drugi sposób to bez zmiennej:
Open Out 1,"DANE/"+Right$(Str$(NUMER_LEVELU),2)+"TXT"

Czy nadawanie zmiennych przyspiesza działanie programu? Czy tylko stwarza potem zamieszanie przy dużej ilości zmiennych?

Czytam ten Twój kod i mam drugie pytanie: nie potrzeba dać komendy Reserve As Work?

Ostatnia aktualizacja: 13.02.2022 11:31:36 przez tukinem
[#575] Re: Tworzenie dem

@tukinem, post #574

oczywiscie, ze mozesz dzialac bezposrednio na tablicach ale wlasnie chodzi o to, zeby pozniej wiedziec co sie dzieje z kodem jak bedziemy szukac babola a bedziemy szukac na pewno wczesniej czy pozniej..
[#576] Re: Tworzenie dem

@tukinem, post #574

Ja uzywam zawsze bankow stalych typu "as data" bo w odroznieniu od tymczasowych "as work" zostaja w pamieci na stale nie sa kasowane przy kazdym uruchomieniu programu i sa zapisywane razem z programem AMOSA na dysk.

Chodzi o to , ze dowolnym momencie masz dostep do tych danych w banku, jak zrobisz sobie bank tymczasowy to przy ponownym uruchomieniu programu banku musi byc zarezerwowany od nowa i nie masz dostepu do danych na te chwile a poza tym wszystko zostaje skasowane i nie wiesz co tam sie dzialo z danymi.
[#577] Re: Tworzenie dem

@selur, post #576

Rozumiem. Próbowałem u siebie użyć komendy Pof, ale to nie zdaje egzaminu. Przy różnych długościach liczb w rekordach są różne ilości bajtów na dane, więc to odpada.

Może użyć po prostu jakiegoś specjalnego znaku, który bym zapisywał przed każdym levelem, np.
LEVEL=3
Open In 1, PLIK$
For A=1 To LEVEL
Repeat
Input #1,ZNAK$
Until ZNAK$=":)"
Next

'Wczytanie danych dla właściwego poziomu
Close 1

Chodzi mi o to, żeby przed każdym zapisem kolejnego poziomu wstawić znak specjalny i w pętli wyszukiwać go od początku pliku tyle razy, jaki jest nr poziomu. Np. poziom 53, to ma minąć w pliku 53 razy znak ":)" Dobre rozwiązanie? Wydaje mi się prostsze, niż sprawdzanie znaków ASCII itd.


PS. Sprawdzałem komendę APPEND. Wczytuje plik nie kasując jego zawartości, ale służy tylko do zapisu. Myślałem, że będzie się dało jednocześnie odczytywać dane i zapisywać, ale tak nie jest niestety

Ostatnia aktualizacja: 13.02.2022 12:10:07 przez tukinem
[#578] Re: Tworzenie dem

@tukinem, post #577

myslalem wczesniej o tej liscie w rekordach i faktycznie to nie ma wiekszego sensu.
W koncu rekordy to pliki o dostepie sekwencyjnym czyli zeby znalezc cokolwiek musisz 'przeleciec' ( ) plik tak czy siak.

Najlepiej zamiast grzebac w tych plikach, stworz sobie wielka tablice z tymi listami hi score i dzialaj na tej tablicy a pozniej zrzuc wszystko do pliku czyli odczytuj i zapisj tylko jedna wielka liste z pliku rekordu na poczatku gry a po zakonczeniu gry zrob zrzut wszsytkich tablic do tego pliku.

czyli jak masz 53 poziomy to tablice beda wygladac tak

tab_IMIONA$(53,10)
tab_RUCHY(53,10)
tab_POSUNIECIA(53,10)

Ostatnia aktualizacja: 13.02.2022 12:35:52 przez selur
[#579] Re: Tworzenie dem

@selur, post #578

zoczeniec
:D

[#580] Re: Tworzenie dem

@selur, post #578

Z poziomami już zrobiłem. Wczytywanie tablic poziomów z jednego pliku działa super. Miałem problem jeden, ale kapnąłem się, że w pętli zapisującej do jednego pliku oprócz tablicy planszy ma być jeszcze dana z ilością skrzyń na danym poziomie. Poprawiłem, nadpisałem plik z danymi poziomów i wczytując losowo działa. Taka jest różnica, że im dalszy poziom, tym dłużej się wczytuje, bo dłużej program mieli i szuka wielokrotności "umownego znaku dzielącego dane poziomów".

Dziwi mnie tylko fakt, że zaznaczając wszystkie pliki z tablicami poziomów (53 sztuki) wszystko zajmuje 63kB. Nowy plik, który jest jeden w całości również tyle zajmuje. Więc czy był sens to robić?
[#581] Re: Tworzenie dem

@selur, post #578

Ta komenda APPEND jest do bani. Zmienne liczbowe nadpisuje dobrze. Zmienną tekstową, czyli IMIE$ zapisuje tak, że wpisuje prawidłowo 3 litery inicjałów, ale pod spodem w nowej linijce jest stary wpis z inicjałami. Próbowałem:
Print #3,IMIE$ oraz Print#3,IMIE$; 'żeby nie robił nowej linijki

Pierwsza wersja robi (ENTER) i kasuje pierwszy znak starej nazwy gracza, a druga wersja robi (ENTER) i zostawia całą nazwę gracza. Czemu tak jest, że dane liczbowe się dobrze nadpisują, a dane tekstowe już nie?
[#582] Re: Tworzenie dem

@tukinem, post #581

ja nie wiem ale ogolnie Append ma tylko dodawac dane do istniejacego pliku.

Musisz sobie obrac stala liczbe danych w tych plikach czyli. kazde imie musi miec iles tam znakow np. 10 i tylko tyle. Wtedy bedzie mial latwiejszy dostep do danego miejsca w pliku instrukcja Pof.
[#583] Re: Tworzenie dem

@tukinem, post #580

Zle to sprawdzasz. Zrob taki test. Na jedna pusta dyskietke OFS nagraj te 53 pliki, a na druga pusta dyskietke OFS nagraj ten 1 plik. I potem zobacz ile WOLNEGO miejsca bedzie na pierwszej dyskietce a ile na drugiej dyskietce.
[#584] Re: Tworzenie dem

@selur, post #582

Właśnie tak robie. Tylko że zamiast imie$ mieć 10 znaków to mam 3. Skończę na tym że będę aktualizować cały plik hscore komendą open out.

@DonAdan
Sprawdzę to jak tylko ogarnę ten bajzel z kodem
[#585] Re: Tworzenie dem

@tukinem, post #580

bo plik podzielony w sumie wciąż daje Ci tyle samo. przecież dwie połówki chleba to cały chleb. ale Don Adan Ci wyjaśnił. teraz wyobraź sobie że każda część chleba pakowana jest w takie samo pudełko, które mieści cały chleb. siła rzeczy dwie połówki spakowane zajmą więcej niż bez dzielenia bo potrzebują więcej opakowań, które muszą ileś tam zajmować..

kazdy jeden plik wymaga dodatkowych informacji, aż 53 razy zamiast raz... to jest właśnie file system dzięki któremu odczyt pliku jest szybki z dyskietki i od tak.. ale za to ma swój narzut. gdybyś robił ndos to sam byś sobie to zapisał gdzie chcesz i zajmowałoby tyle ile sama zawartość

Ostatnia aktualizacja: 13.02.2022 14:54:47 przez juen
[#586] Re: Tworzenie dem

@juen, post #585

Chciałbym dodać do dyskusji, że ja zrobiłbym listę Hiscore za pomocą INPUT# i PRINT#.

Tak się składa, że instrukcja PRINT to była najpewniej moja pierwsza instrukcja poznana w języku BASIC na Commodore 64. Drugą instrukcja był właśnie INPUT.

W przypadku listy Hiscore można zrobić jeden plik o następującej strukturze:
  • w pierwszym wierszu przechowujemy liczbę poziomów (czyli liczbę kolejnych wpisów w pliku),
  • w każdym kolejnym wierszu przechowujemy imię oraz liczbę punktów - rekord na danym poziomie.

Kod:
OPEN IN 1,"Hiscore.txt"
LINE INPUT #1,poziomy : REM Wczytujemy liczbę poziomów
DIM imiona$(poziomy), punkty(poziomy)
FOR k = 1 TO poziomy
LINE INPUT #1,imiona$(k), punkty(k)
NEXT k

Zaznaczam, że nie mam na bieżąco z AMOSem styczności, więc proszę poprawić, w przypadku błędów, ale może przyda się ogólna idea.

Ostatnia aktualizacja: 13.02.2022 16:18:04 przez Hexmage960
[#587] Re: Tworzenie dem

@Hexmage960, post #586

Nie użyłem Line Input, ale poradziłem sobie z problemem. Użyłem tablicy dwuwymiarowej. Wszystko działa na tablicy w trakcie gry. Gdy pobije się rekord, aktualizuje się tablica, wczytuje się plik z hiscore i po kolei tablica jest zapisywana do pliku.

Filemaster faktycznie pokazuje w nowej wersji o wiele więcej miejsca na dyskietce. Wrzucam tu ADF z nową wersją. Mam prośbę do znawców. W ADF jest plik soko.exe, który jest dobrze skompilowany z kodu ASCII oraz plik soko_bad.exe, który jest skompilowany z pliku .amos, który wywala błąd. Kto się na tym zna, niech sprawdzi co jest z tym nie tak. Różnica w rozmiarach plików jest.

link
[#588] Re: Tworzenie dem

@tukinem, post #587

Nie mam dostepu do Amigi to nie sprawdze, ale to pewnie zalezy od ustawien AMOS-a lub jego rozszerzen. Z tego co pamietam to AMOSowych exekow bylo pare roznych rodzajow. Z AMOS.library dolaczona do exeka i nie dolaczona. Z danymi spakowanymi i nie spakowanymi. Z danymi dolaczanymi do exeka i jako dodatkowy plik lub pliki. Z medplayer i bez. Z narrator albo translator lub bez, juz nie pamietam dokladnie. No i wszelkiego rodzaju miksy. Sporo z tych rzeczy bylo nie uzywane ale dolaczane do exeka AMOS-owego. Co tylko powodowalo, ze wiecej pamieci bylo potrzebne do uruchomienia programu. Nie wiem czy to kwestia samego AMOS-a, ze on zawsze inicjuje/dodaje wszystko co moze, nawet jak to jest potem nieuzywane przez dany program. Czy tez nieumiejetnej obslugi kompilatora AMOS-a przez niektorych programistow. Podobnie ma tez C, ale tam jest zwykle mniej takich narzutow.
[#589] Re: Tworzenie dem

@tukinem, post #587

Podeślij kod (ten, który się źle kompiluje). Najlepiej cały adf z plikiem amosowym. Spróbuję go skompilować u siebie.
[#590] Re: Tworzenie dem

@mastaszek, post #589

Teraz na A600 kompilowałem. Też się robi błąd gdy kompiluję z pliku .amos. Podeślę Ci jak poprawię kod bo jeszcze jedną rzecz muszę poprawić w grze. Po przerobieniu kodu na jednoplikowe hscore i tablice poziomów zamiast restartować poziom przy wciśnięciu R, to przechodzi do następnego poziomu. Ale to już drobnostka. Zrobię to szybko i ci wyślę. Wyślę Ci sam plik .amos. Po kompilacji będziesz wiedział uruchamiając go czy wyskoczy error 80000003 czy wyskoczy brak plików.
[#591] Re: Tworzenie dem

@mastaszek, post #589

https://szybkiplik.pl/859tLArfsy

Tu jest. Tam jest plik soko.amos z świeżym kodem gry. Dodatkowo jest soko_bad.exe, który wywala błąd po mojej kompilacji z pliku .amos. Jeśli też Ci się tak będzie działo, to wczytaj plik .amos, zapisz kod jako ASCII, wyłącz Amosa, załącz, wczytaj sam plik ASCII (tylko musisz zwiększyć rozmiar bufora na kod, bo braknie Ci) i kompiluj jako Current Program.
[#592] Re: Tworzenie dem

@tukinem, post #591

No niestety u mnie jest dokładnie tak samo jak u Ciebie. Kompilowanie z pliku .amos (dołączając amos.library lub nie) wywala błąd na 68000. Szukałem przyczyny w kodzie, ale nic nie przychodzi do głowy. Niezła zagwozdka.
[#593] Re: Tworzenie dem

@mastaszek, post #592

Dobrze że wpadłem na to że można skompilować z kodu z ASCII a dziwne bo tak samo jest wczytywane do Amosa jak plik .amos. Ten sam kod jest potem kompilowany jako current program.
[#594] Re: Tworzenie dem

@tukinem, post #593

nie tak samo. Amos tokenizuje źródło z tego co kojarzę. w necie masz opis formatu. najwyraźniej gdzieś robi błąd wsadzając dane w nieparzysty adres

różnice byś miał jak użyjesz komend rozszerzenia, którego Ci brak. bez niego plik Amosa nie odtworzy prawdziwej nazwy komendy.. a w ascii się zachowa

Ostatnia aktualizacja: 14.02.2022 21:12:15 przez juen
[#595] Re: Tworzenie dem

@juen, post #594

Znów problem błędu się pojawił. Zacząłem testy nowej gry. Platformówka zręcznościowa z ogromnym poziomem. Ekran poziomu ma być na bieżąco rysowany ikonami i scrollowany. Efekt wyszedł niefajnie ale mniejsza z tym.

Wszystko było w miarę. Dodałem grafikę ikon poziomu, część poziomu żeby sprawdzić scroll jak działa. Nowa gra. Nowy drawer. Kompiluję i znowu znany błąd. Zgrałem kod ASCII. Po Merge ASCII i kompilacji odpala się od razu guru z błędem 80000003. W Sokobanie wyskakiwało okienko a tu guru od razu. I to przy kompilacji z kodu ASCII. Mam tu w grze tylko kilka zmiennych liczbowych, wczytywanie ikon z iff, kilka komend Screen Copy, Paste Icon, ogólnie krótki kod. Wydaje mi się że trzeba zainstalować Amosa gdzie indziej. Całkiem zmienić partycję i już nie używać tej z dysku PC dołączanej przez winuae jako katalog z plikami.

Druga sprawa to przesuw ekranu. Na końcu wrzucam link do poradnika którego użyłem do scrollu poziomu. Podczas scrollu wychodzą dziwne kropki. W poradniku jest napisane, że najlepiej używać komendy przesuwającej ekran o jeden piksel, czyli mam
Screen Copy 0,1,0,321,200 To 0,0. I tak ekran się przesuwa ale dziwne kropki wyskakują. Tak jakby użyć komendy BOB w górze ekranu bez Double Buffer. A według poradnika to najlepsza opcja.

A to ten poradnik:
link
[#596] Re: Tworzenie dem

@tukinem, post #595

jeśli teraz masz za każdym razem guru to na 99,9proc błąd sam zrobiłeś i gdzieś odczytujesz/zapisujesz w bankach/pamięci uzywajac nieparzystego adresu (worda lub longa) ...
[#597] Re: Tworzenie dem

@juen, post #596

Raczej nie.
Zauważyłem jeszcze jedną ciekawostkę. Chyba najważniejszą. Uruchamiam Amosa i od razu go zamykam nic nie wczytując. Wyskakuje mi to:


Co do gry tu wrzucam ADF i kto chce niech sobie zobaczy co się dzieje (takie piksele się pojawiają przy scrollowaniu). Scrolluje się Joyem ekran. Póki co tak ustawiłem.

link
[#598] Re: Tworzenie dem

@tukinem, post #597

Demo działa na 68000.
A jeśli chodzi o Amosa to możliwe że plik konfiguracyjny stwarza problem.
Jak masz możliwość to porównaj pliki Amosa z plikami Amosa z przed "awarii"

Sprawdź Snoopdosem jakie pliki wczytywane są podczas Twojej procedury. (uruchomienie i zamknięcie Amosa).
[#599] Re: Tworzenie dem

@tukinem, post #597

No to masz zwalonego Amosa na maksa... u mnie nigdy takie cos nie wyskoczylo samo z siebie.
[#600] Re: Tworzenie dem

@Norbert, post #598



Przy uruchomionym Amosie. Gdy go wyłączę system się zawiesi i wyskoczy ekran wyżej z błędem.

Co do demka gry, chodziło mi o to, że wychodzą takie piksele dziwne przy scrollu, tak jak tu na zdjęciu te dolne piksele:


Ostatnia aktualizacja: 19.02.2022 14:54:08 przez tukinem
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