Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - nicooomg

Pages: [1] 2 3 4 Suivante »
1
Bonjour,

J'aimerais voir à l'avenir quelques ajouts dans les constructeurs de la classe Vector2;
Je ne sais pas pour vous, mais je tombe souvent sur des minis hacks à mettre en place autour de la construction car les choix sont quand meme assez legers !

    Vector2();
    Vector2(T X, T Y);
    template <typename U>
    explicit Vector2(const Vector2<U>& vector);
 

Est-ce que un jour on pourrait avoir quelque chose de ce style ?
    template<typename... Types>
    Vector2(const std::tuple<Types...>& types) : x(std::get<0>(types)), y(std::get<1>(types)) {}

Les mini-hacks ne sont pas très lourds, mais ils permettront au moins une plus grande lisibilité !

Merci,

nico

2
Graphique / Re : Combiner des sprites en une sprite unique
« le: Février 28, 2013, 09:48:41 am »
Ne pas oublier que pour une RenderTexture, il faut suivre ceci:

        sf::RenderTexture final_texture;
        final_texture.create(width, height);
        final_texture.clear(sf::Color::Transparent); // Ou une autre couleur

        // Tu dessines ici ...


        final_texture.display();

A partir de ce moment, tu as une belle image toute prete :)

3
Général / Re : Problème de métaprogrammation
« le: Février 28, 2013, 09:43:34 am »
Pour contourner un problème assez similaire, j'ai créer une classe qui puisse englober n'importe quelle ressource (qui se charge !) SFML

template<class S>
class MemoryRessource
{
public:
    /// Loads a ressource from memory, and saves its offset
    MemoryRessource(const long offset, const std::vector<char>& bytes) :
        m_offset(offset),
        m_buffer(),
    {
        if(!m_buffer.loadFromMemory(&bytes[0], bytes.size()))
        {
            throw std::logic_error("Could not load data from memory");
        }
    }
    ~MemoryRessource()
    {
        /// Nothing to delete, m_buffer will be destroyed automatically
    }

    /// Returns the ressource (ie: sf::Texture)
    inline S& get() { return m_buffer; }
    /// Returns the ressource's offset
    inline const long getOffset() const { return m_offset; }

protected:
    MemoryRessource() {  }

private:
    long m_offset;
    S m_buffer;
};

Le tout, dans un manager:
template<class S>
class Memory
{
public:
/* pleins de fonctions inutiles ici :D */

    /// Accessing the ressource
    inline S& getRessource(const unsigned long key) { return m_loaded[key]->get(); }

private:
    std::map<unsigned long, std::shared_ptr<MemoryRessource<S>>> m_loaded;
};
 

Tu peux aussi bien ajouter une classe abstraite à Memory, et comme ca tu auras un type global pour chaque manager de ressources.

4
Général / Re : [sfml 2] sf::Mouse events
« le: Février 27, 2013, 05:36:27 pm »
Voici une solution, excusez pour le code vraiment "à l'arrache" et pas commentée du tout :D

Header:
class MouseClick
{
public:
    enum Status: unsigned short
    {
        NONE = 0,
        DOWN,
        DOUBLE_DOWN,
        PENDING,
        CLICK,
        DOUBLE
    };

    MouseClick();
    virtual ~MouseClick();

    void handle();

    inline bool left() const { return (std::get<0>(m_clicks) == Status::CLICK); }
    inline bool right() const { return (std::get<1>(m_clicks) == Status::CLICK); }
    inline bool doubleleft() const { return (std::get<0>(m_clicks) == Status::DOUBLE); }
    inline bool doubleright() const { return (std::get<1>(m_clicks) == Status::DOUBLE); }

    void clear();

private:
    sf::Clock m_time;
    unsigned long m_last;
    std::tuple<Status, Status> m_clicks;

    static const unsigned short click_delay = 100; /// ms
};
 


Source:
MouseClick::MouseClick() :
    m_time(sf::Clock()),
    m_last(m_time.getClock().getElapsedTime().asMilliseconds()),
    m_clicks(std::make_tuple(NONE, NONE))

{
    //ctor
}

MouseClick::~MouseClick()
{
    //dtor
}

