Autore Topic: Scrolling, Quali Possibilità?  (Letto 1666 volte)

med

  • Utente
  • **
  • Post: 103
    • med64.tk
  • Gioco Preferito: Turrican 2
Scrolling, Quali Possibilità?
« il: 04 Gennaio 2005, 00:34:57 »
 Durante le vacanze di Natale, ho passato il "tempo libero" a scrivere delle routines di scrolling che mi potessero servire per "spostarmi" all'interno di una ipotetica mappa di gioco.
Alla fine sono arrivato alla conclusione che sia utile impiegare 2 mappe video (che siano interscambiabili al fine di evitare spiacevoli sfarfallii, specie in sistemi non PAL) e che ci siano 2 tipi possibili di routines di scroll, ognuna purtroppo con pregi e difetti.
Ecco allora che ho pensato di descrivervi le 2 alternative perchè vorrei sapere da VOI cosa ne pensiate, se avete idee su come superarne "i difetti e limiti" o altrimenti se esistano altre possibili modalità di scrolling della mappa video.

1) ROUTINE CENTRATA SUL CARATTERE:
===========================
Ok, ammetto che il titolo non rende bene l'idea, ma non sapevo come altro chiamare questa routine.
In pratica questo tipo di routine dovrebbe essere simile a quella impiegata da Manfred Trenz nei vari Turrican I e II (vedi il mio avatar  :D ).
Immaginiamo di realizzare uno scrolling da sinistra verso destra. Ovviamente dovremo impiegare il registro 53270. In pratica questo registro nei suoi 3 bits meno significativi può variare tra 0 e 7. In condizioni di "riposo", cioè nessuno scroll richiesto, questi 3 bits ci restituiscono un valore pari a 3 (ci troviamo, in un certo senso, nel punto di mezzo di un carattere).
Allorquando venga richiesto uno scroll, le fasi che si susseguono sono grosso modo queste:
- 1° ciclo raster: viene incrementato il registro 53270 (da 3 passa a 4)
- 2° ciclo raster: viene incrementato il registro 53270 (da 4 passa a 5) e viene copiata la 1° mappa video, opportunamente traslata di una colonna di caratteri, in una 2° mappa video.
- 3° ciclo raster: viene incrementato il registro 53270 (da 5 passa a 6)
- 4° ciclo raster: viene incrementato il registro 53270 (da 6 passa a 7)
- 5° ciclo raster: viene realizzato lo scroll della mappa colore, scambiate le 2 mappe video modificando $D018, e il registro 53270 viene resettato (cioè da 7 passa a 0 nei sui tre bits meno significativi)
- 6° ciclo raster: viene incrementato il registro 53270 (da 0 passa a 1)
- 7° ciclo raster: viene incrementato il registro 53270 (da 1 passa a 2)
- 8° ciclo raster: viene incrementato il registro 53270 (da 2 passa a 3)

Ovviamente lo stesso procedimento andrà applicato, in maniera inversa, per uno scroll da destra verso sinistra; inoltre con le opportune modifiche (cioè impiegando il regsitro 53265) potremo realizzare delle routine di scrolling verticale.

VANTAGGI
- Lo scroll è straordinariamente fluido, senza nessun tipo di sfarfallio!
- (è la mia preferita; ops, non è un vantaggio)

SVANTAGGI
- Sono possibili solo 4 DIREZIONI. In pratica le 4 direzioni diagonali verrebbero "realizzate" a zig zag (esempio: dignonale in basso a destra --> scroll in basso, poi scroll a destra, scroll in  basso, poi scroll a destra e così via) a meno di non creare altre ulteriori 4 routines appositamente per le diagonali (il che significa sprecare tanta bella memoria che potrebbe essere usata da un gioco per altro: esempio blocchi, caratteri, mappa).

- Durante gli 8 cicli raster che ho descritto NON si potrebbero poi eseguire altri scroll (una volta che uno scroll comincia deve finire prima che possa avvenirne un altro, il che significa dover attendere 8 cicli raster: tanto tempo sprecato?)


2) ROUTINE "FREE-DIRECTIONAL"
======================
Anche in questo caso mi scuso per il terribile nome di questa routine.
In pratica volendo ricollegarci all'esempio fatto sopra di uno scroll da sinistra verso destra, in questo tipo di routine (impiegata da MW?) non ci interessa affatto il valore contenuto nei 3 bits meno significativi di 53270. Semplicemente:
- 1° ciclo raster: non appena il valore in essi contenuto diviene pari a 6 copiamo la 1° mappa video nella 2° traslata di una colonna
- 2° ciclo raster: incrementiamo 53270 a 7
- 3° ciclo raster: eseguiamo lo scambio delle mappe video, scrolliamo la memoria colore, azzeriamo i 3 bits di 53270.

VANTAGGI
- Possiamo spostarci liberamente in tutte e 8 le direzioni usando solo 4 routines di scroll (notevole risparmio di memoria)
- Minore impiego di cicli raster

