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 - MyPix

Pages: [1] 2 3 ... 8 Suivante »
1
Général / Re: Threads et SFML ?
« le: Juillet 05, 2017, 06:31:28 pm »
J'essaierais de prendre un livre sur le sujet quand je voudrais approfondir. Pour le moment, je vais tenter à ma manière, si je remarque que c'est foireux/pas stable, je lirais un peu sur le sujet :p

2
Général / Re: Threads et SFML ?
« le: Juillet 05, 2017, 04:48:02 pm »
Ooh, erreur de ma part ! Donc, j'ai ce code ci :
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Screen.h"
#include <thread>

using namespace std;

void drawingThread(sf::RenderWindow *window)
{
        while (window->isOpen())
        {
                sf::Event event;
                while (window->pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window->close();
                }
                window->clear(sf::Color::Black);
                window->display();
        }
}

void tick(const sf::RenderWindow *rw)
{
        while (rw->isOpen())
        {
                cout << "Tick!" << endl;
        }
}
int main()
{
        // create the window
        sf::RenderWindow *window = new sf::RenderWindow(sf::VideoMode(800, 600), "My window");
        thread t1(drawingThread, window);
        thread t2(tick, window);
        t1.join();
        cin.get();
        return 0;
}

Mais j'ai toujours l'erreur "failed to Activate the window context" :/

EDIT : Après avoir fouillé dans les forum, j'ai lu qu'il fallait désactiver la fenetre dans ce thread pour l'utiliser dans l'autre. J'ai donc ajouté window->setActive(false);apres la création de la fenetre et ça marche !

Par contre, pour ma question :
D'une manière plus générale : Cela pose problème d'appeler une méthode d'une instance d'une classe située dans un autre thread (On accède à l'instance via un pointeur) ?

C'est correct ou pas ? (Comme ici : Je crée une instance de Sf::RenderWindow dans le thread principal, et je l'utilise dans l'autre thread. Cela ne semble pas poser soucis à petite échelle, mais il y a t-il des choses dont je doit me méfier ? (Au niveau de l'accès aux variables par exemple?)


3
Général / Threads et SFML ?
« le: Juillet 05, 2017, 11:49:36 am »
Bonjour !

J'aimerais écrire un moteur de jeu tile-based pour la SFML, en utilisant cette architecture, centrée sur un "Message Bus". http://www.gamasutra.com/blogs/MichaelKissner/20151027/257369/Writing_a_Game_Engine_from_Scratch__Part_1_Messaging.php

Pour implémenter cela, j'aurais besoin d'une fonction "tick" appelée plusieurs fois par secondes, qui sera utilisé pour "rafraichir" les systèmes. (Leur permettre de lire les messages et d'en poster des nouveaux)

Cette fonction doit tourner le plus de fois possible chaque seconde, indépendamment des FPS. (Pour éviter que le jeu ne soit plus "réactif" sur un écran 144Hz que sur un écran 60hz (VSync activée))

J'ai donc essayé quelque chose : faire 2 Threads, un pour le rendering et un pour le "tick", avec ce code ci : (Je fais des tests pour le moment (pour planifier tout correctement avant de me lancer dans le développement), bien sur ce n'est pas le code du moteur ^^)
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Screen.h"
#include <thread>

using namespace std;

void drawingThread(sf::RenderWindow *window)
{
        while (window->isOpen())
        {
                sf::Event event;
                while (window->pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window->close();
                }
                window->clear(sf::Color::Black);
                window->display();
        }
}

void tick(const sf::RenderWindow *rw)
{
        while(rw->isOpen())
                cout << "Tick!" << endl;
}
int main()
{
        // create the window
        sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
        thread t1(drawingThread, &window);
        thread t2(tick,&window);

        t1.join();
        t2.join();
        cin.get();
        return 0;
}

Cela ne marche pas, j'ai une erreur "Failed to Activate the window context" ou quelque chose comme cela.

J'essaie donc autre chose :Garder le rendering dans le thread principal, et décaler le "tick" dans un autre thread.

#include <SFML/Graphics.hpp>
#include <iostream>
#include "Screen.h"
#include <thread>

using namespace std;


void tick(const sf::RenderWindow *rw)
{
        while(rw->isOpen())
                cout << "Tick!" << endl;
}
int main()
{
        // create the window
        sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
        thread t2(tick,&window);

        t2.join();
        while (window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window.close();
                }
                window.clear(sf::Color::Black);
                window.display();
        }
        cin.get();
        return 0;
}
 

Cela ne marches toujours pas ! Ma fenêtre reste blanche, inanimée..


Je pense que cela est surtout dû à une incompréhension des threads de ma part (et peut être aussi une mauvaise utilisation des pointeurs?) -> le pointeur n'agis pas comme je le pense, et "bloque" l'instance de RenderWindow, mais comment puis-je résoudre cela ? Quelle est la bonne "méthode" à adopter ?

