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

Auteur Sujet: Multiple sprite  (Lu 4288 fois)

0 Membres et 1 Invité sur ce sujet

Jamese

  • Jr. Member
  • **
  • Messages: 72
    • Voir le profil
Multiple sprite
« le: Novembre 09, 2014, 06:14:37 pm »
Bonjour/bonsoir.
Depuis ce matin je cherche en vin une façon d'afficher plusieurs sprite à plusieurs endroit ( pas de tilemap* ) je m'explique : On affiche un sprite a la position x,y et je veux le même sprite a la position x2,y2 sans que l'ancien bouge et 'ainsi de suite' 

      *Avec une tilemap on pourrais penser que cela irais mais non, car les sprites à afficher bouge donc le tilemap ne marche pas.

Sur cette question, je vous souhaite une bonne soirée/journée 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Multiple sprite
« Réponse #1 le: Novembre 09, 2014, 06:31:33 pm »
Et qu'est-ce qui te pose problème là-dedans ? Il n'y a rien de compliqué, c'est un cas assez classique.
Laurent Gomila - SFML developer

Jamese

  • Jr. Member
  • **
  • Messages: 72
    • Voir le profil
Re : Multiple sprite
« Réponse #2 le: Novembre 09, 2014, 06:40:42 pm »
Ba je voie pas du tout.  car j'avais eu l'idée d'un multiple draw mais après je sait pas si je vais en afficher 10/12/50 cela va dépendre de l’aléatoire. 

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : Multiple sprite
« Réponse #3 le: Novembre 09, 2014, 06:52:10 pm »
draw
move
draw
move
draw
...
display

Ou plusieurs sprites qui utilisent la même Texture.
C'est quoi la question ?

Jamese

  • Jr. Member
  • **
  • Messages: 72
    • Voir le profil
Re : Multiple sprite
« Réponse #4 le: Novembre 09, 2014, 07:07:20 pm »
un dessin parle mieux :
voila les rectangles sont les même sprite qui bouge dans le sens de la flèche ( logique ) et moi je veux qu'il ai la même texture et tout tout mais le problème c'est que je ne sait pas à l'avance si il va y en avoir 4 /10/20 voila voila

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : Multiple sprite
« Réponse #5 le: Novembre 09, 2014, 07:19:11 pm »
Et donc quelle est la question ?
Fais un tableau (vector) de sprites et tu en ajoutes/retires au besoin.

Jamese

  • Jr. Member
  • **
  • Messages: 72
    • Voir le profil
Re : Multiple sprite
« Réponse #6 le: Novembre 09, 2014, 07:38:28 pm »
Sa ma l'air bon mais je ne m'y connais pas du tout. Je suis un gros novice dans les tableau vector ...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Multiple sprite
« Réponse #7 le: Novembre 09, 2014, 07:48:30 pm »
Dans ce cas prends le temps d'apprendre et de bosser tes bases de C++. Si on te donne tout cuit les réponses à tes problèmes ici, tu ne vas pas beaucoup progresser ;)

Et puis n'oublie pas que c'est un forum concernant SFML, pas le C++ en général. Or ta question n'a finalement rien à voir avec SFML.
Laurent Gomila - SFML developer

Jamese

  • Jr. Member
  • **
  • Messages: 72
    • Voir le profil
Re : Multiple sprite
« Réponse #8 le: Novembre 09, 2014, 07:52:47 pm »
ok c'est bon a s'avoir, je pensait que la sfml pouvais faire un truc mai bon tampis.
Il faud donc que je cherche du coter c++ "tableaux de vector" si j'ai bien compris

Jamese

  • Jr. Member
  • **
  • Messages: 72
    • Voir le profil
Re : Multiple sprite
« Réponse #9 le: Novembre 10, 2014, 06:41:05 pm »
Eddit : j'ai trouver mais le problème sa me sort un carrée blanc et le sprite . Voici le code
main.cpp
#include <iostream>
#include <SFML/Graphics.hpp>
#include "Ship.h"

using namespace std;
using namespace sf;

int main()
{
    sf::RenderWindow window(sf::VideoMode(1220, 800), "SFML works!");
    window.setFramerateLimit(60);


std::vector<Ship> first;

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();

            if (sf::Keyboard::isKeyPressed(sf::Keyboard::V))
            {
                int x = first.size();
                first.push_back(Ship());
                first[x].setTexture();
                first[x].setPosition(100, 100);
            }
        }


        window.clear();
        for ( int i = 0; i< first.size();i++)
        {
            window.draw(first[i]);
        }
        window.display();
    }

    return 0;
}

 

ship.h
#ifndef SHIP_H
#define SHIP_H
#include <SFML/Graphics.hpp>
#include <iostream>


