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 11:02
       
      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 11:02
       
      takie zmiany w pionie są robione w Calisto
      • 5: CommentAuthorbrx
      • CommentTime25 Feb 2013 11:02
       
      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 12:02 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 13:02
       
      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 13:02 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 16:02
       
      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 17:02
       
      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?
    4.  
      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 18:02
       
      Poprawna. Jeśli będziesz chciał używać dodawania/odejmowania to pamiętaj o CLD/SED.
    5.  
      A ile cykli procesora mogę zjeść podczas obsługi przerwania?
      • 15: CommentAuthormono
      • CommentTime25 Feb 2013 19:02
       
      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.
    6.  
      A jak w tym Syzygy przejść dalej z ekranu "Set Up"?

      -------
      Edit: Dobra, już wiem... "ESC" :)
      • 17:
         
        CommentAuthorpirx
      • CommentTime25 Feb 2013 20:02 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 21:02
       
      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".
    7.  
      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 10:02
       
      @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 11:02 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 11:02
       
      Świetny pomysł! Piszę się na wersję kolekcjonerską.
    8.  
      Kurde, za dużo jest bieżących pomysłów, żeby w kółko odgrzewać gruczoła :)
      • 24:
         
        CommentAuthorjhusak
      • CommentTime26 Feb 2013 15:02
       
      _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 02:02
       

      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
    9.  
      @tdc
      A w którym to komputerze jeszcze jest DLI?
      • 27: CommentAuthorseban
      • CommentTime4 Mar 2013 19:03
       
      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 20:03 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 05:04
       
      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 22:04
       
      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.