Orario: 20-06-2013, 5:45 Benvenuto ospite! (Log inRegistrati)


Rispondi 
[SFML] Tiles non combacianti [Risolto]
Autore Messaggio
IngMetallo
Junior Member

Messaggi: 32
Registrato: Jul 2012
Offline Offline
#1 [SFML] Tiles non combacianti [Risolto]
0
Salve ragazzi, eccomi con un altro problema con SFML.. forse la programmazione dei videogiochi non fa per me Asd però sono testardo e vado avanti

Il problema è che non riesco a piazzare bene le tiles che devono formare la mappa di gioco. Non corrispondono perfettamente tra loro e tra un tile e l'altro vedo il colore della schermata di background (in questo caso il nero).

Le tile sono semplici 16x16.
Per vedere il codice guardate l'immagine, ho aperto codeblocks e si legge tutta la funzione (o meglio metodo) draw.
"tileSet" è una variabile di tipo Sprite su cui ho caricato il mio tile set. Il tile che uso è il prima in alto a sinistra (quindi coordinate 0,0,16,16).

Le ho provate di tutte e ho cercato molto su internet ma non ho trovato nulla che mi aiutasse.. per disperazione oggi pomeriggio ho scaricato SDL e ho provato a fare la stessa cosa con queste librerie... e funziona Fermofumo

Il problema si vede molto facilmente da questi screen :

SFML: http://i.imgur.com/lP8L1.png
SDL : http://i.imgur.com/qXL5j.png Con SDL niente bande nere, tutto perfetto.

EDIT 13/07/2012:
Problema risolto. Posto il progetto in prima pagina per chi dovesse finire in questa discussione in futuro. Può sempre essere utile :
http://www.mediafire.com/?045lsx10mxxqy3a

Il codice è un po' sporco e non va assolutamente preso come riferimento dato che sto studiando queste librerie da poco. Come ha detto TheCrib: non è il miglior modo per far funzionare un engine, però è una sorta di hack che praticamente funziona.

