Bon, alors j'ai repris le code source de mon jeu, je l'ai juste adapté pour qu'il soit minimal: le code qui fait l'effet de surbrillance:
#include <iostream>
#include <SFML/Graphics.hpp>
using namespace std;
sf::Texture Degrade_Blanc_Droite, Degrade_Blanc_Gauche, Degrade_Blanc_Bas, Degrade_Blanc_Haut;
void displaySurBrillance(sf::Vector2f Position, sf::Vector2f Size, sf::RenderWindow& App)
{
int X(Position.x), Y(Position.y);
int SX(Size.x), SY(Size.y);
sf::ConvexShape LeftShape;
LeftShape.setPosition(X, Y);
LeftShape.setPointCount(4);
LeftShape.setPoint(0, sf::Vector2f(0, 0));
LeftShape.setPoint(1, sf::Vector2f(0, SY));
LeftShape.setPoint(2, sf::Vector2f(-10, SY + 10));
LeftShape.setPoint(3, sf::Vector2f(-10, -10));
LeftShape.setTexture(&Degrade_Blanc_Droite);
sf::ConvexShape RightShape;
RightShape.setPosition(X, Y);
RightShape.setPointCount(4);
RightShape.setPoint(0, sf::Vector2f(SX, 0));
RightShape.setPoint(1, sf::Vector2f(SX + 10, -10));
RightShape.setPoint(2, sf::Vector2f(SX + 10, SY + 10));
RightShape.setPoint(3, sf::Vector2f(SX, SY));
RightShape.setTexture(&Degrade_Blanc_Gauche);
sf::ConvexShape UpShape;
UpShape.setPosition(X, Y);
UpShape.setPointCount(4);
UpShape.setPoint(0, sf::Vector2f(0, 0));
UpShape.setPoint(1, sf::Vector2f(-10, -10));
UpShape.setPoint(2, sf::Vector2f(SX + 10, -10));
UpShape.setPoint(3, sf::Vector2f(SX, 0));
UpShape.setTexture(&Degrade_Blanc_Bas);
sf::ConvexShape DownShape;
DownShape.setPosition(X, Y);
DownShape.setPointCount(4);
DownShape.setPoint(0, sf::Vector2f(0, SY));
DownShape.setPoint(1, sf::Vector2f(-10, SY + 10));
DownShape.setPoint(2, sf::Vector2f(SX + 10, SY + 10));
DownShape.setPoint(3, sf::Vector2f(SX, SY));
DownShape.setTexture(&Degrade_Blanc_Haut);
App.draw(LeftShape);
App.draw(RightShape);
App.draw(UpShape);
App.draw(DownShape);
}
int main(int argc, char *argv[])
{
sf::RenderWindow App(sf::VideoMode(1024, 768, 32), "Test sf::ConvexShape");
sf::Image White_Haut, White_Bas, White_Droite, White_Gauche;
int W(255);
White_Haut.create(255, 255, sf::Color(0, 0, 0));
for(unsigned int Y(0); Y < 255; ++Y)
{
for(unsigned int X(0); X < 255; ++X)
{
White_Haut.setPixel(X, Y, sf::Color(W, W, W, W));
}
--W;
}
Degrade_Blanc_Haut.create(255, 255);
Degrade_Blanc_Haut.update(White_Haut);
White_Bas.create(255, 255, sf::Color(0, 0, 0));
for(unsigned int Y(0); Y < 255; ++Y)
{
for(unsigned int X(0); X < 255; ++X)
{
White_Bas.setPixel(X, Y, sf::Color(Y, Y, Y, Y));
}
}
Degrade_Blanc_Bas.create(255, 255);
Degrade_Blanc_Bas.update(White_Bas);
White_Droite.create(255, 255, sf::Color(0, 0, 0));
for(unsigned int X(0); X < 255; ++X)
{
for(unsigned int Y(0); Y < 255; ++Y)
{
White_Droite.setPixel(X, Y, sf::Color(X, X, X, X));
}
}
Degrade_Blanc_Droite.create(255, 255);
Degrade_Blanc_Droite.update(White_Droite);
White_Gauche.create(255, 255, sf::Color(0, 0, 0));
W = 255;
for(unsigned int X(0); X < 255; ++X)
{
for(unsigned int Y(0); Y < 255; ++Y)
{
White_Gauche.setPixel(X, Y, sf::Color(W, W, W, W));
}
--W;
}
Degrade_Blanc_Gauche.create(255, 255);
Degrade_Blanc_Gauche.update(White_Gauche);
App.setFramerateLimit(60);
while(App.isOpen())
{
App.clear(sf::Color(0, 0, 0));
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
{
App.close();
}
displaySurBrillance(sf::Vector2f(200, 300), sf::Vector2f(200, 60), App);
App.display();
}
return 0;
}
Alors, a ma plus grande surprise: Sur la carte ATI ça fonctionne très bien, et je n'ai pas d'erreur de segmentation a la fin du programme...
Le problème que j'ai maintenant c'est que ce même code fait des rendus horribles dans mon jeu.
Et malgré que le code minimal fonctionne, y a quand même un problème quelque part qu'il serait bon de corriger
J'ai ré-essayé un jeu SFML1.6 sur les drivers ATI actuels, et je n'ai pas de bug non plus (pour ce jeu en tout cas).
J'ai ré-essayé mon jeu complet en SFML2.0 RC, et le codé présenté ci-dessus fait des affichages horribles avec l'erreur de segmentation présentée dans le premier post... (et ce n'est pas tout, tout le jeu est affiché comme je l'ai déjà montré..)
Y a t-il un lien possible entre le bug graphique et le fait que mes jeux sont des interfaces Qt dans lequel tournent le rendu de la SFML?
→ J'ai repris quasiment tel quel que QSFMLCanva pour la SFML 2.0, j'ai juste modifié les fonctions qui n'existaient plus pour la SFML, et rajouté des namespaces là où les fonctions Qt et SFML ont le même nom.
(Oui, en fait, il faut savoir que le passage des majuscules au minuscules pour les fonctions engendre les problèmes au niveau des noms, Qt a déjà des fonctions qui portent un certain nom, et la SFML a des fonctions qui portent des fois le même nom a cause du changement de majuscule en minuscule)
N'y aurait-il pas une fonction a rajouter, où un paramètre a changer pour la compatibilité SFML 2.0 / Qt?
Ce que je ne comprends pas, c'est que des fois ça marche très bien et des fois ça bug au possible, et des fois pour le même sf::ConvexShape il suffit de changer un peu la taille et il passe de "imbuvable" a normal et inversement: C'est le cas des barres de vies, quand elle est presque pleine, dans certains cas (1 fois sur 10) elle fonctionne et pareil si elle est presque vide, mais entre les 2 elle bug
Merci
PS: Et je ne vois vraiment pas ce qui peut clocher dans le code source étant donné que sur la carte Nvidia tout fonctionne correctement...
EDIT: Je fais des tests sur un code minimal qui propose 2 options:
Soit un rendu simple, soit un rendu dans Qt.
Pour l'instant j'ai la même chose sur les rendu Qt et simples, et sur les 2 cartes graphiques.
Je remarque bien le bug des carrés autour du texte dès que celui-ci grossi un peu.
Je cherche la combinaison qui permet de faire le bug sur un sf::ConvexShape....
EDIT2: Ayant la même chose, j'ai tenté de sauver les textures générées pour les sf::ConvexShape (au cas où le bug vienne de là..), j'ai donc convertit la texture en sf::Image a sa création et l'ai sauvé.
J'en ai sauvé une quinzaine comme ça, sur Nvidia et ATI.
Euh, je ne pense pas que ça vienne de ce fait, mais j'ai pu jouer normalement au jeu sur mon PC portable.
J'ai quand même eut des bugs de texte (les carrés autours des lettres) plus importants que sur ma carte Nvidia mais c'était correct.
J'ai relancé plusieurs fois, pas de bug.
ça a l'air d'être un phénomène assez passager. (mais bien présent, et bien fréquent, et ça ne touche pas que mon PC, mais aussi quelques autres PC avec une carte ATI sur lesquels j'ai lancé le jeu, tous les autres avec une carte Nvidia n'ont aucuns problèmes...)
D'autant plus que le jeu fait toujours une erreur de segmentation quand il quitte sur la carte ATI... (et vous pouvez regarder au dessus, ça plante en plein dans les pilotes graphiques..)