Bonjour tout le monde.
Alors voilà je rencontre plusieurs soucis avec la sfml 2.4.1.
Lorsque je créer une classe et que dan celle-ci je créer un élément audio ou graphique, il ne se joue pas/ne se dessine pas, lorsque je j'instancie un objet de cette classe et que j'appel la méthode.
Petit exemple :
sf::SoundBuffer buffer;
buffer.loadFromFile(PATH_SOUND);
sf::Sound sound;
sound.setBuffer(buffer);
sound.setAttenuation(80.f);
addBullet();
sound.play();
Voilà se morceau de code appartient à une de mes classes, le son devrait être joué, mais non... ( à la base j'avais créer un buffer et un sound en attribut et je les affectais dans le constructeur, mais ça ne fonctionnais pas non plus... )
et c'est la même chose pour les éléments graphique !
Ma classe possède un vector d'objet d'une autre classe qui elle est en fait un Cercle ( d'SFML ). et bien lorsque je dessine les objets du vector, rien n'apparait ! pourtant les objets sont bien dessiner ( en fait c'est une classe bullet si le cercle me touche je meurt, voilà comment je sais qu'il fonctionne!).
Si quelqu'un sait d'ou provient le problème je suis preneur, merci.
Voici la méthode permettant de créer une bullet et de la positionner sur la tourelle. Un son est sensé être joué ( mais ne fonctionne pas )
la constante PATH_SOUND est déjà utilisé ailleurs est fonctionne.
void Trap::shoot(TileMap *map, Player *player)
{
sf::Time wait = sf::microseconds(250000);
if(p_dir==0 && p_pos.x-player->getPos().x<=150)
{
printf("FONCTION SHOOT TRAP \n");
sf::sleep(wait);
sf::SoundBuffer buffer;
buffer.loadFromFile(PATH_SOUND);
sf::Sound sound;
sound.setBuffer(buffer);
sound.setAttenuation(80.f);
Bullet bullet(sf::Color::Blue);
bullet.shoot(p_pos,p_dir); //positionne la bullet
addBullet(); // ajoute la bullet au vector<Bullet> de Trap avec passage par référence
sound.play(); // ne fonctionne pas
}
for(unsigned int i=0; i<p_bullet.size();i++)
{
if(p_bullet[i].getIndex(map)==player->getIndex(map))
player->setAlive(false);
}
}
La fonction se déclenche bien puisque dans la console j'ai bien le message de mon printf. Et les bullet se créer puisque si je saute sur la tourelle je meurt.
Concernant l'affichage des bullet de mon Trap voici la fonction draw :
void Trap::draw(sf::RenderWindow &window, TileMap &map, int level[], sf::View &view, sf::Time deltaTime)
{
if(isDrawable())
{
if(p_type==1)
{
for(unsigned int i=0; i<p_bullet.size();i++)
{
if(!p_bullet[i].draw(&window,&map,level,view,deltaTime))
delBullet(i);
}
}
p_sprite.setPosition(p_pos);
window.draw(p_sprite);
}
}
Et la fonction draw de Bullet :
bool Bullet::draw(sf::RenderWindow *window, TileMap *map, int level[], sf::View &view, sf::Time deltaTime)
{
setIndex(map);
isVisible(view,p_dir,map,level); // check if the bullet is visible
printf("FONCTION DRAW BULLET \n");
if(p_isVisible)
{
switch(p_dir)
{
case 0:
p_circle.move(-SPEED_BULLET*deltaTime.asSeconds(),0);
break;
case 1:
p_circle.move(SPEED_BULLET*deltaTime.asSeconds(),0);
break;
case 2:
p_circle.move(0,-SPEED_BULLET*deltaTime.asSeconds());
break;
case 3:
p_circle.move(0,SPEED_BULLET*deltaTime.asSeconds());
break;
}
p_pos = p_circle.getPosition();
window->draw(p_circle);
return true;
}
printf("non Visible \n");
return false;
}
La fonction draw de Bullet ne se déclenche même pas ( pas le message dans la console )
Normalement cette dernière fonctionne parfaitement car déjà utilisé pour mon joueur et aucun soucis.
Voici mes constructeurs pour Bullet
/** CONSTRUCTOR && DESTRUCTOR **/
Bullet::Bullet()
{
p_isVisible=true;
p_circle.setRadius(RADIUS_BULLET);
p_circle.setFillColor(sf::Color::Red);
}
Bullet::Bullet(sf::CircleShape circle)
{
p_isVisible=true;
p_circle.setRadius(circle.getRadius());
p_circle.setFillColor(sf::Color::Red);
}
Bullet::Bullet(sf::Color color)
{
p_isVisible=true;
p_circle.setRadius(RADIUS_BULLET);
p_circle.setFillColor(color);
}
Bullet::Bullet(sf::CircleShape circle, sf::Color color)
{
p_isVisible=true;
p_circle.setRadius(circle.getRadius());
p_circle.setFillColor(color);
}
// destructor
Bullet::~Bullet()
{
}
Et voici la fonction addBullet() elle n'a rien de spécial :
void Trap::addBullet(Bullet &bullet)
{
p_bullet.push_back(bullet);
}
p_bullet étant un vector<Bullet> en attribut.
Le son est géré du tir est toutefois sensé être géré par la classe Trap, le buffer est initialiser dans le constructeur de celui-ci puis le j'attribut le buffer au sound toujours dans le constructeur. Le buffer et le sound sont en attribut, mais toujours pas de son..
Bonsoir,
J'apportes quelques précisions.
En fait la fonction shoott tourne dans un thread alors que la fonction draw tourne dans la boucle du jeu.
JJ'ai fais le test de créer un Trap et de faire tourner la fonction shoot et draww dans la boucle du jeu, et là.. j'ai bbien le son qui se lance, mais toujours pas d'affichage des bullets !
Le thread si jamais :
void thread_trap(sf::RenderWindow *window, TileMap *map, Player *player, int level[], std::array<Trap,NB_TRAP> &v_trap)
{
sf::Clock clock;
sf::View view;
while(player->isAlive() && window->isOpen())
{
sf::Time deltaTime = clock.restart();
//get view
view = window->getView();
//launch all
for(unsigned int i=0; i<NB_TRAP; i++)
v_trap[i].launch(window,map,player,level,view,deltaTime,player->getBulletVector());
}
}
EDIT : Voici le lien vers mon drive ou se situe les fichiers du projet. https://drive.google.com/drive/folders/0B38UTGF6GjZffjk3RVV2bmhseVk5eXFtY1RfX3FhX3g4TG0wZWhXRnRRaU5mZ3FycWgwSUk?usp=sharing (https://drive.google.com/drive/folders/0B38UTGF6GjZffjk3RVV2bmhseVk5eXFtY1RfX3FhX3g4TG0wZWhXRnRRaU5mZ3FycWgwSUk?usp=sharing)