void MouseClick::handle()
{
    bool left = sf::Mouse::isButtonPressed(sf::Mouse::Button::Left),
         right = sf::Mouse::isButtonPressed(sf::Mouse::Button::Right);

    Status& last_left = std::get<0>(m_clicks);
    Status& last_right = std::get<1>(m_clicks);

    unsigned long clock = m_time.getClock().getElapsedTime().asMilliseconds();
    auto delta = clock-m_last;


    if(left && last_left == Status::NONE)
    {
        last_left = Status::DOWN;
        m_last = clock;
    }
    else if(left && last_left == Status::PENDING)
    {
        if(delta < click_delay)
        {
            last_left = Status::DOUBLE_DOWN;
            m_last = clock;
        }
    }
    else if(!left && last_left == Status::DOWN)
    {
        last_left = Status::PENDING;
        m_last = clock;
    }
    else if(!left && last_left == Status::PENDING)
    {
        if(delta > click_delay)
        {
            last_left = Status::CLICK;
            m_last = clock;
        }
    }
    else if(!left && last_left == Status::DOUBLE_DOWN)
    {
        if(delta < click_delay)
        {
            last_left = Status::DOUBLE;
            m_last = clock;
        }
    }
    else if(!left &&
            (last_left == Status::CLICK || last_left == Status::DOUBLE)
            && delta > click_delay)
    {
        last_left = Status::NONE;
        m_last = clock;
    }

    if(right && last_right == Status::NONE)
    {
        last_right = Status::DOWN;
        m_last = clock;
    }
    else if(right && last_right == Status::PENDING)
    {
        if(delta < click_delay)
        {
            last_right = Status::DOUBLE_DOWN;
            m_last = clock;
        }
    }
    else if(!right && last_right == Status::DOWN)
    {
        last_right = Status::PENDING;
        m_last = clock;
    }
    else if(!right && last_right == Status::PENDING)
    {
        if(delta > click_delay)
        {
            last_right = Status::CLICK;
            m_last = clock;
        }
    }
    else if(!right && last_right == Status::DOUBLE_DOWN)
    {
        if(delta < click_delay)
        {
            last_right = Status::DOUBLE;
            m_last = clock;
        }
    }
    else if(!right &&
            (last_right == Status::CLICK || last_right == Status::DOUBLE)
            && delta > click_delay)
    {
        last_right = Status::NONE;
        m_last = clock;
    }
}
void MouseClick::clear()
{
    m_clicks = std::make_tuple(Status::NONE, Status::NONE);
}


Pour verifier le click sur un sprite:
            MouseClick click;
            sf::Sprite mon_sprite;
            // Trucs sur le sprite

            if(mouseclick.left()) { ... }
            if(mouseclick.right()) { ... }
            if(mouseclick.doubleleft()) { ... }
            if(mouseclick.doubleright()) { ... }

Ne pas oublier d'appeler MouseClick::clear(); si un des MouseClick::bool à retourné true !

5
Général / [sfml 2] sf::Mouse events
« le: Février 27, 2013, 10:13:22 am »
Bonjour,

J'aimerais simplement savoir comment verifier un double click ? :o
Y aurait-il quelque chose du style:


        sf::Event event;
        while(App.pollEvent(event))
        {
           
            if(event.type == sf::Mouse::DoubleClick)
            {
               
            }
        }

Merci d'avance

nico

6
Fenêtrage / Re : sf::Window::pollEvent bloquant !
« le: Janvier 16, 2013, 04:56:48 pm »
Hmm en effet.
Enfin je suppose que dans le cadre d'un jeu, il est préférable de pouvoir tout désactiver, surtout que d'implementer un ALT+F4 soit même n'est pas trop dur  !

7
Fenêtrage / Re : sf::Window::pollEvent bloquant !
« le: Janvier 16, 2013, 04:12:12 pm »
Pourquoi ne pas avoir une option (par defaut FALSE) qui autorise la fenêtre à prendre le contrôle total des touches du clavier ?

8
Fenêtrage / Re : sf::Window::pollEvent bloquant !
« le: Janvier 16, 2013, 02:31:47 pm »
D'accord,

De mon point de vue, ton API devrait laisser une liberté totale sur le comportement des touches !
De même pour ALT+F4, etc.

Merci pour l'info, je vais supprimer ca de mon appli, et j'espere avoir des news bientot!

nico

9
Fenêtrage / sf::Window::pollEvent bloquant !
« le: Janvier 16, 2013, 12:31:59 pm »
Bonjour,

Je suis tombé hier sur un problème que je n'arrive pas à résoudre, en effet, la fonction Window::pollEvent semble bloquer mon programme !

Ceci arrive quand j'appuie sur la touche LAlt du clavier.
-> Quand j'appuie une fois, la fonction bloque
-> Quand j'appuie en continue, la fonction ne bloque pas
-> Si je ré appuie sur une touche, ou autre, la fonction se débloque !

Comment résoudre le problème de la touche LAlt ?
Merci d'avance

nico

10
Système / Re : sf::Rect contenant un Point
« le: Janvier 10, 2013, 10:20:54 pm »
En fait, je n'applique aucune transformation a mon rectangle.
En effet, a la base ce n'est qu'une ligne définiepar x1 y1 et x2 y2.

Je fais donc, sf::RectangleShape avec x1 y1, et la longueur calculée entre les deux points
et j'applique une rotation calculée egalement.
j'y ajoute une hauteur de 20px, qui est donc un peu fausse, mais me sert juste pour mieux visualiser la ligne (et puis voir si la souris se trouver dedans (enfin, sur la ligne :D))

Mais je ne sais pas comment appliquer ca a un point pour ensuite verifier si il est dans le "rectangle"

11
Système / Re : sf::Rect contenant un Point
« le: Janvier 10, 2013, 08:59:26 pm »
Comment suis-je censé transformer mon point en ayant l'angle ?
Peut etre avec sf::Transformable ? Mais alors, quelle est la différence entre setPosition & setOrigin ?
Et comment tester ensuite la position, si je suis plus dans mon repete abs/ord ? :(

12
Système / sf::Rect contenant un Point
« le: Janvier 10, 2013, 08:10:28 pm »
Bonjour,

j'aimerais savoir comment faire pour verifier qu'un sf::Rect contient bien un point.
Le probleme, est que ce rectangle est en biais

exemple:


Comment faire ?

merci d'avance,

nico

13
Graphique / Re : [SFML2] sf::View qui redimensionne un sf::Sprite
« le: Janvier 10, 2013, 09:49:13 am »
Ah en effet !

Pour obtenir une vue plus petite , en gardant les memes dimensions, si vous avez un rectangle en bas de votre ecran...:

            m_game.getRenderer().mapView().setSize(800, 600-getToolboxHeight());
            m_game.getRenderer().mapView().setCenter(400, (600-getToolboxHeight())/2);
            m_game.getRenderer().mapView().setViewport({0, 0, 1, (600.f-getToolboxHeight())/600.f});

Merci L.G

14
Graphique / [Résolu] [SFML2] sf::View qui redimensionne un sf::Sprite
« le: Janvier 10, 2013, 12:57:13 am »
Bonjour :)

J'ai un problème en utilisant une view.

Voici le code, lorsque je charge ma texture de fond, je configure ma view:

        if(load_map_order>=0)
        {
            // chargement de la map

            m_game.getRenderer().mapView().setSize(800, 600-getToolboxHeight());
            m_game.getRenderer().mapView().setCenter(400, (600-getToolboxHeight())/2);
            load_map_order = -1;
        }

Et bien sur, l'affichage:
        if(m_game.getRenderer().hasMapTexture())
        {
           /// mise à jour de la vue, pour le scrolling, la fonction n'appelle que sf::View::move
            m_game.getRenderer().updateViews({0, 0, 0, getToolboxHeight()/2});
          /// on prend la vue pour le scrolling
            App.setView(m_game.getRenderer().mapView());
          /// dessine la map
            App.draw(m_game.getRenderer().mapSprite());
          /// vue normale !
            App.setView(App.getDefaultView());
        }


Le problème, c'est que.. voici un screenshot en fichier joint!

Quel est le problème ?

Merci d'avance,

nico


[attachment deleted by admin]

15
Graphique / Re : Ecran blanc & loadFromMemory
« le: Octobre 23, 2012, 04:22:23 am »
De plus:

Dans le getter de MemoryRessource,
j'ai ajotué:
m_buffer.copyToImage().saveToFile("test.jpg");
-> Image noire..... Problème !!

Ensuite j'ai remonté un peu, j'ai mis la meme chose dans le constructeur !
-> Bonne image, et en plus, l'image s'affiche à l'écran !

Je comprend plus rien maintenant :(

Pages: [1] 2 3 4 Suivante »
anything