class Ship : public sf::Drawable , public sf::Transformable
{
    public:
        Ship();
        void deplacement();
        void setTexture();

    private:
     virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
        {
            target.draw(Spr_ship, states);
        }

    sf::Sprite Spr_ship;
    sf::Texture Text_ship;
};

#endif // SHIP_H

 

et ship.cpp
#include "Ship.h"

Ship::Ship()
{
Text_ship.loadFromFile("ressource/texture/rafale.png");
     Spr_ship.setTexture(Text_ship);
     Spr_ship.setPosition(150,150);
     Spr_ship.setOrigin(78, 78);
}

void Ship::deplacement()
{

}

void Ship::setTexture()
{
Text_ship.loadFromFile("ressource/texture/rafale.png";
Spr_ship.setTexture(Text_ship);
}

 
Je ne voie pas dout sa pourais venir. marci de votre aide
bonne journée.
« Modifié: Novembre 11, 2014, 04:02:01 pm par Jamese »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Multiple sprite
« Réponse #10 le: Novembre 11, 2014, 04:25:40 pm »
Problème classique (un peu trop...). Tes instances sont copiées dans le vecteur, mais ta classe n'a pas de constructeur par copie approprié.
Laurent Gomila - SFML developer

Jamese

  • Jr. Member
  • **
  • Messages: 72
    • Voir le profil
Re : Multiple sprite
« Réponse #11 le: Novembre 11, 2014, 06:02:03 pm »
^^ simple pour vous, mais pour un novice comme moi je ne voie pas quoi faire mise a part mettre :
sf::RenderWindow window(sf::VideoMode(1220, 800), "SFML works!");
    window.setFramerateLimit(60);
 Ship First /*par exemple*/;
std::vector<Ship> first;
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Multiple sprite
« Réponse #12 le: Novembre 11, 2014, 06:57:32 pm »
Tu ne vois pas quoi faire parce que tu ne cherches pas à comprendre la cause profonde du problème ;)

Comme je te l'ai dit, dans un std::vector les éléments sont copiés de temps en temps (une fois quand tu insères, et parfois quand le tableau doit se mettre ailleurs en mémoire pour avoir plus de place). Donc il faut de manière évidente que la copie des choses qui sont dedans se passe bien, donc qu'ils aient un constructeur de copie correct.

Or que fait le constructeur de copie de ta classe ? Comme tu n'en as pas défini, c'est le compilateur qui le génère, en faisant une bête copie de tous les membres de la classe. Ca peut marcher dans la plupart des cas, mais malheureusement pas celui-ci. Pourquoi ? Parce que lorsque le membre Spr_ship va être copié, la copie va être identique au sprite d'origine ; en l'occurence, il va utiliser la même texture. Or ce n'est pas ce que tu veux : tu voudrais plutôt qu'il utilise la copie de la texture, celle qui se trouve dans l'instance copiée de Ship dans laquelle le sprite se trouve aussi. Et pour faire ça, il faut le coder, ça n'est pas fait tout seul.

Ca c'est pour la version courte ;D

Dans l'absolu, il faut toujours se demander quelle sémantique doit avoir une classe : de copie ou d'entité. En gros, est-ce que les instances de ma classe ont une existance propre, ou bien seul leur contenu compte ? Pour des classes d'entités comme ça, la réponse est évidente : c'est une sémantique d'entité. A savoir qu'un Ship avec telle texture et sprite, et un autre Ship avec la même texture et le même sprite, seront tout de même différents (ils représenteront toujours deux bateaux / vaisseaux distincts dans le jeu). Donc... ça n'a pas de sens de copier ces entités, donc on l'interdit (et on s'affranchit des problèmes liés, comme celui auquel tu es confronté en ce moment). Concrètement, cela signifie stocker des pointeurs dans ton tableau de sorte que les objets ne soient jamais copiés simplement parce qu'ils sont dans un tableau. C'est toi qui gère leur durée de vie, et pas le tableau.

Si tout ceci est clair pour toi alors tu as tout compris (bravo), sinon ne t'inquiète pas c'est normal, ça prend du temps et de la pratique pour assimiler ce genre de concept et les subtilités qui y sont associées.
Laurent Gomila - SFML developer

Jamese

  • Jr. Member
  • **
  • Messages: 72
    • Voir le profil
Re : Multiple sprite
« Réponse #13 le: Novembre 11, 2014, 07:53:02 pm »
merci de ta réponse, effectivement c'est un peut dure d'assimiler ou de comprendre le principe générale ( surtout les pointeurs ). Du coup je doit redoubler d'effort affin de trouver solution a mon problème. De plus à peine avoir compris les grands principes de la Po d'autres petits est gros problème surviennent pour m'enquiquiner.