Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Ordre de dessin avec sprites et vertexarrays  (Lu 2456 fois)

0 Membres et 1 Invité sur ce sujet

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Ordre de dessin avec sprites et vertexarrays
« le: Février 24, 2015, 07:54:57 pm »
Bonjour à tous!

Allez, pour aller droit au but, dans mon système isométrique:
  • La carte est composée de layers, un par étage, un layer étant un sf::VertexArray;
  • Les objets de map sont dessinés entre chaque bon étage, et doivent être intercalés derrières les tuiles situées devant eux, etc;

J'expérimente actuellement une méthode pour dessiner mon objet entre 4 vertices (1 tuile).
En gros, j'aimerai effectuer dans l'ordre le dessin de:
  • La partie du layer qui ne cache pas l'objet
  • L'objet
  • La partie du layer qui cache l'objet

Ce à l'aide de cette fonction. (Ne vous préoccupez pas de la re-déclaration du sprite à chaque frame, des valeurs brutes, tout cela n'est pas encapsulé mais le sera: pour l'instant c'est juste un test) :
void Layer::draw(sf::RenderTarget &target, sf::RenderStates states) const
{
    sf::Texture tex;
    tex.loadFromFile("objet.png");

    sf::Sprite sprite;
    sprite.setTexture(tex);
    sprite.setPosition(410, 300); //La position appropriée pour que l'objet soit sensé être caché

    states.transform *= getTransform();
    states.texture = &m_texture;

    if(m_layer==1) // Si le layer actuel est le n°1, alors on doit se charger de dessiner l'objet entre 2 tuiles
    {
        target.draw(&m_vertices[0], 396, sf::Quads, states); // Les 99 premières tuiles
        target.draw(sprite); //L'objet
        target.draw(&m_vertices[396], 4, sf::Quads, states); //La dernière tuile, qui doit cacher l'objet
    }
    else //Autrement, on ne se préoccupe pas de l'objet, on dessine tout le layer d'un coup
    {
        target.draw(m_vertices, states);
    }
}
 
Ici, pour info, mon personnage est positionné entre la 99ème tuile et la dernière, soit dans la dernière ligne de droite du layer.

Seulement voilà le problème: le sprite de l'objet n'est pas caché derrière ce dessin:
target.draw(&m_vertices[396], 4, sf::Quads, states);
 
Et je ne comprend mais vraiment pas pourquoi:
  • Erreur de logique de ma part, auquel cas je vous laisse tranquille et je vais repenser mon système?;
  • Qu'importe l'ordre d'appels des draw(), les entrailles d'SFML dessinent les sf::Drawable "type" par "type": sprite d'un coup, etc... ?

Merci d'avance.  ;)
« Modifié: Février 24, 2015, 08:00:42 pm par AnselmeSfml »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Ordre de dessin avec sprites et vertexarrays
« Réponse #1 le: Février 24, 2015, 08:24:32 pm »
Ca devrait fonctionner. Tu es sûr que le dernier quad du vertex array est bien celui auquel tu penses ? Si tu dessines le sprite puis le dernier quad (sans les 99 premiers), l'ordre est toujours incorrect ?
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Ordre de dessin avec sprites et vertexarrays
« Réponse #2 le: Février 24, 2015, 08:32:38 pm »
Merci de ta réponse,
Oui, le quad devrait être le bon, puisque quand je test m_layer==0 mon objet est caché derrière les tuiles du layer suppérieur. Donc avec m_layer==1 les tuiles concernées doivent être logiquement les bonnes.
J'ai essayé et même résultat, le sprite apparaît au dessus des 4 derniers vertices. C'est très louche  :o
Merci de ton aide.
« Modifié: Février 24, 2015, 08:35:30 pm par AnselmeSfml »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Ordre de dessin avec sprites et vertexarrays
« Réponse #3 le: Février 24, 2015, 08:57:47 pm »
Il faudrait que tu reproduises le problème dans un code complet minimal. Genre un main qui dessine un sprite puis un bout de vertex array. Il y a fort à parier que cette fois ça va fonctionner, il ne te restera donc plus qu'à bidouiller ce code minimal jusqu'à retomber sur l'élement qui déclenche le problème.
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Ordre de dessin avec sprites et vertexarrays
« Réponse #4 le: Février 24, 2015, 09:29:45 pm »
Je ne pense pas que cela m'aiderait, car même si dans le main ça fonctionnerait, je ne verrait pas d'autres manières d'agencer la chose que la manière dont je le fait actuellement.
Je vais continuer mes recherches concernant l'origine du problème, en espérant qu'un jour ça paie. En tout cas, c'est pas un comportement attendu/inattendu d'SFML?
« Modifié: Février 24, 2015, 10:23:02 pm par AnselmeSfml »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Ordre de dessin avec sprites et vertexarrays
« Réponse #5 le: Février 24, 2015, 10:37:33 pm »
Citer
Je ne pense pas que cela m'aiderait
Réduire au minimum le contexte pour bosser sur quelques lignes de code au lieu de 10000, ça aide toujours. En ce qui me concerne c'est ma procédure standard de debugging, quelque soit le problème s'il n'est pas trivial.

Le fait est que cela fonctionne au niveau de SFML. Il y a donc un élément perturbateur dans ton code, que ce soit de ta faute ou celle de SFML, et sans ce code minimal personne ne pourra t'aider ici. Et toi-même tu risques de perdre ton temps.
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Ordre de dessin avec sprites et vertexarrays
« Réponse #6 le: Février 24, 2015, 11:04:08 pm »
Je comprend cela mais, comment pourrais-je espérer reproduire l'erreur de code dans le main sachant que je ne la connais pas? Tu me dis bidouiller, bidouiller, mais je peux bidouiller longtemps ça peut venir de beaucoup de choses ;D
Il doit bien y avoir une erreur simple à déceler quelque part après tout!
Merci encore de ton aide.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Ordre de dessin avec sprites et vertexarrays
« Réponse #7 le: Février 24, 2015, 11:09:20 pm »
C'est simple : tu écris un code qui fait uniquement la chose qui ne marche pas. En l'occurence, afficher un sprite puis un morceau de vertex array. Ca ne devrait pas prendre plus de 20 lignes de code. Ensuite, si ça marche, tu regardes ce qui diffère entre ce code simple et ton code d'origine. Quitte à rajouter des trucs petit à petit (ou retirer petit à petit de ton code d'origine) jusqu'à ce que ça foire (resp. que ça marche). C'est infaillible, tu es obligé de tomber sur la cause du problème à un moment donné.
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Ordre de dessin avec sprites et vertexarrays
« Réponse #8 le: Février 24, 2015, 11:16:24 pm »
Ta méthode m'a fait réfléchir aux différences qu'il pourrait y avoir, et BINGO! Problème résolu!  ;D
En fait, un layer peut être une couche de tuile comme une couche d'ombres sous ces tuiles.
Et le code dessinait par layer:
  • Le sprite
  • la tuile qui cache
  • l'ombre de la tuile, qui ne cache pas le sprite
  • et donc encore une fois le sprite! Qui se retrouve par-dessus!
Encore merci, tes conseilles m'ont encore une fois aider, merci merci merci!  ;D
Bonne soirée.

PS: En effet, le code minimal aurait marché!