Davide Cristini
(Questo messaggio è stato modificato l'ultima volta il: 23-07-2012 15:02 da IngMetallo.)
11-07-2012 18:28
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Tx77
Code Monkey

Messaggi: 568
Registrato: Dec 2010
Offline Offline
#2 RE: [SFML] Tiles non combacianti
0
Non ho tempo di provare il progetto, ma direi a occhio che ti sei scontrato con uno dei problemi del disegnare 2D con una API 3D. Disegnare sprite perfettamente 1:1 infatti non e' semplicissimo.

Ci sono regole per il disegno dei triangoli e potrebbe essere necessario spostare tutto di un mezzo pixel qua e la. Prova a passare da int a float quando disegni e spostati di 0.5f sia sulle X che sulle Y (verifica tramite uno screenshot che poi combaci perfettamente con l'output SDL). Prova anche -0.5f (sono vago perche' 1. l'ultima volta lavoravo con DirectX, 2. non me lo ricordo proprio Smile)

Potresti anche sistemare modificando la matrice ortografica ma è più complesso, meglio fare questa piccola verifica per capire se il problema è quello che dico.

Tiziano Lena
Blog - Linkedin - Google+
(Questo messaggio è stato modificato l'ultima volta il: 11-07-2012 20:49 da Tx77.)
11-07-2012 20:49
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Naufr4g0
RetroIndie developer

Messaggi: 2,820
Registrato: Oct 2009
Offline Offline
#3 RE: [SFML] Tiles non combacianti
0
E' un problema che capitava anche a me. Sono problemi di conversione tra float e interi in genere o di risoluzioni tra gioco e finestra con rapporti di proporzionalità non interi. Controllo il codice.
Ma un link che non devo registrarmi a un sito per scaricarlo?

Davide Fichera [Immagine: 17IYOVH] [Immagine: 11m15zR]
[Immagine: 12Gq56E]
[Immagine: 14lr1j4.png] [Immagine: mn22jp.png] [Immagine: 1qlwy0.jpg] [Immagine: 1gouav.png]
(Questo messaggio è stato modificato l'ultima volta il: 11-07-2012 21:22 da Naufr4g0.)
11-07-2012 21:21
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
TheCrib
Indie Pellerossa

Messaggi: 5,295
Registrato: Sep 2010
Offline Offline
#4 RE: [SFML] Tiles non combacianti
0
(11-07-2012 20:49)Tx77 ha scritto:  Non ho tempo di provare il progetto, ma direi a occhio che ti sei scontrato con uno dei problemi del disegnare 2D con una API 3D. Disegnare sprite perfettamente 1:1 infatti non e' semplicissimo.

Concordo.. ma per risolvere aggiustando il subpixel, prima di tutto bisogna assicurarsi che l'API non stia applicando nessuna scala di suo (o fornita) e quindi di lavorare effettivamente 1:1 ..e poi comunque queste gap sono sintomatiche di un problema piu' di fondo.. perche' se la rasterizzazzione avvenisse come dovrebbe, dovrebbe essere tutto compatto, anche disegnando non allineati al pixel.

Quindi bho.. c'e' un problema di fondo. Da qualche parte c'e' un arrotondamento sulle coordinate right/bottom dei rettangoli.. spero non qualcosa intrinseco dell'API.. senno' sono dolori 8)

(P.S. Visto che si parla di rasterizzazione.. per dovere di cronaca, queste cose le ho studiate su 3D Computer Graphics ..la mia edizione e' leggermente piu' vecchia (93 !) e ancora ce l'ho.. wooo !!)

Davide Pasca
http://v5.kazzuya.com - @109mae
http://oyatsukai.com - @oyatsukai
"O frechete !" - M.Magnotta
11-07-2012 21:30
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Tx77
Code Monkey

Messaggi: 568
Registrato: Dec 2010
Offline Offline
#5 RE: [SFML] Tiles non combacianti
0
Si è vero, l'API anche è importante!
Mi ricordo che dovevo fare questi tarocchi sul 2D e li avevo messi nella matrice ortografica per DirectX versione 9 e inferiori, mentre avevo letto che, ad esempio, con DX11 ci dovrebbero essere regole di rasterizzazione diverse e poi ci sono quelle solite piccole differenze fra OpenGL e DirectX che qualche volta fanno... Sbav

Un test utile da fare sarebbe disegnare un solo quad 16x16 in posizione nota, fare uno shot e contare i pixel.

Io ho studiato sul Foley! Smile
Un periodo me lo trascinavo ovunque... sembravo Linus e la sua coperta.

Tiziano Lena
Blog - Linkedin - Google+
11-07-2012 21:48
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
IngMetallo
Junior Member

Messaggi: 32
Registrato: Jul 2012
Offline Offline
#6 RE: [SFML] Tiles non combacianti
0
(11-07-2012 21:21)Naufr4g0 ha scritto:  E' un problema che capitava anche a me. Sono problemi di conversione tra float e interi in genere o di risoluzioni tra gioco e finestra con rapporti di proporzionalità non interi. Controllo il codice.
Ma un link che non devo registrarmi a un sito per scaricarlo?

EDIT: ho caricato il progetto su Mediafire, ora dovrebbe essere scaricabile senza registrazione; altrimenti posso mandare il progetto per email !

Vedere che anche qualcun altro ha avuto questi problemi mi conforta in un certo senso Fermofumo almeno non sono rincretinito io..
Comunque tu come avevi risolto ?

@Tx77 : sì avevo letto di un problema simile proprio sul forum di SFML dove Laurent (l'autore delle sfml) chiamava questo metodo di spostare il pixel "half-pixel trick". Più nello specifico diceva che la quantità da togliere è
Codice:
0.5 / size


Ho già provato ad aggiungere o sottrarre questo valore quando disegno a schermo ma non ho risolto.. cioè le bande nere non si vedevano più ma rimaneva la trama a quadrato sull'immagine..

@TheCrib: per l'arrotondamento : il rettangolo che prendo dal tileSet ha coordinate int mentre quello per la viewport ha coordinate float, quindi potrebbe essere anche qui il problema.. però non posso fare altrimenti perché la funzione per settare la viewport prende solo rettangoli con punti float.

oddio non ditemi che devo studiare 1000 pagine per risolvere questo semplice problema ? Asd

Davide Cristini
(Questo messaggio è stato modificato l'ultima volta il: 11-07-2012 22:49 da IngMetallo.)
11-07-2012 21:53
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Naufr4g0
RetroIndie developer

Messaggi: 2,820
Registrato: Oct 2009
Offline Offline
#7 RE: [SFML] Tiles non combacianti
0
Ho visto il codice e c'è tutto un procedimento di rendering che non mi piace proprio!
Tu avresti due alternative:
  • Creare una matrice di sprite, dove ogni elemento rappresenta il singolo tile, e renderizzarli tutti ad ogni frame;
  • Renderizzare tutti i tile su un'immagine e poi renderizzarla ad ogni frame.
Tu invece hai creato uno sprite che si renderizza 'row x col' volte ad ogni frame ritagliandosi continuamente nel rettangolo giusto. Funziona pure così ma è un procedimento non standard per questa libreria e credo che tutto il problema dipenda da questo.
Prova a fare in uno dei due modi che ti ho detto sopra.

Davide Fichera [Immagine: 17IYOVH] [Immagine: 11m15zR]
[Immagine: 12Gq56E]
[Immagine: 14lr1j4.png] [Immagine: mn22jp.png] [Immagine: 1qlwy0.jpg] [Immagine: 1gouav.png]
(Questo messaggio è stato modificato l'ultima volta il: 11-07-2012 22:50 da Naufr4g0.)
11-07-2012 22:49
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
IngMetallo
Junior Member

Messaggi: 32
Registrato: Jul 2012
Offline Offline
#8 RE: [SFML] Tiles non combacianti
0
(11-07-2012 22:49)Naufr4g0 ha scritto:  Ho visto il codice e c'è tutto un procedimento di rendering che non mi piace proprio!
Tu avresti due alternative:
  • Creare una matrice di sprite, dove ogni elemento rappresenta il singolo tile, e renderizzarli tutti ad ogni frame;
  • Renderizzare tutti i tile su un'immagine e poi renderizzarla ad ogni frame.
Tu invece hai creato uno sprite che si renderizza 'row x col' volte ad ogni frame ritagliandosi continuamente nel rettangolo giusto. Funziona pure così ma è un procedimento non standard per questa libreria e credo che tutto il problema dipenda da questo.
Prova a fare in uno dei due modi che ti ho detto sopra.

Ok provo !
Per il secondo metodo intendi renderizzare i tile su una variabile di tipo Image oppure su uno Sprite di buffer ? Intendi una sorta di double buffering quindi ? Hmm

Davide Cristini
11-07-2012 23:01
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Naufr4g0
RetroIndie developer

Messaggi: 2,820
Registrato: Oct 2009
Offline Offline
#9 RE: [SFML] Tiles non combacianti
0
(11-07-2012 23:01)IngMetallo ha scritto:  Ok provo !
Per il secondo metodo intendi renderizzare i tile su una variabile di tipo Image oppure su uno Sprite di buffer ? Intendi una sorta di double buffering quindi ? Hmm

Dovresti renderizzare tutti i tile in una sf::Image tramite il metodo Copy.
E poi creare un sf::Sprite che utillizzi questa image che contiene tutto il livello.
Il double buffering non c'entra molto con questa cosa. Il DB è una operazione che avviene automaticamente ogni volta che usi il metodo Display(). Smile
Serve a levare il cosiddetto flickering. Puoi trovare un sacco di documentazione che riguarda il DB con Google.

Davide Fichera [Immagine: 17IYOVH] [Immagine: 11m15zR]
[Immagine: 12Gq56E]
[Immagine: 14lr1j4.png] [Immagine: mn22jp.png] [Immagine: 1qlwy0.jpg] [Immagine: 1gouav.png]
(Questo messaggio è stato modificato l'ultima volta il: 11-07-2012 23:42 da Naufr4g0.)
11-07-2012 23:42
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
IngMetallo
Junior Member

Messaggi: 32
Registrato: Jul 2012
Offline Offline
#10 RE: [SFML] Tiles non combacianti
0
(11-07-2012 23:42)Naufr4g0 ha scritto:  Dovresti renderizzare tutti i tile in una sf::Image tramite il metodo Copy.
E poi creare un sf::Sprite che utillizzi questa image che contiene tutto il livello.
Il double buffering non c'entra molto con questa cosa. Il DB è una operazione che avviene automaticamente ogni volta che usi il metodo Display(). Smile
Serve a levare il cosiddetto flickering. Puoi trovare un sacco di documentazione che riguarda il DB con Google.

Oddio nel codice che ho messo online avevo fatto un bel casino.. avevo inserito anche un Draw() di troppo.. Comunque non era mia intenzione ritagliare lo sprite sheet ad ogni ciclo ! Volevo prendere il tile che mi serviva prima di entrare nel doppio ciclo for e poi utilizzare sempre lo stesso sprite per disegnare il "livello" di erba ! Devo aver sbagliato facendo i taglia e incolla durante vari tentativi che avevo fatto per farlo funzionare Fermofumo scusatemi.

Ho usato il secondo metodo che mi hai consigliato e adesso si vede correttamente !
Però nella documentazione di Image::Copy() c'è scritto :

" This function does a slow pixel copy and should only be used at initialization time"

Mentre io l'ho usata proprio nel doppio ciclo for che scandisce la matrice, e il doppio ciclo for viene ripetuto ad ogni frame del gioco. Al momento faccio 380fps però ho un processore recente.. chissà se con tutti gli altri processi diventi troppo pesante Fermofumo

Non vorrei aver interpretato male il tuo messaggio.. Intendevi fare una cosa del genere ?

Codice:
void Map::draw (RenderWindow &app)
{
    /* Rect for the grass tile */
    Image imageToRender ;
    imageToRender.Create(800,800) ;
    Rect <int> rect (0,0,16,16) ;

    for (int i=0;i<20;i++)
    {
        for (int j=0;j<20;j++)
        {
            if(mapMatrix[i][j]== GRASS)
            {
                imageToRender.Copy(buff,j*16,i*16,rect) ;
            }
        }
    }

    Sprite tmp ;
    tmp.SetImage(imageToRender) ;
    app.Draw (tmp) ;
}

Davide Cristini
12-07-2012 1:12
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Naufr4g0
RetroIndie developer

Messaggi: 2,820
Registrato: Oct 2009
Offline Offline
#11 RE: [SFML] Tiles non combacianti
0
(12-07-2012 1:12)IngMetallo ha scritto:  Oddio nel codice che ho messo online avevo fatto un bel casino.. avevo inserito anche un Draw() di troppo.. Comunque non era mia intenzione ritagliare lo sprite sheet ad ogni ciclo ! Volevo prendere il tile che mi serviva prima di entrare nel doppio ciclo for e poi utilizzare sempre lo stesso sprite per disegnare il "livello" di erba ! Devo aver sbagliato facendo i taglia e incolla durante vari tentativi che avevo fatto per farlo funzionare Fermofumo scusatemi.

Ho usato il secondo metodo che mi hai consigliato e adesso si vede correttamente !
Però nella documentazione di Image::Copy() c'è scritto :

" This function does a slow pixel copy and should only be used at initialization time"

Mentre io l'ho usata proprio nel doppio ciclo for che scandisce la matrice, e il doppio ciclo for viene ripetuto ad ogni frame del gioco. Al momento faccio 380fps però ho un processore recente.. chissà se con tutti gli altri processi diventi troppo pesante Fermofumo

Non vorrei aver interpretato male il tuo messaggio.. Intendevi fare una cosa del genere ?

Codice:
void Map::draw (RenderWindow &app)
{
    /* Rect for the grass tile */
    Image imageToRender ;
    imageToRender.Create(800,800) ;
    Rect <int> rect (0,0,16,16) ;

    for (int i=0;i<20;i++)
    {
        for (int j=0;j<20;j++)
        {
            if(mapMatrix[i][j]== GRASS)
            {
                imageToRender.Copy(buff,j*16,i*16,rect) ;
            }
        }
    }

    Sprite tmp ;
    tmp.SetImage(imageToRender) ;
    app.Draw (tmp) ;
}

E' corretto il codice che hai scritto, ma io intendevo che tu facessi quel doppio ciclo for solo una volta all'interno del costruttore e generando da lì lo sprite con tutto il livello, che deve essere un membro della classe Map.
Sul metodo draw deve starci solo:
Codice:
app.Draw( spriteCheRappresentaIlLivello );

Quindi il problema di performance del metodo Copy della classe Image non si pone! Smile

Davide Fichera [Immagine: 17IYOVH] [Immagine: 11m15zR]
[Immagine: 12Gq56E]
[Immagine: 14lr1j4.png] [Immagine: mn22jp.png] [Immagine: 1qlwy0.jpg] [Immagine: 1gouav.png]
(Questo messaggio è stato modificato l'ultima volta il: 12-07-2012 1:28 da Naufr4g0.)
12-07-2012 1:28
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
IngMetallo
Junior Member

Messaggi: 32
Registrato: Jul 2012
Offline Offline
#12 RE: [SFML] Tiles non combacianti
0
Naufr4g0, hai ragione. Forse è meglio se vado a dormire per oggi Perplesso ho già fatto troppe caz....

Grazie per i suggerimenti ! buonanotte !

Davide Cristini
12-07-2012 1:38
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
TheCrib
Indie Pellerossa

Messaggi: 5,295
Registrato: Sep 2010
Offline Offline
#13 RE: [SFML] Tiles non combacianti
0
(11-07-2012 21:48)Tx77 ha scritto:  Io ho studiato sul Foley! Smile
Un periodo me lo trascinavo ovunque... sembravo Linus e la sua coperta.

yeah !!
Ogni tanto vanno ricordati questi libri !

Davide Pasca
http://v5.kazzuya.com - @109mae
http://oyatsukai.com - @oyatsukai
"O frechete !" - M.Magnotta
12-07-2012 8:12
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Naufr4g0
RetroIndie developer

Messaggi: 2,820
Registrato: Oct 2009
Offline Offline
#14 RE: [SFML] Tiles non combacianti
0
(12-07-2012 1:38)IngMetallo ha scritto:  Naufr4g0, hai ragione. Forse è meglio se vado a dormire per oggi Perplesso ho già fatto troppe caz....

Grazie per i suggerimenti ! buonanotte !

Di niente! Sei riuscito a risolvere il problema dopo un sano riposo notturno? Smile

Davide Fichera [Immagine: 17IYOVH] [Immagine: 11m15zR]
[Immagine: 12Gq56E]
[Immagine: 14lr1j4.png] [Immagine: mn22jp.png] [Immagine: 1qlwy0.jpg] [Immagine: 1gouav.png]
12-07-2012 15:46
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Tx77
Code Monkey

Messaggi: 568
Registrato: Dec 2010
Offline Offline
#15 RE: [SFML] Tiles non combacianti
0
Ho guardato il tuo codice e lo ho compilato.
Hai uno zoom nella camera di 1.6, chiaramente tutti i discorsi dell'half pixel hanno senso se lo zoom e' a 100%, anche l'half pixel dovrebbe scalare di conseguenza.
Poi non devi fare 0.5f / size ma semplicemente +0.5f visto che l'half pixel è in spazio schermo.

Quindi con:
view.Zoom(1.0f) ;

e con:
Codice:
for (int i=0;i<20;i++)
    {
        for (int j=0;j<20;j++)
        {
            float fX = (float)j * 16.0f;
            float fY = (float)i * 16.0f;
            tileSet.SetPosition(fX+0.5f, fY-0.5f);
            //tileSet.SetPosition(j*16,i*16);
            if(mapMatrix[i][j]== GRASS)
            {
                tileSet.SetSubRect(rect) ;
                app.Draw (tileSet) ;
            }
        }
    }
va tutto.

E chiaramente si "sfonda" se scrolli la camera (e in quel caso devi fare lo snap della camera posizione agli interi o bilanciare in altro modo lo scrolling).

p.s.
i segni + o - a 0.5 li ho messi a occhio senza controllare con uno screenshot, verifica! Sorriso

Tiziano Lena
Blog - Linkedin - Google+
(Questo messaggio è stato modificato l'ultima volta il: 12-07-2012 18:45 da Tx77.)
12-07-2012 18:37
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: