atarionline.pl Action! - co robie źle ? - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1: CommentAuthortatko74
    • CommentTime12 Apr 2024
     
    Witam
    Bawie sie Action!'em i przy zabawie z tablicami coś mi nie gra.
    Może ktoś podopowie o co chodzi - gdzie bład - w programie - w moim myśleniu ?

    kod:
    MODULE
    BYTE mx=[10]
    BYTE my=[5]
    BYTE ARRAY tablica(1000)

    PROC generator()
    BYTE test,px,py
    Graphics(0)
    PrintE ("")
    PrintE ("gen")
    for py=1 to my
    do
    print("# ")
    for px=1 to mx
    do
    test=rand(2)
    tablica(py*px)=test
    printb (tablica(py*px))
    print(",")
    od
    printE(" #")
    od
    PrintE ("koniec")

    PrintE ("poka")
    for py=1 to my
    do
    print("# ")
    for px=1 to mx
    do
    printb (tablica(py*px))
    print(",")
    od
    printE(" #")
    od
    PrintE ("koniec")
    RETURN


    a efekt na skrinie - jak widać "przelecenie" po raz drugi tablicy pokazuje inne wartości =/
    • 2:
       
      CommentAuthorjhusak
    • CommentTime12 Apr 2024
     
    Tam chyba jest jakiś błąd z indeksami tablicy, spróbuj wyliczyć indeks wcześniej do zmiennej i podaj zmienną jako indeks.
    • 3:
       
      CommentAuthorGeorge
    • CommentTime12 Apr 2024
     
    py*px nie omiata całej 50 elementowej tablicy.
    Bo na przykład 2 * 3 = 3 * 2
    Do elementu 6 wchodzisz dwa razy i ustawiasz losowo.
    Wyświetlasz w innym miejscu niż wynika z indeksu.

    Drugie wyświetlenie wyświetla indeks 6 w tych samych dwóch miejscach na ekranie, ale z drugą wylosowaną wartością, pierwsze wyświetlenie wyświetla obie losowe wartości.

    poszedłbym po pierwsze w indeksowanie od zera, a następnie indeksował: py*10+px, ale to pierwsze nie jest konieczne, tylko chyba wygodniej poźniej na ekranie znaleźć wartość.
    • 4:
       
      CommentAuthorjhusak
    • CommentTime12 Apr 2024 zmieniony
     
    A, jasne. Lampka mię się nie zaświeciła z tym powtarzaniem indeksów :D

    Poza tym tu chodzi o ćwiczenie chyba, a nie o część programu, bo sobie nie wyobrażam tak pokrętnej logiki przy kodowaniu czegokolwiek :)

    Ale nie przejmuj się tatko74 - to norma przy zabawie. Coś miało zająć 5 minut, a zajmuje godzinę, bo błąd się schował w miejscu, gdzie go nie podejrzewamy :)
    • 5:
       
      CommentAuthorGeorge
    • CommentTime12 Apr 2024
     
    No niby tak można adresować ekran, ale mnożenie na Atari zbyt drogie :)
    • 6: CommentAuthortatko74
    • CommentTime12 Apr 2024
     
    Sprawdzę inne metody :)
    Dziś już wjechał płyn złocisty więc czas na zadumę XD i złote przeboje :)
    Ale - może czegoś nie doczytałem - a Action nie można zdefiniować tablicy dwuwymiarowej ?
    • 7:
       
      CommentAuthorGeorge
    • CommentTime15 Apr 2024 zmieniony
     
    Nie.
    Ale możesz sobie zrobić
    CARD ARRAY addrs
    , gdzie będziesz przechowywać adresy innych tablic.
    • 8: CommentAuthortatko74
    • CommentTime15 Apr 2024
     
    Hej
    Dzięki za odpowiedzi
    Finalnie wygląda to tak jak poniżej
    To nie jest żaden konkretny projekt, a wyłącznie moje zabawy z Action!, próby "z czym to się je" :)
    Teraz działa jak oczekiwałem. Troche irytujące jest że nie moge użyć funkcji jako argumentu - no chyba że czegoś nie wiem.
    Np.:
    test=rand(3)
    SETIT(px,py,test)

    nie potrzebna zmienna - bo mogło by być
    SETIT(px,py,rand(3))


    Efekt zmagań z Action!
    MODULE
    BYTE mx=[32]
    BYTE my=[9]
    BYTE ARRAY tablica(1000)

    BYTE FUNC GETIT(BYTE x,y)
    RETURN(tablica(y*mx+x))

    PROC SETIT(BYTE x,y,c)
    tablica(y*mx+x)=c
    RETURN

    PROC GEN()
    BYTE test,px,py
    PrintE ("gen")
    for py=0 to my-1
    do
    for px=0 to mx-1
    do
    test=rand(3)
    SETIT(px,py,test)
    od
    od
    RETURN

    PROC POKA()
    BYTE test,px,py
    PrintE ("poka")
    for py=0 to my-1
    do
    for px=0 to mx-1
    do
    test=GETIT(px,py)
    printb (test)
    od
    printE(" ")
    od
    RETURN

    PROC MAIN()
    Graphics(0)
    GEN()
    POKA()
    RETURN
    • 9:
       
      CommentAuthorjhusak
    • CommentTime15 Apr 2024 zmieniony
     
    Trzeba mieć na uwadze, że Action! nie ma prawie żadnych optymalizacji, jednocześnie generując maksymalnie znośny kod przy tych założeniach.
    To właściwie jest TRANSLATOR i tak został zaprojektowany.

    Więc, jeśli piszesz:
    a=2+3*5, to zostanie wygenerowany kod 3*5 (skok pod A000, gdzie jest procka mnożenia), potem add #2 i sta a. Normalne kompilatory widzą to jako stałą 17.

    Jednocześnie zamieniając tablica(y*mx+x) na GET/SETIT dodajesz w najgłębszej pętli mnóstwo (kilkadziesiąt bajtów) kodu przekazującego sobie dane. Chociaż pierwsze 3 bajty argumentów są przekazywane w rejestrach A,X,Y, a reszta przez rejestry na stronie zerowej.
    • 10: CommentAuthortatko74
    • CommentTime15 Apr 2024
     
    Hej
    Jestem świadom tego potworka - znaczy jakie zamieszanie jest 'w tle'.
    Ale to tylko zabawa - a ja się bawię Action! - i nie chciał bym tej zabawy zaczynać od... asamblera :)
    Sądzę iż jakakolwiek próba zastąpienia tego mnożenia pewnie tak by się zakończyła.
    Co do dodatkowych funkcji i procedur - jestem świadom iż taki kod generuję więcej skoków,zmiennych itd., ale jak pisałem wyżej - sprawdzam jak się tego używa. Zwłaszcza że ze mnie d... nie programista XD.
    • 11:
       
      CommentAuthorjhusak
    • CommentTime15 Apr 2024
     
    Eeee, tam. Dobrze sobie radzisz :)
    • 12:
       
      CommentAuthoramarok
    • CommentTime15 Apr 2024
     
    @tatko74. Jakiś czas temu bawiłem się Action! i popełniłem kilka prostych programików. Można znaleźć je tutaj: ->link<-

    Troche irytujące jest że nie moge użyć funkcji jako argumentu - no chyba że czegoś nie wiem.

    Da się to w jakiś sposób obejść, jak w każdym języku. Możesz zobaczyć przykłady w poniższych zadaniach gdzie funkcje lub procedury są przekazywane jako argumenty do procedur w roli funktorów czy predykatów:
    - Repeat ->link<-
    - Rate counter ->link<-
    - Sort using custom comparator ->link<-
    • 13: CommentAuthortatko74
    • CommentTime16 Apr 2024
     
    @amarok - jestem pod wrażeniem - i dzięki za linka - nie omieszkam tam zaglądać :)
    • 14: CommentAuthorCuzz
    • CommentTime21 Apr 2024
     
    ja się na tym nie znam ale z tego co wiem jeśli action rozumie pseudo asembler matematyczny ale ze wsparciem węwnetrznej architerktury procesora co przybliża to do gier typu river raid draconus to da się normalnie zrobić coś na poważnie, jest tylko mały problem, trzeba mieć pomysł na gre, a to wymaga talentu artystycznego, i tu trzeba już szanować programistę. Mój talent się kończy na pokemonach. Jednego tylko nie rozumiem jak wy robicie te gry zespołowo, dla mnie to zong, musicie sie dobrze znać. ja próbowałem kodować ekspresjami, to żałosne. Moge się pochwalić, że znalazłem sposób na pisanie nowych gier. Robie to w altirze, która sie wiesza, ale kod sie wykonuje. Pojawia się nowy pliczek. To chyba windows próbuje blokować. Czarny ekran, a potem system sie na chwile wyłącza, to chyba TPM słynne. Mnie to nie obchodzi , bo to zwykłe hobby. A co do action , powinni to dać do podstawówek bo jest prostszy od c++. Nie uwierzycie jakie to żałosne próbować coś debugować, po prostu coś pisze a engine gry dalej ten sam, serio trzeba od początku, inaczej albo kod sie rozlezie, albo engine sam go wyrzuci albo zabezpieczenia. W action jest inaczej to wszystko jest twoje co piszesz, masz nad tym pełną kontrole, to nic że to matematyka a nie logika. Jest tego pewien plus bo ma sie antica, mozna wygenerować wiele ciekawych efektów w prosty sposób. A jeśli chodzi o pozycjonowanie grafiki jest to proste i jeśli sie to potrafi w action to na prawde mozna juz prawie wszystko. jesli wprowadziłem kogoś w bład to sorry ale ja w nim nie programuje, wlasciwie to komputer to skomplikowana maszyna nawet 8-bitowce nie są proste . nie sugerujcie sie .
    • 15: CommentAuthortatko74
    • CommentTime15 May 2024 zmieniony
     
    W Action nie działa odliczanie wstecz w pętli FOR ?

    BYTE i 
    Put(125)
    PrintE ("1do10")
    for i=1 to 10 step 1
    do
    PrintF ("%I,",i)
    od
    PrintE ("")
    PrintE ("10do1")
    for i=10 to 1 step -1 ; tu po prostu nic sie nie dzieje :/
    do
    PrintF ("%I,",i)
    od
    PrintE ("")
    • 16:
       
      CommentAuthorjhusak
    • CommentTime15 May 2024 zmieniony
     
    Instrukcja nic nie mówi o wartościach parametrów FOR.
    Natomiast FOR I=10 TO 10 STEP -1 DO PrintBE(I) OD

    wypisuje:
    10
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0

    Wiem, gupie.

    Podobnie, jak za -1 podamy 255 czy 65535.

    Ale nie używał bym tego tak.
    • 17: CommentAuthortatko74
    • CommentTime15 May 2024
     
    No fakt - i to zawsze "do zera" :/
    W instrukcji też to zauważyłem - a raczej nie zauważyłem :)
    Poradzimy sobie inaczej... ;)
    Skoro @jhusak cię tu złapałem :)
    Poradziłeś sobie jakoś z tym komunikatem "adler32 does not match" w atari800 ?
    • 18:
       
      CommentAuthorjhusak
    • CommentTime15 May 2024 zmieniony
     
    jeszcze nie kompilowałem nowych źródeł. Zawsze to robię, jak coś rozpoczynam, a teraz raczej kończę :)

    A nie - w starych też jest ten problem. Aby go ominąć, musiałem nagrywać wielokrotnie skrypt, aż zadziałał. Trzeba też było robić długie, dużo dłuższe pauzy.
    • 19: CommentAuthortatko74
    • CommentTime5 dni temu
     
    Dlaczego to kończy się zwiechą ? :/
    Jak wprowadzać znaki bezpośrednio do pamięci - bez "print" ?

    PROC MAIN()
    BYTE i,continue
    CARD scrmem

    GRAPHICS(1)
    scrmem=peekc(88)

    for i=0 to 255
    do
    poke(scrmem+i,i)
    od

    RETURN
    • 20:
       
      CommentAuthorjhusak
    • CommentTime5 dni temu zmieniony
     
    Dobrze robisz, a to nie zwiecha, tylko zapętlenie pętli for. Jak chcesz, żeby się nie zapętlało, to wpisz "to 254" albo zamień typ "i" na card.

    To dość częsta przypadłość kompilatorów, bo standardowo przy takim rodzaju pętli porównanie na końcu jest <=, więc w tym przypadku zawsze prawdziwe dla każdego i. Dlatego w asm się to pisze z pominięciem jednego porównania, np.

    ; petla 0-255 w asm
    ldx #0
    label
    zrób cośtam
    inx
    bne label



    Tak naprawdę jest to pętla "repeat until"

    No i do takich zastosowań nie musisz pisać "proc main()" i "return"

    BYTE i
    byte pointer scrmem

    GRAPHICS(1)
    scrmem=peekc(88)

    for i=0 to 255
    do
    scrmem^=i
    scrmem==+1
    od
    ; do od


    Tu troszkę bardziej zaawansowane podejście, a i krótsze w kompilacji :)
    • 21:
       
      CommentAuthorPeri Noid
    • CommentTime5 dni temu zmieniony
     
    Czyli twoje, @jhusak, też się zapętli? ;-)
    • 22:
       
      CommentAuthorjhusak
    • CommentTime5 dni temu
     
    Oczywiście, ale zapełni cały ekran i widać, gdzie się zapętliło :)
    • 23: CommentAuthortebe
    • CommentTime5 dni temu
     
    w MP się nie zapętli, nawet dla typu BYTE