Newsgroup: it.comp.lang.pascal
Titolo: Qual'è il IV modo per spostare immagini?

Per spostare un omino in pagina grafica e dare l'effetto del movimento
conosco tre metodi:
1) Sfrutto le procedure GetImage e PutImage e i puntatori.
2) Carico delle immagini Bmp sullo schermo cambiando via via le
coordinate su cui le carico.
3) Creo una procedura che disegna l'omino, una che lo cancella e poi le
alterno facendolo spostare.
Però il primo metodo ha come difetto uno sgradevolissimo
"lampeggiamento" dell'immagine ed è anche piuttosto lento; il secondo
metodo è lentissimo anche per spostare una sola immagine (un solo
omino); il terzo metodo fin ora si è sempre rivelato il più efficente,
perché non ha un forte "lampeggiamento" ed è anche abbastanza veloce.
Se però devo spostare un omino su uno sfondo che non è tutto nero, ma
che presenta anche altri disegni, allora alternare le procedure che
disegnano e che cancellano diventa molto scomodo, perché si danneggia lo
sfondo. Se in fine le immagini da spostare sono tante (come per es.
degli omini in un gioco) e complesse (cioè formate da molti line,
circle, putpixel o, peggio ancora, colorate con dei floodfill) allora
anche il terzo metodo si rivela scomodo, lento e inefficace.
La mia domanda quindi è: "Esiste un altro metodo per muovere delle
immagini, dei pupazzetti o disegnini sullo schermo, in modo veloce e
senza cancellare/danneggiare lo sfondo e gli altri disegni già
presenti?"
Se esiste questo metodo vorrei sapere come si fa.
Grazie da FABIO!
***---***
Fabio Feuli
E-Mail 
fe...@libero.it
"Considerate la vostra semenza:
fatti non foste a viver come bruti,
ma per seguir virtute e canoscenza"
(Dante: Inferno XXVI, 118-120)

