Bonjour !
Mon titre est assez vague car j'ai quelques questions concernant les 3 thèmes du titre :
Première question ou plutôt problème, j'ai créer une classe Personnage et lorsque j'essaie de l'afficher dans mon main, un rectangle blanc s'affiche, voici le code de ma classe Personnage :
Personnage::Personnage(const string &filePath, sf::IntRect subRect, sf::Vector2f position)
{
if(!myImage.loadFromFile(filePath))
{
cout << "erreur" << endl;
}
else
{
// l'image est correctement chargée
myImage.createMaskFromColor(sf::Color(255,0,255));
sf::Texture mySprite1;
mySprite1.loadFromImage(myImage);
for(int i=0 ; i<4 ; i++)
{
mySprite[i].setTexture(mySprite1);
mySprite[i].setTextureRect(sf::IntRect(30*i, 0, 30, 40));
}
spriteActuel = mySprite[0];
}
}
sf::Sprite Personnage::getSprite()
{
return spriteActuel; //même problème en faisant return mySprite[0];
}
ainsi que mon appel de fonction : window.draw(perso.getSprite());
J'ai encore beaucoup de mal avec les pointeurs donc le problème vient probablement de là (puisque qu'en créant l'objet dans le main sans passer par un constructeur, avec le même code, ça marche)
Deuxième question, est on obligé de passer par une Texture pour passer d'une Image à un Sprite ?
sf::Texture mySprite1;
mySprite1.loadFromImage(myImage);
Merci d'avance pour avoir pris le temps de me répondre :)
Encore merci :)
Edit :
J'ai donc ajouter l'attribut myImage dans ma classe, j'ai mis une méthode getImage() qui me renvoie l'image et que je traite dans le main, ça marche parfaitement. Mais toujours le même résultat pour le getSprite()
main.cpp
#include "Personnage.h"
#include "constantes.h"
// #include <iostream>
// #include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
using namespace std;
using namespace sf;
int main()
{
sf::RenderWindow window(sf::VideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE), "Jeu");
window.setKeyRepeatEnabled(false);
window.setMouseCursorVisible (true);
window.setFramerateLimit(60);
sf::IntRect subRect(0,0,30,40);
sf::Vector2f position(0,0);
Personnage perso ("Eau/sprite.png", subRect, position);
// spritePerso2.setTextureRect(IntRect(30, 0, 30, 40));
sf::Event event;
while (window.isOpen())
{
while (window.waitEvent(event))
{
/*
window.clear(sf::Color::White);
*/
window.draw(perso.getSprite());
/*
sf::Texture mySprite1;
mySprite1.loadFromImage(perso.getImage());
sf::Sprite sp;
sp.setTexture(mySprite1);
window.draw(sp);
*/
if (event.type == sf::Event::Closed)
window.close();
window.display();
}
}
return 0;
}
Personnage.h
#ifndef PERSONNAGE_H
#define PERSONNAGE_H
#include <iostream>
#include <string>
#include <SFML/Graphics.hpp>
class Personnage
{
public:
Personnage(const std::string & filePath, sf::IntRect subRect, sf::Vector2f position);
virtual ~Personnage();
sf::Sprite getSprite();
sf::Image getImage();
/*
void recevoirDegats(int nbDegats);
void attaquer(Personnage &cible);
*/
protected:
private:
sf::Image myImage;
sf::Sprite mySprite[4]; //a changer
sf::Sprite spriteActuel;
};
#endif // PERSONNAGE_H
Personnage.cpp
#include "Personnage.h"
#include <string>
using namespace std;
Personnage::Personnage(const string &filePath, sf::IntRect subRect, sf::Vector2f position)
{
if(!myImage.loadFromFile(filePath))
{
cout << "erreur" << endl;
}
else
{
myImage.createMaskFromColor(sf::Color(255,0,255));
sf::Texture mySprite1;
mySprite1.loadFromImage(myImage);
for(int i=0 ; i<4 ; i++)
{
mySprite[i].setTexture(mySprite1);
mySprite[i].setTextureRect(sf::IntRect(30*i, 0, 30, 40));
}
spriteActuel = mySprite[0];
}
}
sf::Sprite Personnage::getSprite()
{
return spriteActuel;
}
sf::Image Personnage::getImage()
{
return myImage;
}
Personnage::~Personnage()
{
}
Voici le code que j'ai, en version light pour cibler le pb