Egalement, j'en profite pour poser une question sur les threads en général. Dans ma classe "MessageBus" j'aurais, probablement, des pointeurs vers les différent systèmes. Et, depuis le thread "tick" je devrais appeler une fonction "refresh" (le tick) dans la classe MessageBus, j'aurais donc un code ressemblant à cela :
#include <vector>
using namespace std;
class GESystem
{
        // La Classe "modèle" pour chaque système, qui permet de faire du polymorphisme.
        //...
        public:
                virtual void tick() = 0;
};
class MessageBus
{
        public:
                vector<GESystem *> sys;
                void refresh()
                {
                        for(int k(0);k<sys.size();k++)
                                sys[k]->tick();
                }
                // Note : Dans cette fonction tous les modules sont rafraichis, sauf le module "Render", qui lui est rafraîchi seulement quand on a besoin d'afficher quelque chose à l'écran (faire le rendu !)
};

// Plus loin dans le code
void tickthread(MessageBus *mb)
{
        while(window.isOpen())
                mb->refresh();
}


(Avec tickthread qui sera la fonction utilisée par le Thread pour appeler la fonction "refresh" sur l'instance de MessageBus (utilisée par le moteur de jeu) le plus de fois possible chaque seconde.)

Cette structure est-elle correcte, et marchera t-elle avec les threads ? Je ne connais pas bien les threads, donc je ne sais pas si cela va poser problème ou pas. Si cela pose problème, comment avoir une architecture saine avec ce genre de prérequis ? (Nécessite d'appeler une fonction sur une instance de MessageBus du thread principal)

D'une manière plus générale : Cela pose problème d'appeler une méthode d'une instance d'une classe située dans un autre thread (On accède à l'instance via un pointeur) ?
(Mon dieu, j'espère que j'explique bien la situation ici xD)


Pour finir, j'ai l'impression que cette architecture est peu adaptée à cette situation, dois-je plutôt essayer de revoir toute mon architecture plutôt que de résoudre ces problèmes ? (Si vous avez d'autres exemples d'architecture, je suis preneur ^^)

Ou alors, méthode simple : Je limite le jeu à, par exemple, 60FPS peu importe la situation, comme cela je fait tout dans la boucle principale. (Note : je n'aime pas cette solution, car cela implique de lier toute la logique du moteur de jeu aux FPS et je ne trouve pas cela "sain", surtout en ce qui concernera les animations..)

EDIT : Dernière question. Est-ce grave si le jeu est plus "réactif" car il tourne à 144hz et pas 60hz ? Je veux dire, est-ce normal ? Les autres moteurs de jeu agissent aussi comme cela ? (La GameLoop est liée aux FPS ?)

Mes explications sont probablement peu claires, je reste donc à votre disposition pour toute question.

Merci :)

4
Ah, mais j'ai aussi besoin d'une fenêtre de texte.. La console ça je sais la coder, pas de soucis, c'est vraiment avoir une fenetre de texte qui pose soucis vu qu'elle doit être réactive et stylisée (avoir un style d'IDE)
Sinon, il y a t-il moyen d'intégrer mon jeu a android studio ou xcode, par un widget par exemple? La j'aurais juste a ajouter un widget textbox qui fera l'affaire.

5
Général / Collisions et Boites de texte (Questions séparées :D )
« le: Octobre 26, 2015, 09:11:27 pm »
Bonjour,

Pour la gestion des collisions dans la SFML dans un side-scroller à génération procédurale + interaction avec l'environnement, le mieux reste Box2D ou de gérer cela "housemade"?

Ensuite, mon jeu nécessitera des boites de texte (Une console et un éditeur de texte), pour cela, j'utilise une intégration à Qt ? Sachant que j'aurais tout  de même besoin d'une mise en forme basique (certains mots en couleurs ou soulignés), je pense que Qt serait mieux, mais je n'ai aucune idée d'ou commencer ou comment cela fonctionne, est ce que je peux continuer à développer avec VS et juste compiler avec le Qt Editor ? Est ce que ma boite de texte pourra être intégrée au jeu (en gros être par dessus la fenêtre) ? Je démarre ou ? ^^

Ensuite, si je désire importer mon jeux sous iOS ou Android, au niveau de Qt cela posera t-il un problème?

Ce que je veux faire, ça se rapproche de cela : http://images.akamai.steamusercontent.com/ugc/487814329875615733/89C0AAE5E1661605A55A155AFA2F6F874C5CF6A6/ (Pas le jeu, l'intégration de la console qui doit apparaitre selon les demandes de l'user)

Un grand merci ! :p

6
Général / Re : Navigateur Web SFML
« le: Juillet 12, 2015, 07:27:27 pm »
Oui désolé ^^
Je pense utiliser Awesomium,mais...
il me donne ça :
Awesomium::BitmapSurface* bitmap = (Awesomium::BitmapSurface*)view->surface();
Et il faut le convertir en sf::Texture pour l'afficher :/

7
Général / Re : Navigateur Web SFML
« le: Juillet 12, 2015, 06:52:13 pm »
Up, je dois vraiment trouver une solution, je suis en train de péter un cable la dessus en ce moment :'(

8
Graphique / Re : Problème avec une rotation
« le: Juillet 12, 2015, 12:26:45 pm »
Oh, miracle ! Merci :)

9
Général / Navigateur Web SFML
« le: Juillet 12, 2015, 11:52:10 am »
Bonjour!



J'ai décidé de me lancer dans un projet, un navigateur Web en Flat design et libre.
Cependant, pour la partie du dessus ça va, mis à part les listes déroulantes et la textbox (et encore) rien ne pose trop de soucis (faire une textbox est relativement simple avec TextEntered il me semble, non?, et la liste déroulante c'est juste une série de sf::shape, la structure sera relativement la même que celle des boutons en somme)

Mais pour l'Engine, je ne sais quoi prendre car j'ai besoin de quelque chose de réactif, qui peut interagir avec l'utilisateur et sourtout que je peux intégrer à la sfml.

J'ai pensé à Awesomium, mais au niveau des événements (clic souri, text entré) comment gérer cela + supporte-t-il tout les types de sites web trouvable sur internet à l'heure actuel (hormis deepweb biensur, ce n'est pas la vocation de mon navigateur) ?

Merci

10
Graphique / Re : Problème avec une rotation
« le: Juillet 12, 2015, 11:46:02 am »
Re, désolé de l'inactivitées j'avais fait une pause dans le projet ^^
button_text.setOrigin((button_text.getLocalBounds().left + button_text.getLocalBounds().width) / 2, (button_text.getLocalBounds().top + button_text.getLocalBounds().height) / 2);//center origin
                                button_shape.setOrigin((button_shape.getLocalBounds().left + button_shape.getLocalBounds().width) / 2, (button_shape.getLocalBounds().top + button_shape.getLocalBounds().height)/2); // "  "
Ceci me donne:
http://prntscr.com/7rq8a9

11
Graphique / Re : Problème avec une rotation
« le: Juillet 02, 2015, 06:49:49 pm »
Oui mais je pense pas que ce me soit super utile ou alors j'ai mal compris ^^
Je veux juste positionner mon Sf::Text au milieu de mon sf::Rectangle ^^

12
Graphique / Re : Problème avec une rotation
« le: Juillet 02, 2015, 06:31:07 pm »
4.3 c'était une valeur qui marchais pour l fontsize = 16.
Et Left/top c'est quoi?

13
Graphique / Re : Problème avec une rotation
« le: Juillet 02, 2015, 06:07:52 pm »
Re
Apres tests, ça marche très bien cette formule..pour une taille de police 16, si l'utilisateur veut changer ça le placement est fichu, je ne trouve pas de formule pour obtenir une valeur correcte et commune :(

14
Graphique / Re : Problème avec une rotation
« le: Juillet 01, 2015, 10:08:40 pm »
button_text.setOrigin(button_text.getLocalBounds().width / 2,button_text.getLocalBounds().height*4.3);//center origin
                                button_shape.setOrigin(button_shape.getLocalBounds().width / 2, button_shape.getLocalBounds().height/2); // "  "

Avec ça, ça marche très bien merci :3

15
Graphique / Problème avec une rotation
« le: Juillet 01, 2015, 09:01:40 pm »
Bonjour !
J'essaie de faire une classe de bouton hérité de drawable, cependant ma fonction update de mon bouton me pose des soucis, car je dois garder le texte à l'intérieur du bouton peut importe la rotation, et je ne comprend pas ce qui ne va pas :
http://pastebin.com/pCBcAKsR
La fonction intéréssante est Update()
        void update()
                        {


                                button_text.setOrigin(button_text.getGlobalBounds().width / 2,button_text.getGlobalBounds().height/2);//center origin
                                button_shape.setOrigin(button_shape.getLocalBounds().width / 2, button_shape.getLocalBounds().height/2); // "  "
                               

                                button_shape.setPosition(getPosition());
                                button_shape.setScale(getScale());
                                button_shape.setRotation(getRotation());

                                button_text.setPosition(button_shape.getPosition());
                                button_text.setRotation(getRotation());
                                button_text.setScale(getScale());
                               
                                cout << "************" << endl;
                                cout << "POS[" << button_shape.getPosition().x << ";" << button_shape.getPosition().y << "];" << endl;
                                cout << "SIZE[" << button_shape.getSize().x << ";" << button_shape.getSize().y << "];" << endl;
                                cout << "************" << endl;
                               
                        }
(avec un petit cout<< pour afficher des info pour débug ^^)

Mais elle ne marche pas, je ne comprend pas, je centre les origines et apres ça devrait aller tout seul non?
Voici un résultat:
http://prntscr.com/7nn4dl
Et avec une rotation,encore pire.
http://prntscr.com/7nn4m3
http://prntscr.com/7nn4qi


Pages: [1] 2 3 ... 8 Suivante »