SVANTAGGI
- in soli 3 cicli raster e per di più uno di seguito all'altro dobbiamo far fare alla CPU un casino di cose, cui dobbiamo aggiungere nel caso di un gioco, altri fattori (sprite multiplexing, controllo joystick, enemies, musica, ecc ecc) per cui "penso" sia possibile la comparsa di tremendi sfarfallii da "sovraccarico".
- teoricamente (in realtà tutto quello che scrivo deriva da mie supposizioni) in un eventuale gioco si noterebbe un rallentamento ogni volta che si verifica uno scroll del video (quindi paradossalmente avremo un gioco fluido che rallenta quando c'è uno scroll, che ridiviene fluido finito lo scroll, che rirallenta... e così via)

Io ho pensato 1 soluzione per ciascun tipo di routine che ne riduce notevolmente i difetti di entrambi, ma sono curioso di sapere da qualcuno di voi:
- le vostre idee in materia di "scroll".
- alternative a queste 2 ipotetiche routine che vi ho scritto
- insomma, consigli.

Io ho costruito le 2 routine di cui vi parlo. Funzionano tutte e 2 alla grande: ma ovviamente temo che vadano in  crash non appena inizierò ad inserire i sopracitati sprite multiplexing, musica, controllo collisioni, punteggi, controllo ingresso uscita nemici, paralasse ecc ecc.

Spero che qualcuno di voi risponda (anche dolo per dirmi "non ho capito bene..."). Almeno posso decidere se devo continuare su questa strada o intraprenderne una nuova.
Grazie per l'attenzione.

P.S.
Mi scuso in anticipo per eventuali errori e per eventuali "frasi incomprensibili".

P.P.S.
Molte delle cose che ho sviluppato sono frutto della lettura dei rants di Lasse Öörni.

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Scrolling, Quali Possibilità?
« Risposta #1 il: 04 Gennaio 2005, 11:29:54 »
 Ciao med

Non ho ben capito,nella prima routine,questo passaggio
Citazione
- 5° ciclo raster: viene realizzato lo scroll della mappa colore, scambiate le 2 mappe video modificando $D018, e il registro 53270 viene resettato (cioè da 7 passa a 0 nei sui tre bits meno significativi)
Però così il raster aggiornebbe l'intera schermata,mentre dovrebbe aggionare man mano solo l'ultima colonna verso sinistra,no? :huh:  (a meno che tu non abbia 40 mappe video in memoria...)



 

med

  • Utente
  • **
  • Post: 103
    • med64.tk
  • Gioco Preferito: Turrican 2
Scrolling, Quali Possibilità?
« Risposta #2 il: 04 Gennaio 2005, 20:38:43 »
 Certo che aggiorna solo una colonna (nel caso di scroll orizzontale, altrimenti in caso di scroll verticale bisognerebbe aggiornare una riga), cosa che può essere fatta anche nel ciclo raster 3 o nello stesso 5 (effettivamente ho dimenticato di scriverlo, lo davo per scontato). ma l'aggiornamento avviene nella mappa video che in quel momento non è visualizzata, almeno finchè non si fa il citato switch in $d018.
Le mappe che servono sono solo 2. Perchè pensavi 40?

Cmq, mi scuso in anticipo per altre "frasi incomprensibili", ma ho scritto tutto di getto ieri sera.

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Scrolling, Quali Possibilità?
« Risposta #3 il: 05 Gennaio 2005, 17:58:26 »
 Ciao med
Citazione
l'aggiornamento avviene nella mappa video che in quel momento non è visualizzata
Oh,adesso credo di aver capito:aggiorni una colonna della mappa video che in quel momento non è visualizzata,e fai uno switch in $d018 quando è il momento di mostrarla,così aggiorni il quadro video di una sola colonna (mi era sfuggito questo particolare,e l'articolo di Lasse sul doublebuffering l'ho letto solo ieri sera  :) ).
Citazione
Perchè pensavi 40?
Appunto per questo motivo:credevo che tu parlassi di aggiornare la schermata che in quel momento era visualizzata,switchando così 40 mappe diverse,che differivano di una sola colonna,ma sarebbe stata una soluzione impraticabile...
Citazione
Cmq, mi scuso in anticipo per altre "frasi incomprensibili",
Nessun problema,è un bene che si discuta,così almeno ci si scambiano impressioni:
anzi,posta pure i tuoi sorgenti,credo che faresti cosa gradita ai programmatori del sito.
 

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Scrolling, Quali Possibilità?
« Risposta #4 il: 05 Gennaio 2005, 18:28:59 »
 
Citazione
in un eventuale gioco si noterebbe un rallentamento ogni volta che si verifica uno scroll del video (quindi paradossalmente avremo un gioco fluido che rallenta quando c'è uno scroll, che ridiviene fluido finito lo scroll, che rirallenta... e così via)
Guarda,non ho mai provato a fare scrolling per videogiochi su C64,per cui (anche qui) c'e' gente più molto più esperta di me in materia;tieni presente che devi scrollare anche i 1000 codici colore e muovere (non so quanti:4,8,10,20?) sprites sullo schermo contemporaneamente.

Citazione
8 cicli raster: tanto tempo sprecato?

Sono 20 ms a ciclo,cioè 20*8 = circa 16 centesimi di secondo per lo scroll di una colonna:cmq,l'unica possibilità per sapere veramente la resa di uno scrolling è provarlo.

Tra l'altro,leggendo l'articolo di Lasse mi sono scaricato il suo esempio di scrolling;è uno scrolling molto preciso (non ho guardato i sorgenti,mi sembra che sia 2 pixel per scroll in modalità 38 colonne),ma c'e' da tener presente che non ci sono oggetti mobili sullo schermo.
Anche qui,quindi,è una questione di quanti sprite in movimento (casuale, ripetuto?) si vogliono avere, e di cosa si vuole privilegiare (fluidità,velocità, precisione?).
Cmq,ribadisco la mia disponibilità ad aiutarti qualora avessi bisogno (anche in PM) o (meglio) anche qui sul forum (il codice sorgente è gradito,grassie :D ).
Bye