Allora tanto per iniziare ti consiglio , se desideri muovere degli sprite
sullo schermo di caricarli una volta per tutte in memoria e poi di
trasferirli ad ogni frame o quadro generato nella memoria video. Questo si
può fare o utilizzando funzioni fatte da altri , quelle che citi tu , oppure
facendosene di proprie e di ottimizzate utilizzando codice assembler per
esempio ( anche se non proprio necessario è più veloce ).
Per dar luogo all'animazione dovresti utilizzare un metodo un po' sprecono
in termini di memoria ma comunque veloce :
Si tratta di utilizzare più pagine di memoria come se fossero schermate
distinte. In una ci metti lo sfondo che supponiamo per es. che rimanga
fisso. Poi copi questo sfondo in un'altra pagina di memoria e con la tua
funzione di visualizzazione degli sprite posizioni quello che vuoi ( per es.
l'omino ... ) , poi copi il tutto nella pagina visibile , cioè nella memoria
video e così vedi tutto. In questo modo non cancelli lo sfondo che ti
servirà per il frame sucessivo...
Nota che non è detto che ti servano 2 pagine , io ne ho usate anche di più
dipende da cosa vuoi realizzare. In ogni caso la tecnica in poche parole è
questa.
Se desideri ulteriori spiegazioni posta a : 
andr...@libero.it
 .
Ps : io le mie librerie per queste cose me le sono fatte da solo in asm !!

 
si', devi usare una libreria grafica diversa dalle BGI fornite con
TP7.
Personalmente, mi sono orientato anche su altri linguaggi (C e C++).
Se ti interessa, ho una libreria grafica 320x200x256 e sonora (in C)
abbastanza complete (ma non troppo).
Ti consiglio comunque di fare un salto su 
gpi.eden.it
, un sito
dedicato allo sviluppo di video giochi in Italia. Trovi anche una
libreria grafica molto potente (pero' anch'essa in C++).
bye!
-- 
Emanuele Cesena                 
http://www.penguinpowered.com/~ecesena
ece...@penguinpowered.com
                 Attenti all'antispam NOSPAM
Una signora mi chiede: "Soffro di reumatismi: ogni volta che mi muovo,
sento dei forti dolkri.  Cosa mi consiglia?".  Non si muova%
		-- Alessandro Paci, "Va ora in onda"

Andrea ha scritto:

Se qualcuno conosce questo metodo, potrebbe spiegarmelo più dettagliatamente,
indicando quali sono i comandi da usare e come vanno usati?
Confido nel vostro aiuto!



http://www.penguinpowered.com/~ecesena
"Ad Economia per 4 fogli usano 1 puntina; a Legge usano 4 puntine per 1
foglio; a Lettere 1 foglio per 4 messaggi piu' la scritta sul legno
della bacheca; a Chimica si dilettano con le colle epossidiche."


Supponiamo che tu abbia a disposizione due pagine "consecutive" di memoria
video di dimensioni WxH (puo' essere 320x200, 640x480...fai tu)
Ad esempio:
(0,0)     +---------------------------------------------------+(W,0)
            |                                                    |
            |                                                    |
            |                                                    |
            |                                                    |
            |               Pagina 1                        |
            |                                                    |
            |                                                    |
            |                                                    |
            |                                                    |
(0,H)    +---------------------------------------------------+(W,H)
            |                                                    |
            |                                                    |
            |                                                    |
            |                                                    |
            |               Pagina 2                        |
            |                                                    |
            |                                                    |
            |                                                    |
            |                                                    |
(0,2H)   +---------------------------------------------------+(W,2H)
La procedura e' la seguente:
    1. sposta il puntatore della pagina visibile su Pagina1 (coord. (0,0) )
    2. scrivi su Pagina2
    3. aspetta la "fine" del ritracciamento verticale
    4. sposta il puntatore della pagina visibile su Pagina2 (coord. (0,H) )
    5. scrivi su Pagina1
    6. aspetta la "fine" del ritracciamento verticale
    7. ritorna ad 1
Nota: se i punti 2 e 5 non sono sufficientemente veloci ( < tempo di
ritracciamento verticale) si "perdono" frame/sec.
In passato era preferibile eseguire le operazioni di lettura/scrittura in
memoria principale (veloce) e copiare alla fine questo blocco in memoria
video (lenta).... (double buffering)
I comandi per implementare questa tecnica con le librerie BGI del
Borland/Turbo Pascal sono:
    SetActivePage : pagina per le operazioni di lettura/scrittura
    SetVisualPage : pagina visibile
La procedura per attendere la fine del ritracciamento verticale sono 5 righe
di codice....se ti serve, fai un fischio.
Ciao!
Simone
_____________________________________________
"....c'e' vita nell'universo ?"
"Giusto un po' il sabato sera...."
            C.Guzzanti
e-mail:  
drfa...@libero.it
 
drfa...@tiscalinet.it
 
drfa...@tin.it
web:     
http://www.tiscalinet.it/drfalken
 
http://free.prohosting.com/~drfalken
ICQ#:  19598133
_____________________________________________

     SetVisualPage : pagina visibile
Una volta selezionata la pagina con SetActivePage o SetVisualPage, come faccio a
scriverci?
Posso utilizzare i soliti comandi della graph.tpu?
E se volessi utilizzare più di due pagine? Ad esepio, una visibile, una su cui
lavoro e una che tiene memorizzato lo sfondo del gioco per non doverlo
ridisegnare ogni volta, come devo fare?
E... scusa l'ignoranza ma non sono pratico di questa tecnica... cos'è il
rintracciamento verticale?
Confido nel tuo aiuto,


 rintracciamento verticale?
Il periodo di ritracciamento verticale (vertical retrace) e' l'intervallo di
tempo in cui in cannoncino del tubo catodico "disegna" l'immagine sul
monitor.
Ciao.
Simone.


 Dipende dalla memoria a disposizione sulla scheda video.
..... ma temo che non abbia abbastanza memoria video, perché non riesco ad
utilizzare più di due pagine.
Ti ringrazio molto per le tue spiegazioni che mi sono state utilissime.
Mi resta una sola domanda: come faccio (possibilmente utilizzando qualche
comando predefinito del Tp7) a copiare il contenuto di una pagina su di un'altra
per sovrapporle?
Per esempio: io vorrei memorizzare lo sfondo, che non intendo modificare, su una
pagina; poi, su un'altra pagina faccio muovere i miei pupazzetti, senza rovinare
lo sfondo, che sta sull'altra pagina; poi devo copiare lo sfondo sulla pagina
visibile e incollarci/sovrapporci la pagina con i pupazzetti così da avere un
disegno unico. Come posso fare???
Ancora grazie, FABIO!
--
