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

Auteur Sujet: [Résolu] RenderTexture: récupérer plusieurs textures avec des vues différentes  (Lu 2805 fois)

0 Membres et 1 Invité sur ce sujet

m@thieu41

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Bonsoir!
Alors voilà, j'ai un petit problème (deux heures que je cherche une alternative, j'ai un mal de crâne épouvantable :P):
J'ai un sf::Rendertexture, dans lequel j'affiche des sprites.
Je voudrait pouvoir récupérer des textures, avec des vues différentes sur le RenderTexture, afin de les affichers sur le même écran (c'est pour faire un jeu 2 joueurs: chacun doit voir la même chose, mais pas depuis le même endroit, en fonction de où il se trouve).
Et là, je me heurt à un problème: lorsue je fais RenderTexture.getTexture() pour le deuxième joueur... ça change celui du premier, puisque la fonction renvoit une référence constante sur une texture...
Du coup, je me retrouve à afficher 2 fois la même chose sur l'écran... ???
Quelqu'un aurait une solution à mon problème?
Merci d'avance!  :D
« Modifié: Mai 01, 2013, 09:37:13 am par m@thieu41 »

m@thieu41

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Re : RenderTexture: récupérer plusieurs textures avec des vues différentes
« Réponse #1 le: Avril 30, 2013, 08:33:53 pm »
En regardant un peu, j'ai vu qu'on demande souvent un code minimal reprenant le problème dans la plupart des sujets du forum...
Puisque je n'ai pas encore eut de réponse, et que je pense que vous en avez marre de demander :P, je vais vous en donner un (j'ai repris l'exemple sur les sf::RenderTexture que j'ai modifié pour que le problème apparaisse:
// Create a new render-window
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
// Create a new render-texture
sf::RenderTexture texture;
if (!texture.create(350, 500))
return -1;
// The main loop
while (!Keyboard::isKeyPressed(Keyboard::Escape))
{
// create a Text
sf::Text text(sf::String("AB"));
// Clear the whole texture with red color
texture.clear(sf::Color::Red);
// Draw stuff to the texture
texture.draw(text); // text is a sf::Text
// create and apply a view
sf::View view(sf::Vector2f(0, 0), sf::Vector2f(350, 500));
texture.setView(view);
// We're done drawing to the texture
texture.display();
// Now we start rendering to the window, clear it first
window.clear();
// Draw the texture
sf::Sprite sprite(texture.getTexture());
window.draw(sprite);

// Change the view
view.setCenter(200, 0);
texture.setView(view);
// We're done drawing to the texture again
texture.display();
// Draw the texture again
sf::Sprite sprite2(texture.getTexture());
sprite2.setPosition(sf::Vector2f(400, 0));
window.draw(sprite2);

// End the current frame and display its contents on screen
window.display();
}
Le premier sprite à gauche devrait normalement afficher le texte "AB" au centre de sa partie, tandis que le second ne devrait afficher qu'une partie du "B", tout à gauche de la sienne... Et bien comme vous pouvez le constater, les 2 affichent la même chose (ce que doit afficher le second).

Comment pourrais je faire pour y remédier? (sans utiliser 2 renderTexture bien sûr  ;D)
Merci d'avance!
« Modifié: Avril 30, 2013, 08:35:45 pm par m@thieu41 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Citer
sans utiliser 2 renderTexture bien sûr
Pourquoi ? Ce serait la solution évidente.

Et pourquoi as-tu besoin de passer par des RenderTexture, plutôt que de dessiner directement sur la fenêtre ?
Laurent Gomila - SFML developer

m@thieu41

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Citer
sans utiliser 2 renderTexture bien sûr
Pourquoi ? Ce serait la solution évidente.
Parce que je voudrais faire un jeu pour 2 joueurs.
Donc du coup, j'ai besoin d'utiliser un RenderTexture afin de dessiner leurs voitures et les objets sur le jeu. Après, pour chaque joueur, je récupère l'image que je dois afficher (en appliquant des vues différentes).
Ça me permet de gagner du temps: sinon, je dois dessiner 2 fois la même chose sur des renderTexture différents, et je trouve que c'est un peu une perte de temps...
Et pourquoi as-tu besoin de passer par des RenderTexture, plutôt que de dessiner directement sur la fenêtre ?
Si je dessine directement sur la fenêtre, je ne pourrais pas appliquer des vues différentes pour chaque joueur (par exemple, je serait obligé de calculer en plus la taille des sprites en fonction du zoom, alors que les view me permettent de le faire facilement).

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Ah, en fait tu veux dessiner toute ta scène une seule fois, puis en afficher deux morceaux séparés dans la fenêtre, c'est ça ?

Dans ce cas oublie les vues, tu veux juste deux sf::Sprite utilisant ta texture mais avec des textureRect différents. Pour le zoom et le déplacement, tu as juste à jouer sur la position / taille du textureRect.
Laurent Gomila - SFML developer

m@thieu41

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Merci pour l'astuce, c'est parfaitement ce que je veux ;D