atarionline.pl Mad Pascal - Peek - 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: CommentAuthorMq
    • CommentTime2 dni temu
     
    Natrafiłem na problem z instrukcją Peek.

    Działa poprawnie:
    Peek(liczba)
    Peek(zmienna)
    Peek(zmienna+liczba)
    Peek(zmienna+zmienna)

    ale jak zrobię coś takiego:
    Peek(zmienna-liczba)

    to nie działa. Robi wtedy tak samo jak by było Peek(zmienna+liczba).

    Konkretnie zmienna to jest u mnie word - adres znaku gdzieś tam na ekranie i chcę pobrać znak który jest o jedno miejsce w lewo lub w prawo.
    W prawo działa dobrze, a w lewo nie chce działać.

    Fragment kodu "w prawo" (tmpw to jest zmienna word zawierająca interesujący mnie adres znaku na ekranie; j to zmienna byte):
    j:=Peek(tmpw+1);

    W pliku lst dostajemy:
    mwy TMPW :bp2
    ldy #$01
    lda (:bp2),y
    sta J


    Fragment kodu "w lewo":
    j:=Peek(tmpw-1);

    I to co się wygenerowało w pliku lst:
    mwy TMPW :bp2
    ldy #$01
    lda (:bp2),y
    sta J

    Czyli to samo - wychodzi na to że obojętnie czy zrobię tmpw+1 czy tmpw-1 to dla kompilatora jest takie samo działanie.


    Czy to błąd kompilatora, czy ja powinienem o coś dodatkowo zadbać?

    Mad Pascal w wersji 1.6.3
    Mads 2.1.0
    • 2: CommentAuthorwojtas76
    • CommentTime2 dni temu
     
    W czym testujesz?
    • 3: CommentAuthortebe
    • CommentTime2 dni temu zmieniony
     
    POKE, PEEK był poprawiany w wersji 164, powinieneś uaktualnić kompilator do nowszej wersji

    ->link<-
    • 4: CommentAuthorwojtas76
    • CommentTime2 dni temu
     
    Tebe chyba ma dyżur :) Mq doradzał mi nowszą wersję;) Geany może podawać w terminalu więcej szczegółów?
    • 5: CommentAuthorMq
    • CommentTime2 dni temu
     
    Dziękuję @tebe. Faktycznie aktualizacja kompilatora naprawiła problem:-) Wcześniej jeszcze zauważyłem podobny kłopot jak się dodawało liczbę większą niż 256, ale to już też nieaktualne, zapewne był to ten sam problem który został poprawiony. Teraz jest super:-)

    @wojtas76: nic nie testuję, piszę grę, był kiedyś wątek o niej "Dude Story" (znajdziesz na forum) - tam było takie tech demo bardzo jeszcze proste w stosunku do tego co mam już w tej chwili. Jeszcze w tym roku planuję opublikować demo grywalne zawierające fragment gotowej gry, a w przyszłym roku mam nadzieję na ukończenie całości. Sporo z tym roboty, bo gra ma być duuuuuża:-)
    • 6: CommentAuthorastrofor
    • CommentTime2 dni temu zmieniony
     
    jak ktos ma dyzur, ja mam pytanie odnosnie mad pascala , wlasciwie do pascala, czy da sie zrobic zeby readkey nie przerywal dzialania programu, tylko program dzialal dalej, ana readkey byl listener.
    Podobnie jak na joystick.
    • 7:
       
      CommentAuthorjhusak
    • CommentTime2 dni temu
     
    Coś w ten deseń:
    if peek(764)!=255 then k:=readkey();
    • 8: CommentAuthortebe
    • CommentTime2 dni temu
     
    if keypressed then k:=readkey;

    Przykład użycia: snake.pas

    ->link<-
    • 9: CommentAuthorastrofor
    • CommentTime2 dni temu zmieniony
     
    @tebe :a czemu skasowales tower.pas ?? dodatkowo fajnie byloby jak by ktos podeslal przyklad timera w mad pascalu, albo linka do przykladu
    • 10: CommentAuthortebe
    • CommentTime2 dni temu zmieniony
     
    tower itp przeniesione co \crt_console\

    p.s.
    jakiego timera? IRQ? czy po prostu RTCLOCK?
    • 11: CommentAuthorastrofor
    • CommentTime1 dzień temu
     
    bardziej chyba RTCLOCK, bo irq to systemowe jest. Chodzi o odpalanie w grze okreslonych eventow w okreslonych interwałach - na apryklad co 3 sekundy, 1 sekundę. w open pascalu jest Time := Round(Timer / 1573032 * 86400), a Timer jest chyba zmienną globalną.
    ->link<-
    • 12: CommentAuthortebe
    • CommentTime1 dzień temu zmieniony
     
    w SysUtils jest GetTickCount, zwraca czas

    function GetTickCount: cardinal;
    • 13: CommentAuthormono
    • CommentTime1 dzień temu
     
    Można do takich rzeczy użyć TIMCNT2.
    • 14: CommentAuthorMq
    • CommentTime1 dzień temu
     
    Ja sobie robię zmienną typu byte i w przerwaniu vbl po prostu ją zwiększam, robię tam też warunek, że np. jak jest 5 to ma być 0. W ten sposób mam licznik do iluś tam. Takich zmiennych można zrobić sobie kilka jeżeli potrzebujemy zliczanie do nieskorelowanych ze sobą wartości (np. do 3, do 4, do 5, do 7 itp.).
    Dodatkową zaletą takich liczników jest to, że można w oparciu o nie sobie np. niektóre rzeczy wykonywać w określonych ramkach, np. można sobie założyć cykl pięciu ramek i w każdej robić coś innego, dzięki czemu zyskujemy miejsce na mnóstwo rzeczy, które mogą się dziać jednocześnie. W taki sposób robię np. w jednej ramce poruszanie gracza, w innej poruszanie przeciwników, a w jeszcze innej sprawdzanie kolizji.
    Jeżeli licznik tego typu ma służyć do czegoś innego, np. do odmierzania czasu jakiegoś dłuższego, to tak samo można to zrobić, tylko trzeba sobie te zmienne odpowiednio matematycznie przeliczać.
    Przerwanie vbl w PAL wywoływane jest co 1/50 sekundy, więc jak policzymy do 50 to mamy odmierzoną sekundę.