kategoria: AMOS
[#451] Re: Farmiga : Work in progress

@tukinem, post #450

Nie, powinno byc srednikiem ; i trzeba pamietac o tym, ze etykiety oraz instrukcje sa jednoliterowe czyli Move to M , Jump to J , Let to L itd...
[#452] Re: Farmiga : Work in progress

@selur, post #451

dluzsze skrypty mozesz zapisywac sobie np. tak :

A$=" Let X=0 ; Let Y=0 ;"
A$=A$+ "Anim 0,(1,10)(2,10)(3,10)(4,10) ;"
A$=A$+" Etykieta: Move 300,0,30 ; Move -300,0,30 Jump Etykieta"

sprostowanie... instrukcji nie trzeba oddzielac srednikiem, moze byc zwykla spacja ale trzeba pamietac, ze bez odzielania mozna sie latwo zgubic wiec lepiej oznaczac srednikiem.
[#453] Re: Farmiga : Work in progress

@tukinem, post #450

Skróciłem czas na przesuwanie i wtedy widać animację, ale dopiero gdy skończy się komenda "Move".
Wpisałem tak:
Amal 1,  "Move 0,-10,5 ; Anim 6,(11,5)(12,5)"

Najpierw wykonuje się pierwsza komenda Move, a później Anim. Nie da się tak, aby jednocześnie się sprajt przesuwał i animował?
[#454] Re: Farmiga : Work in progress

@tukinem, post #453

Zamien kolejnoscia komendy Move i Anim.
[#455] Re: Farmiga : Work in progress

@selur, post #454

No właśnie kapłem się już Czemu tak jest, że animacja musi być przed przesunięciem? W książce nic o tym nie pisze. Aha jeszcze jedno. Wpisałem to tak:
Amal 1,"Petla: Anim 6,(11,5)(12,5) ; Move 0,-10,15 ; Jump Petla"

Dzięki temu zapętliłem cały program Amal nr 1. Dziwne, że gdy zamienię kolejnością właśnie Anim i Move, to wtedy tylko się przesuwa, nie animując się.

TUTAJ jest już wersja z animacją

Ostatnia aktualizacja: 15.07.2022 18:52:05 przez tukinem
[#456] Re: Farmiga : Work in progress

@tukinem, post #455

Nie wiedziałem jak to wszystko ogarnąć. Wszelkie dane magazynu trzymane były w zmiennych liczbowych. Nie mogłem się z tym ogarnąć przy pisaniu zleceń na sprzedaż. Doszedłem do wniosku, że najlepiej będzie wszelkie dane typu ilość danej rzeczy w magazynie, czy posiadanie krowy, ogrodzenia itp. trzymać w banku danych. Wtedy mogę łatwo poprzez nr pozycji w banku wczytać konkretną wartość.

Chodzi o to, że ładuję konkretny nr zlecenia, konkretny potrzebny adres w banku i porównuję go z wartością, którą trzeba osiągnąć. Jeśli się to udaje, to zlecenie zostaje sfinalizowane. Przykład:

1. Potrzeba 90 pomidorów i 10 ziemniaków
2. Pomidor w banku ma pozycję 3
3. Przy zleceniu będą wartości typu wynagrodzenie, produkt wymagany, ilość

Peek (Start(6)+3)>=90 ' ilość pomidorów
Peek (Start(6)+6)>=10 ' ilość ziemniaków.

Liczby 3 i 6 mogę wczytać łatwiej z pliku poprzez Open In, niż przyporządkowywać je do konkretnych zmiennych. Niby mógłbym użyć tablicy, ale już mi się tablice znudziły. Przy adresach pamięci jest więcej możliwości. Muszę sporo kodu przekopać, pozmieniać przypisywanie dla zmiennych liczbowych na zapis/odczyt do banku pamięci. Trochę mi z tym zejdzie.
[#457] Re: Farmiga : Work in progress

@tukinem, post #456

"już mi się tablice znudziły" Przecież tablice to podstawowe narzędzie w programowaniu.

Ostatnia aktualizacja: 17.07.2022 11:08:09 przez mastaszek
[#458] Re: Farmiga : Work in progress

@mastaszek, post #457

Ale już mam użytych 4 albo 5 tablic, poza tym są ograniczone. Nie stworzysz na przykład tablicy dwuwymiarowej 100x100.
[#459] Re: Farmiga : Work in progress

@tukinem, post #458

No w teorii to tablica to nic innego jak zaalokowany kawałek pamięci. A Peek.i Poke to są kultowe komendy Basica
1
[#460] Re: Farmiga : Work in progress

@tukinem, post #458

Nie stworzysz na przykład tablicy dwuwymiarowej 100x100.


Dim TABLICA(100,100) ok, racja
[#461] Re: Farmiga : Work in progress

@selur, post #460

Dim TABLICA(100,100)

Out of variable space
[#462] Re: Farmiga : Work in progress

@tukinem, post #461

szeroki uśmiech

Kazda komorka tablicy w Amosie, ma 4 bajty. Tablica o wymiarach 100*100 to 10000 elementow czyli 10000*4=40000 bajtow. Musisz zarezerwowac AMOS'owi ponad 40 kb pamieci RAM dla wszystkich zmiennych i tablic. Robi sie to na poczatku programu instrukcja

Set Buffer 50

Jak znowu zabraknie pamieci, to powiekszasz ten bufor o nastepne kilobajty zmieniajac ta linie na wieksza wartosc liczona w kilobajtach.
[#463] Re: Farmiga : Work in progress

@selur, post #462

Już calutki kod przerobiłem na Poke i Peek nie chce mi się teraz przepisywać na tablice, chociaż kusząca propozycja. 3 dni myślałem, jak rozgryźć taki algorytm, który będzie z pliku wczytywać:
1. towar na sprzedaż
2. ilość potrzebna
3. ilość w magazynie

chciałem użyć nie skomplikowanej pętli, która będzie sprawdzać odpowiednią liczbę (ze zmiennymi to odpada, bo nie da się wczytać nazwy zmiennej i później jej użyć).

Przykład:
If Peek(Start(6)+'nr konkretnego towaru'>=WYMAGANA_ILOSC Then 'zlecenie zaakceptowane'

Wiem, że to bardzo duże utrudnienie, bo numerkami z banku nie zapamięta się konkretnego towaru. Powiedz mi jeszcze jedną rzecz. Tu napiszę dwa kody. Czy faktycznie ten drugi będzie działać szybciej?

1.
Poke Start(6)+1,1
If Peek(Start(6)+1=1 Then Poke Start(6)+1),Peek(Start(6)+1)+2

2.
PSZENICA=1
If PSZENICA=1 THEN Add PSZENICA,2


Pytam, bo odnoszę wrażenie że teraz gra wolniej działa.
[#464] Re: Farmiga : Work in progress

@pisklak, post #459

Jasne, ale dla początkującego kodera tablice są łatwiejsze w ogarnięciu. PeekPokiem się robi to samo i to badziej oszczędnie i szybciej, ale trzeba pamiętać gdzie potrzeba bajt, word, czy longword. Tukinem na razie peekpokuje, ale jak będzie potrzebował wartości większych niż bajt i będzie musiał skakać po bankach w odpowiednie miejsca, to się skończy rumakowanie i pewnie nastąpi powrót do tablic :)
[#465] Re: Farmiga : Work in progress

@mastaszek, post #464

Jak narazie daję radę. Spisałem wszystkie adresy, co jest czym. Kod z Peek/Poke działa mi chyba trochę wolniej niż ten ze zmiennymi. A niby bank mam zarezerwowany jako Data (dla fast ram). W takim razie spowalnia wyczytywanie z banku pamięci? Szybciej byłoby na zmiennych i tablicach?

Więszych wartości nie będę potrzebować, także Loke i Doke nie będę używać. W magazynie można mieć max 100 rzeczy, więc każda wartość w banku jest mniejsza niż 255 i wystarczy mi Poke/Loke

Ostatnia aktualizacja: 17.07.2022 18:17:09 przez tukinem
[#466] Re: Farmiga : Work in progress

@tukinem, post #465

Odczyt i zapis do tablic to czytanie/zapisywanie longwordów, czyli 4 bajtów - to tak jakbyś robił Leek/Loke. Czyli Peek i Poke są szybsze i jeśli nie potrzebujesz wartości większych niż bajt/word, to szybciej jest peekpokować. Natomiast każdy peekpok to jest zapis/odczyt z pamięci, co w amosie samo w sobie zbyt szybkie nie jest. Jak chcesz szybciej, to niestety kierunek assembler.

PS Jeśli możesz odczytać peekiem wartość i masz to robić kilka razy, to lepiej raz odczyteć peekiem, załadować wartość do zmiennej, robić operacje na zmiennej i na końcu zapisać pokiem. Chodzi o to, żeby nie powtarzać tego samego peek/poke jeśli to nie jest konieczne.


Ostatnia aktualizacja: 17.07.2022 18:25:50 przez mastaszek
[#467] Re: Farmiga : Work in progress

@mastaszek, post #466

Tak myślałem. Jednak odczytywanie ze zmiennej jest szybsze niż z banku pamięci. Wiemy, że to minimalna różnica, ale kod tej gry jest już bardzo długi i naprawdę mnóstwo odczytów/zapisów w nim jest.

W takim razie jeszcze raz ten kod przerobię.

Nie no teraz sprawdzałem jeszcze raz i jednak obie wersje działają tak samo po skompilowaniu

Ostatnia aktualizacja: 17.07.2022 18:53:46 przez tukinem
[#468] Re: Farmiga : Work in progress

@tukinem, post #463

Poke Start(6)+1,1
If Peek(Start(6)+1=1 Then Poke Start(6)+1),Peek(Start(6)+1)+2


W odczytywaniu wartosci z pamieci, nie uzywamy funkcji adresu startu Banku, bo wywolujemy ja za kazdym razem!

to sie pisze tak...

Global SB_6

SB_6=Start(6) : rem tu zmiennej globalnej przypisujemy adres banku numer 6

Poke SB_6,1
Z1=Peek(SB_6+1) : rem zmiennej Z1 przypisujemy wartosc spod adresu Bank_6+1
If Z1=1 then Poke SB_6+1,Z1+2


Po kompilacji odczytywanie z pamieci dziala szybciej niz w edytorze.
Funkcja Peek/Deek albo Poke/Doke dziala tak samo szybko.
Loke i Leek dziala 2 razy wolniej niz funkcje Poke i Doke.

Zebyt odczytac z pamieci zmienna ze znakiem ujemnym trzeba koniecznie uzyc funkcji Leek i Loke inaczej zmienna straci wartosc bo wszystkie liczby ujemne w AMOSie zapisane sa na 4-bajtach.

a no i od tego momentu nie wolno zmieniac wartosci zmiennej SB_6, bo inaczej mozemy wyjsc poza adres banku numer 6 i schrzanic program. Zmienna, ktora zawiera adres poczatku jakiegos Banku traktujemy jako stala "tylko do odczytu".

Ostatnia aktualizacja: 17.07.2022 19:21:01 przez selur
[#469] Re: Farmiga : Work in progress

@selur, post #468

Z1=Peek(SB_6+1) : rem zmiennej Z1 przypisujemy wartosc spod adresu Bank_6+1

To w takim razie nie ma sensu zabawy w banki pamięci, skoro i tak wczytujemy dane z banku do zmiennych.
[#470] Re: Farmiga : Work in progress

@tukinem, post #469

Chodzi o to, ze w instrukcjach warunkowych uzywac prostych zwrotow i mozliwie jak najkrotszych.
To ma zwiazek z optymalizacja programu.

np.

SB_6=Start(6)
Z1=Peek(SB_6+1)

If Z1=1 then ....
If Z1=2 then ...
If Z1=3 then ...

jest szybsze niz

If Peek(Start(6)+1)=1 then ...
If Peek(Start(6)+1)=2 then ...
If Peek(Start(6)+1)=3 then ...
[#471] Re: Farmiga : Work in progress

@selur, post #470

A jakby w pętli głównej dać tak:
SB6=Start(6)
PSZENICA=Peek(SB6+1)
KUKURYDZA=Peek(SB6+2)
         ...


Jeśli jakiś warunek będzie spełniony, zapisywałbym od razu do banku pamięci daną liczbę, a ona i tak przy następnej klatce zostanie przypisana do zmiennej liczbowej. Nie będzie to spowalniać? Na pewno by ułatwiło sporo.
[#472] Re: Farmiga : Work in progress

@tukinem, post #471

SB6=Start(6) << to powinno być poza główną pętlą. Najlepiej gdzieś zaraz po zarezerwowaniu pamięci dla banku. Tu chodzi o to, że zmiennej SB6 tylko jeden raz podajesz adres początku banku, żeby nie musieć za każdym razem używać Start(6) w pętli głównej.

Ile masz elementów w tym banku nr 6?

Ostatnia aktualizacja: 17.07.2022 21:22:15 przez mastaszek
[#473] Re: Farmiga : Work in progress

@mastaszek, post #472

1 - pszenica
2 - kukurydza
3 - pomidor
4 - burak
5 - marchew
6 - ziemniak
7 - mleko
8 - jajko
9 - drozdze
10 - butelka
11 - cukier
12 - bimber
13 - miód
14 - krowa
15 - kura
16 - bimbrownia
17 - cukrownia
18 - ul
19 - wędka
20 - nozyce
21 - owca
22 - welna
23 - dzien
24 - ogrodzenie1
25 - ogrodzenie2
26 - mlyn
27 - maka
28 - chleb
29 - kot
30 - piec
31 - ogrodzenie3

Tyle. Zarezerwowałem bank długości 500, ale mam 31 pozycji. Czy to wiele zmieni jeśli zmienię Start(6) na SB_6?
[#474] Re: Farmiga : Work in progress

@tukinem, post #473

Skoro masz tak niewiele pozycji w banku, to w ogóle trzymaj wartości w zmiennych, bez zapisywania ich w banku. Nie wiem czy dobrze rozumiem, ale jeśli robisz np. tak:

kot=peek(adres)
if kot=cośtam then kot=cośtam
poke adres,kot



To jeśli w ogóle wyrzucisz zapis/odczyt z banku, to na jedno wyjdzie :) Może w ogóle nie potrzebujesz tego banku?




Ostatnia aktualizacja: 17.07.2022 21:52:11 przez mastaszek
[#475] Re: Farmiga : Work in progress

@mastaszek, post #474

"Czy to wiele zmieni jeśli zmienię Start(6) na SB_6?"

Właśnie przeprowadziłem testy i każde użycie Start() powoduje DUŻE spowolnienie. Powinieneś więc bezwzględnie wywalić wszystkie Start() z pętli głównej.
[#476] Re: Farmiga : Work in progress

@mastaszek, post #474

Skoro masz tak niewiele pozycji w banku, to w ogóle trzymaj wartości w zmiennych, bez zapisywania ich w banku.

Po to chciałem użyć banku i jego adresów, aby usprawnić zlecenia na sprzedaż towaru. Przykładowo ciężko wczytać z pliku z danymi nazwę zmiennej i jej użyć. Np. w jednym zleceniu potrzeba ziemniaków a w innym bimbru. Wczytując dane zlecenia nie wyczytam jaką zmienną użyć. Łatwiej wyczytać numer konkretnego adresu w banku pamięci i z niego skorzystać.

Nie wiem czy dobrze rozumiem, ale jeśli robisz np. tak:

kot=peek(adres)
if kot=cośtam then kot=cośtam
poke adres,kot

Chciałem zrobić mniej więcej tak:
Do
MLEKO=Peek(Start(6)+7) : 'wczytanie z banku pamięci do zmiennej
'                   ...długi kod 
If KROWA=1 and KLIK=1 Then Poke Start(6)+7,MLEKO+1 : zapis do banku pamięci

Jak tylko to możliwe używam zmiennych, a nie odwołań do banku pamięci. Jedynie podczas początku pętli przy wczytywaniu z banku do zmiennych i przy zapisie, które później i tak są aktualizowane.

< jeśli wiele razy w pętli głównej używasz Start(), to użycie zmiennej w zamian może być zauważalne.

Jak zauważalne? Patrząc na kod będzie estetyczniej? Bo w szybkości działania to chyba nic nie da. Ta gra i tak szybciej nie będzie działać. Nie ma szans
[#477] Re: Farmiga : Work in progress

@tukinem, post #476

Odczyt początku banku ze zmiennej zamiast użycia funkcji Start() jest 20% szybsze. Wywal Start() z pętli głównej. Amos jest wolny, więc jeśli gdzieś coś można zoptymalizować małym kosztem, to warto. A to akurat jest optymalizacja darmowa.
[#478] Re: Farmiga : Work in progress

@mastaszek, post #477

OK.
[#479] Re: Farmiga : Work in progress

@tukinem, post #478

Nie musisz tego ręcznie robić. W menu edytora amosa jest opcja "Replace", zaznaczasz Replace All (lub jakoś tak) i zamienia automatycznie np. wszystkie Start(6) na SB6
[#480] Re: Farmiga : Work in progress

@mastaszek, post #479

Wybrałem SEARCH=>REPLACE NEW
Enter string to look for: Start(6)
Enter replace string: POCZ
Zaznaczyłem "All occurences" i nic nie zmieniło. Spróbuję zaznaczyć wszystko i wtedy

To samo. Pisze, że nic nie znaleziono.

Nie ważne już... Zamiast Start(6) napisałem start(6) i dlatego nie wykrył nic.

Ostatnia aktualizacja: 17.07.2022 22:47:36 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