-
Bonjour :)
Alors voici ma fonction:
void MapScroller::setViewport(const sf::IntRect& camera)
{
mapsprite.setTextureRect(sf::IntRect(0, maptexture.getSize().y-winsz.y, winsz.x, winsz.y));
}
Le probleme: He bien, le rectangle d'affiche est toujours en haut a gauche ... !
Alors que normalement , je devrais avoir: sf::IntRect(0, 600, 800, 600);
Comment faire pour afficher simplement une partie ?
merci d'avance, nico
-
void MapScroller::setViewport(const sf::IntRect& camera)
{
mapsprite.setTextureRect(sf::IntRect(0, maptexture.getSize().y-winsz.y, winsz.x, winsz.y));
masprite.setPosition(0,maptexture.getSize().y-winsz.y);
}
Le probleme: He bien, le rectangle d'affiche est toujours en haut a gauche ... !
Il faut utiliser sf::Sprite.setPosition pour déplacer un sprite.
Alors que normalement , je devrais avoir: sf::IntRect(0, 600, 800, 600
Ici tu sélectionne la partie de la texture que tu veux afficher. Donc la partie 0,600 de la texture et placé à la position du sprite 0,0 et se retrouve en haut à gauche.
Il ne faut pas penser que le sprite colle la texture en 0,0 puis dessine la partie du subRect.
-
Bonjour.. malheureusement, ton code ne change rien... enfin je crois
j'essaye:
void MapScroller::setViewport(const sf::IntRect& camera)
{
std::cout << "viewport"<<std::endl;
mapsprite.setTextureRect(sf::IntRect(0, maptexture.getSize().y-winsz.y, winsz.x, winsz.y));
mapsprite.setPosition(0, maptexture.getSize().y-winsz.y);
}
Je suis toujours en haut a gauche...
-
Que retourne maptexture.getSize().y-winsz.y ? Moi je dirai 0, pas toi ? :p Sait tu au moins à quoi sa sert les setTextureRect ? Sa te permet de sélectionner une partie d'une texture.
Par exemple, si tu fais sprite.setTexture(sf::FloatRect(10, 10, 100, 100));
Tu aura un carré.
(http://img443.imageshack.us/img443/8765/rectanglez.jpg)
Disons que le rectangle jaune c'est ta texture. Ben ton sprite sera le carré blanc avec le code si dessus : ta TextureRect commence bien à (10; 10) et fait bien une taille de 100 en x et 100 en y (j'ai pas pris ma règle tu t'en doute bien :p ).
-
Non je comprend tres bien a quoi ca sert ! C'est justement ce que jessaye de faire !
Mais, maptexture.getSize().y-winsz.y retourne 600. (*c'est simple, ma texture fait 3000*1200).
Donc mon carré: debut: 0, 600. taille: 800,600 (ma fenetre.. !)
Pourtant je suis toujours en haut a droite de mon image :(
J'aimerais afficher le carré en bas a gauche.
Au final c'est une image 2D et je vais bouger le rectangle de gauche a droite.
-
Si t'a fenêtre fait 800,600, et que le carré est à 0, 600, il ne devrait même pas s'afficher sur la fenêtre normalement....
-
La sfml est simple, mais alors cette fonctionnalité est plus simple sur la SDL.
J'ai une fenetre de taille 800*600.
Une texture de taille 3000*1200.
Je veux afficher la partie de la texture de
x:0
y:600 (donc, texture.y - window.y)
largeur: 800
hauteur: 600.
Comment faire?
-
Impossible puisque t'a fenêtre fait 800,600 . Tu peux par contre (si j'ai bien compris ton problème parce qu'il est loin d'être évident) afficher ton sprite à 0(texture.x-window.y-sprite.y). Il sera donc placé pile poile en bas à droite.
-
Attend ya un probleme la ! C'est forcement possible.
Je m'explique avec la SDL.
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
grace a srcrect, on peut clipper une surface de telle sorte a selectionner uniquement une partie de la surface !
donc utiliser une feuille de sprite !
Ca je vais en avoir besoin.
Le deuxieme besoin, qui peut etre emuler aussi comme si cetait une feuille de sprite, cest que jai une image qui sert de fond decran, qui est donc gigantesque par rapport a la taille de la fenetre et je dois la deplacer (ou deplacer le viewport(??)) sur limage, pour effectuer un scroller dans toutes les directions, a ma guise, comme si cetait le fond decran du jeu mario !
Je suis peu etre plus clair sur ce que jrecherche maintenant :)
-
enfaîte t'a pas compris que ton image est EN DESSOUS de ta fenêtre. Imagine qu'il y a une suite dans ta fenêtre, ben ton image est juste en dessous ;) (comme t'a fenêtre fait 600 en hauteur, si tu met ton image à (0, 600), l'image sera pile en dessous ;) ).
-
Bonjour,
J'en profite pour vite poser une petite question. Est-ce qu'il y a un moyen simple
de n'afficher qu'une partie de la texture qui serait une forme convexe/concave au lieu d'un rectangle ?
-
Convexe, c'est possible simplement avec une ConvexShape (qui a une méthode setTexture). Pour une forme concave, il faut passer par un VertexArray (et utiliser le champs texCoords des Vertex pour "lier" un sommet à un point de la texture); éventuellement, tu peux écrire ta propre classs pour gérer certaines formes concaves que tu désires (Laurent avait au début implémenté une classe StarShape, qu'il doit être possible de retrouver en cherchant dans l'historique de GitHub).
-
Laurent avait au début implémenté une classe StarShape
En fait, ce n'était qu'un cas très particulier qui fonctionnait par les hasards de l'implémentation. En gros, ce qui marche avec SFML ce sont les formes convexes et les étoiles. Du coup ça ne montre absolument pas comment gérer n'importe quelle forme concave.