atarionline.pl Zmiana koloru duszka w połowie jego wysokości? - 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.  
    Hej,
    Czy takie coś jest możliwe w Atari?
    • 2: CommentAuthorseban
    • CommentTime25 Feb 2013
     
    ale w której połowie? ;) w poziomie czy w pionie :) Jedno i drugie jest możliwe chociaż zmiany koloru w poziomie są mocno dyskusyjne jeżeli chodzi o skomplikowanie i zajmowany czas CPU, a co przy tym idzie trzeba mocno zastanowić się nad sensem takiej operacji :]
  2.  
    Chodzi o to, żeby górna połowa miała inny kolor niż dolna.

    Bo szkoda mi dwóch duszków marnować :)
    • 4:
       
      CommentAuthorxeen
    • CommentTime25 Feb 2013
     
    takie zmiany w pionie są robione w Calisto
    • 5: CommentAuthorbrx
    • CommentTime25 Feb 2013
     
    A zobacz też np. grę "Hero" :)

    Duszek nawet tęczą może być, problemem jest potencjalna trudność takiej operacji, czyli komplikujący się program DLI, zużycie procesora, w trybach tekstowych poważnie utrudnić wszystko mogą tak zwane martwe linie.
    • 6: CommentAuthorxxl
    • CommentTime25 Feb 2013 zmieniony
     
    lda #$ff
    sta GRAFP0
    lda #$7c
    sta HPOSP0
    @ lda RANDOM
    sta WSYNC
    sta COLPM0
    jmp @-


    przyklad wyjasnia
  3.  
    Fajnie mryga, dzięki :)

    To jeszcze dopytam jak to zgrać z konkretną linią? Np. 50 linijek jest w jednym kolorze, a reszta w drugim.
    • 8: CommentAuthorseban
    • CommentTime25 Feb 2013
     
    zmiana koloru w pionie nie jest jakaś specjalnie problematyczna. Najprościej i najszybciej zmieniać rejestr koloru danego duszka na przerwaniu DLI.

    Jak tryb na ekranie? Tekstowy? Graficzny? Zmiany mają być dynamiczne, tzn. pozycja duszka wraz ze mianą koloru ma się zmieniać czy może ma być to zmiana statyczna w jednym miejscu ekranu?
    • 9:
       
      CommentAuthormgr_inz_rafal
    • CommentTime25 Feb 2013 zmieniony
     
    @seban
    Tryb na ekranie to mieszanka $07, $06 i $02 (tekstowe)

    Myślę, że to co chcę uzyskać najprościej będzie opisać w ten sposób:
    1. Chcę "narysować" jednym duszkiem flagę Polski, dlatego rysuję np. 30 pustych linii sprajta, potem 10x $ff w kolorze białym, potem cyk - zmieniam kolor - i rysuję 10x $ff w kolorze czerwonym. Czyli zmiana koloru w linii 40.
    2. Chcę, aby ta flaga poruszała się w pionie, czyli przesuwam dane sprita i jednocześnie muszę zmenić moment, w którym następuje przełączenie koloru.
    • 10:
       
      CommentAuthorjhusak
    • CommentTime25 Feb 2013
     
    Jeśli wystarczy Ci rozdzielczość dwuliniowa, zsynchronizuj się z vcount.
    Jeśli pojedyncza, to najprościej ustawiasz w odpowiedniej linii DLI a zmieniasz tę linię w nurcie głównym (innym kasujesz DLI, a w nowej ustawiasz nowe)

    Ale jeszcze śmieszniej, to ustawiasz kolor na czarny, potem w odpowiedniej linii na biały (DLI) potem na czerwony, potem znowu na czarny. W ten sposób nie musisz zmieniać danych sprajta w żaden sposób :)
    • 11: CommentAuthorseban
    • CommentTime25 Feb 2013
     
    pytanie ile linii ekranowych ma zajmować twoja flaga. Pytam bo może nie warto bić się o czas CPU tylko wykonać jedno przerwanie DLI i potem mieć tablice koloru dla całej wysokości sprite-a. Jeżeli to ma być duży obiekt to warto się zastanowić nad jednym przemieszczalnym przerwaniem DLI. Możesz pokazać swój display list?
    • 12:
       
      CommentAuthormgr_inz_rafal
    • CommentTime25 Feb 2013 zmieniony
     
    Gra jest jeszcze w zbyt wczesnej fazie koncepcyjnej, żeby pokazywać DL. Będzie się ona pewnie jeszcze zmieniać.

    Ale dzięki Waszym wskazówkom już wiem mniej więcej w jakim kierunku dalej badać temat. Poczytałem sobie już o DLI i spróbuje na początek zrobić jakąś prostą zmianę koloru, żeby trochę oswoić się z tematem.

    Jak się za mocno zagrzebię, to najwyżej poświęcę jednego sprita, bo przede wszystkim chcę zdążyć na Fortification :)


    -------------
    Edit:
    Cholera, ale to jest w sumie proste :) Dorobiłem prockę obsługi DLI i w niej zmieniam kolor sprita na podstawie VCOUNT, co daje efekt jak na obrazku.

    Czyli tą metodą zmieniam kolor z dokładnością do linii trybu?



    -------------
    Edit 2:
    Jeszcze dla pewności dopytam: czy to jest poprawnie (pod względem technicznym) zbudowana procedura obsługi przerwania?
    pha
    lda VCOUNT
    sta WSYNC
    sta COLPM0
    pla
    rti
    • 13: CommentAuthormono
    • CommentTime25 Feb 2013
     
    Poprawna. Jeśli będziesz chciał używać dodawania/odejmowania to pamiętaj o CLD/SED.
  4.  
    A ile cykli procesora mogę zjeść podczas obsługi przerwania?
    • 15: CommentAuthormono
    • CommentTime25 Feb 2013
     
    Aż do następnego NMI. Art w Syzygy 5 p.t. "Dlaczego Antic jest miły dla 6502?" przybliża szczegóły ile czasu na co CPU ma w linii.
    • 16:
       
      CommentAuthormgr_inz_rafal
    • CommentTime25 Feb 2013 zmieniony
     
    A jak w tym Syzygy przejść dalej z ekranu "Set Up"?

    -------
    Edit: Dobra, już wiem... "ESC" :)
    • 17:
       
      CommentAuthorpirx
    • CommentTime25 Feb 2013 zmieniony
     
    Jak już się nie będziesz bał o zachodzenie na siebie przerwań to zamiast phać na stos można zapisywać na zpage
    sta rejestr_A
    sty rejestr_Y
    stx rejestr_X
    ...
    ...
    lda rejestr_A
    ldy rejestr_Y
    ldx rejestr_X
    rti
    • 18: CommentAuthorseban
    • CommentTime25 Feb 2013
     
    przerwanie DLI określa tylko początek wywołania twojej procedury obsługi tegoż przerwania. Jeżeli napiszesz kod tak że od momentu wywołania będzie zmieniać kolor co 1 linię ekranową (pętla plus opóźnienie np. sta $d40a) to tak naprawdę dysponujesz właściwie dowolną "precyzją" co do zmian rejestrów GTIA. Pamiętaj że tyle cykli ile będzie się wykonywało przerwanie DLI, to tyle czasu "ubędzie" puli dostępnej dla programu wykonującego się w "ciągu głównym".
    • 19:
       
      CommentAuthormgr_inz_rafal
    • CommentTime26 Feb 2013 zmieniony
     
    Pytanie w podobnym temacie, ale tym razem chcę zmienić kolor tła w GR.0 (710).

    W procedurze obsługi DLI zmieniam COLOR2 stosownie do zawartości VCOUNT, ale efekt jest taki, że:
    1. Pierwsza ramka zawsze w całości rysowana jest domyślnym, BASICowym błękitem
    2. Druga ramka (i następne) wypełniana jest w całości kolorem, który został jako ostatni załadowany do COLOR2 w przerwaniu.

    Czy to czasem nie jest efekt uboczny tajemniczych "shadow registers"? :) Wygląda, jakby Atarka na początku rysowania ramki pobierała kolory, a potem już miała w dupce to co jest w rejestrach koloru :)

    Jak to przyatakować?

    -------------------
    Edit:
    OK, już znalazłem to:
    ->link<-

    Wraz z przykładem:
    5 REM FIND DISPLAY LIST
    10 DLIST=PEEK(560)+256*PEEK(561)
    15 REM INSERT INTERRUPT INSTRUCTION
    20 POKE DLIST+15,130
    25 REM READ IN DLI SERVICE ROUTINE
    30 FOR I=O TO 19
    40 READ A:POKE 1536+I,A:NEXT I
    50 REM POKE IN INTERRUPT VECTOR
    60 POKE 512,0:POKE 513,6
    70 REM ENABLE DLI
    80 POKE 54286,192
    90 DATA 72,138,72,169,38,162,90
    100 DATA 141,10,212,141,26,208
    110 DATA 141,24,208,104,170,104,64


    Więc chyba rozgryzę temat :)

    -------------------
    Edit 2:
    Już.
    Wystarczyło zamienić STA COLOR2 na STA COLPF2 :)

    Ale za*.*ste są te DLI... Jak ładnie wyglądałby Gruczoł, gdybym umiał się nimi posługiwać parę miesięcy temu :)
    • 20: CommentAuthorAdam
    • CommentTime26 Feb 2013
     
    @mgr_inz_rafal "Jak ładnie wyglądałby Gruczoł, gdybym umiał się nimi posługiwać parę miesięcy temu"

    Zawsze możesz jeszcze zrobić nową wersję gry "Gruczoł+ (Full Color)" :)
    • 21: CommentAuthorwieczor
    • CommentTime26 Feb 2013 zmieniony
     
    I Gruczoł++ na VBXE (Even more full color)" :)

    A potem Gruczoł Collector's Edition zawierający wszystkie 3 wersje plus długopis, czapeczkę, koszulkę i naturalnej wielkości gruczoły w słoiczkach z formaliną do postawienia na półce :D Staaary, biznes na lata :)
    • 22: CommentAuthormono
    • CommentTime26 Feb 2013
     
    Świetny pomysł! Piszę się na wersję kolekcjonerską.
  5.  
    Kurde, za dużo jest bieżących pomysłów, żeby w kółko odgrzewać gruczoła :)
    • 24:
       
      CommentAuthorjhusak
    • CommentTime26 Feb 2013
     
    _kolekcjonerską_ ?

    Poza tym gorący gruczoł wydaje się bardziej interesujący, intrygujący...

    "Rozgrzany Gruczoł Grubasa" albo "Napalony Gruczoł Grubasa"
    • 25:
       
      CommentAuthortdc
    • CommentTime27 Feb 2013
     

    mgr_inz_rafal:

    Ale za*.*ste są te DLI...

    DLI to genialna sprawa, całe życie nie mogłem tego zrozumieć dlaczego we wszystkich pozostałych komputerach (z wyjątkiem jednego) nie ma czegoś takiego jak DLI...

    wieczór:

    I Gruczoł++ na VBXE (Even more full color)" :)

    No i jeszcze Gruczoł++-- :P
  6.  
    @tdc
    A w którym to komputerze jeszcze jest DLI?
    • 27: CommentAuthorseban
    • CommentTime4 Mar 2013
     
    C64 też ma coś podobnego. VIC potrafi zgłosić przerwanie gdy dotrze do linii w której ustawiliśmy przerwanie. Potem gdy nastąpi i je obsłużymy to możemy przestawić rejestr zawierający nr. linii na inną linię i ponownie wywołać przerwanie w innym miejscu ekranu. Różnica jest taka iż w Atari ustalasz te miejsca w których ma wystąpić przerwanie w programie display list, w przypadku C64 trzeba wpisać numer linii do rejestrów VIC-a.
    • 28: CommentAuthorEagle
    • CommentTime4 Mar 2013 zmieniony
     
    Amiga ma Copper List przy pomocy której możemy bezpośrednio zmieniać rejestry.
    Używa się trzech instrukcji Wait, Move i Skip
    • 29: CommentAuthorDarkhog
    • CommentTime20 Apr 2013
     
    Nie znam się, ale czy nie można po prostu obliczać linii w której ma się zmieniać kolor ze wzory SpriteY+liczba "górnych" linii? Tak byłoby najprościej IMHO.
    • 30:
       
      CommentAuthortdc
    • CommentTime22 Apr 2013
     
    Tak jest najprościej i tak jest robione np. tutaj:
    ->link<-
    ...oraz w pozostałych przykładach jakie są tam zawarte w pliku ATR.

    Problem polega na tym że jest to rozwiązanie nieeleganckie nawet pomimo tego że w całym programie nie ma nic coby w jakikolwiek sposób wyliczało numer linii.

    DLI wyręcza nas z zjakiegokolwiek obliczania itp. jest to wspaniałe rozwiązanie sprzetowe - w końcu komputer multimedialny powinien mieć wsparcie sprzętowe do grafiki i dźwięku. Jednak inne komputery nie mają DLI, więc jest to duża zaleta Atari, w mojej ocenie absolutnie niesamowita.