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.


Sujets - MyPix

Pages: [1] 2 Suivante »
1
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 :)

2
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

3
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

4
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


5
Graphique / Ombre
« le: Juin 30, 2015, 03:07:22 pm »
Bonjour,

Je développe une petite bibliothèque pour la SFML, mais j'aimerais avoir une ombre diffuse derriere ou à l'interieur de la forme, comme cela :
http://prntscr.com/7n3lya
(Dans l'ordre : Sans Ombre, Ombre porté,Ombre interne)
Mais est ce possible avec la SFML ?

Pour l'ombre portée j'ai une idée de solution barbare, ce serait de dupliquer ma forme, la mettre tout en noir avec une opacité de +- 40% / 50% et d'y appliquer un flou (gaussien?).
Pour l'ombre interne, aucune idée par contre.

La réponse résiderais t-elle dans un shader ?

Merci

6
Graphique / Optimiser l'affichage de tiles
« le: Mai 13, 2015, 02:00:55 pm »
Bonjour,

J'aimerais créer un jeu qui s'inspire de Wakfu, en gros le décor bouge selon le personnage (la caméra reste centrée sur le personnage) mais si le monde est très grand (bien que je peux faire des "district" dans le monde pour éviter d'avoir trop de map à la suite) j'ai peur que l'appel de l'affichage des tiles (draw) de chaque map (sur plusieurs calques parfois selon le type de map) soit trop  gourmand en ressources sachant que c'est des textures de +- 150*150 et que mes maps sont composé de 16x16 tiles.
Donc un petit calcul, imaginons un grand monde de 20*20 cartes, donc 400 cartes, chacune ayant 256 tiles ça fait 100 000+ d'appels par CALQUE à afficher chaque FRAME.. beaucoup beaucoup n'est ce pas.

Donc j'aimerais optimiser cela.
Pour cela j'ai plusieurs idées :
N'afficher que les maps qui sont autour du joueur. ça peut être facile (je ne sais pas vraiment enfait) à réaliser comme difficile vu que chaque tick je devrait prendre la position du joueur et vérifier si il se trouve sur une tile d'une map (donc 100 000 vérification chaque seconde ou moins selon le point de départ de la vérification), sauf si vous avez une idée c'est pas ergonomique.

N'afficher que les TILES visible par la caméra, en prenant leur position et en vérifiant si elle est à l'intérieur du rectangle de la caméra, je pense que c'est le mieux à faire mais j'aimerais des avis de pro ^^

Au niveau de ma map, c'est une classe qui est hérité de Drawable et Transformable et qui dessine chacune les tiles qui lui sont propres (comme ça la SFML gère tout si je dois déplacer/tourner ma map :) ) (Matrice des tiles étant récupérées d'un fichier JSON mais je vais pas détailler, car cela est chargé en mémoire lors du chargement initial du jeu)

Merci :)

7
Graphique / Access violation
« le: Décembre 03, 2014, 03:59:45 pm »
Bonjour,

J'essaye de faire un petit jeu,j'ai donc crée une classe qui gère les boutons, mais quand j'emploie cette fonction
sf::RectangleShape rect;
sf::Text text;
SFButton::SFButton(std::string buttontext,float posx,float posy,float sizex,float sizey,float fontSize,sf::Font font)
{
        rect.setSize(sf::Vector2f(sizex,sizey));
        rect.setPosition(sf::Vector2f(posx, posy));
        rect.setFillColor(sf::Color::White);
        rect.setOutlineColor(sf::Color::White);

        text.setString(sf::String(buttontext));
        text.setPosition(sf::Vector2f((posx + 20),(posy + 20)));
        text.setCharacterSize(fontSize);
        text.setColor(sf::Color::Black);
        text.setFont(font);
}
// Fonction appelée comme cela :
        SFButton button("Salut", 300, 300, 200, 133, 16, font);
*runloop*
                button.updateButton(window);
                button.handleEvent(ispress, event, window);
                button.drawButton(window);
 
Plus précisément le bout de code
        text.setFont(font);
 

Me provoque cette erreur http://prntscr.com/5csk3v
Jamais vu ça, le .ttf fonctionne très bien ailleur ! WTF ?

8
Graphique / Menu bar natif ?
« le: Décembre 03, 2014, 08:48:41 am »
Bonjour
Dans une RenderWindow, est ce que je peux ajouter une menubar (File, Edit,..) avec dedans quelques menus simples mais avec le style natif de windows ?
Sinon, comment faire ça ? Il y a t-il une bibliotheque que je peux utiliser avec la sfml pour obtenir ce résultat ?

9
Graphique / Tiles ? - Physique et Positionement
« le: Décembre 01, 2014, 08:13:15 am »
Bonjour,
J'aimerais créer un jeu, mais au niveau de la création des cartes, je suis perdu, comment faire pour faire en sorte que le joueur rentre en collision avec le sol sans problème ? Et comment justement faire mes maps, quels sont les meilleures techniques ? Map dans un PNG (avec plusieurs fichiers par exemple comme plateforme, ciel,destructible,..) ? Tiling ? Comment intégrer ça avec Box2D ? Et également, le positionement des objets est relatif à la vue non (car la vue sera centrée sur le joueur, comme dans Starbound par exemple)

Bref, je sais que c'est beaucoup de questions, je recherche juste un bon tuto expliquant comment procédé à tout ça ^^ car ce que je recherche surtout c'est un moyen propre et efficace de réaliser ça
En bref :
- Quelle est la meilleure technique de création et gestion de map et tout ce qui va avec (Mouvement, Physique,Coordonées..)
- Comment positionner des objets (par exemple un autre joueur) indépendament de la caméra, si je me trompe pas le positionement est relatif à la caméra*

Merci ^^

*Pour résumer, si je place un objet en 0;0 et qu'apres je déplace la vue de 10px et que je replace un objet au mêmes coordonées, il sera déplacé de 10px non ?

10
Réseau / Multijoueur ?
« le: Novembre 30, 2014, 12:21:21 am »
Bonjour,

J'aimerais savoir, comment je procède pour faire un jeu multijoueur en temps réel, (pvp) en gros, j'ai besoin d'avoir
- La position absolue du joueur dans la map (car la vue est centrée sur le joueur, si il est en dehors de la vue je dois le savoir (d'ailleur comment je fais ça ? Si la vue est centrée sur le joueur , les coordonées du rendu sont aussi déplacées non ?))
- si il fait une action, sur qui et quoi (par exemple "xxFaze420 lance Boomerang sur xxDylan")
- Si il envoie un message dans le chat, si oui quoi ("t 1 hacker je te signal" :D)
En gros, Un Vector, des ints et des strings

11
Général / Erreur DLL
« le: Novembre 29, 2014, 05:33:57 pm »
Bonjour, en essayant de faire démarrer mon programme SFML basé sur le Pattern Gamestate j'ai cette erreur
http://prntscr.com/5beeeo
Vous savez d'ou ça peut venir et ou je dois télécharger la dll fautive ?

12
Général / Linked objet error
« le: Novembre 29, 2014, 11:46:03 am »
Bonjour,

Je recontre cette erreur en tentant d'installer la sfml sur VSE
http://prntscr.com/5bbcc3
Pourtant j'ai bien fait le setup.. d'ou cela peut venir ?

13
Graphique / Gestion de résolutions dans le menu
« le: Février 18, 2014, 08:10:53 pm »
Bonjour,

comment implémenter un menu de gestion des résolutions ?
J'entend par la :
- Lorsque l'on change la résolution, toute la scene se décale pour faire cette résolution la


Merci

14
Graphique / Créer une textBox
« le: Février 17, 2014, 09:15:46 pm »
Bonjour,

comment créer simplement et efficacement une textbox sur la SFML ?
J'entend par la : Faire en sorte que l'on ne voit le texte QUE dans la zone de la textbox et récupérer TOUTES les entrées utilisateurs

15
Graphique / Chargement des ressources multi-threadé ne s'affiche pas.
« le: Février 16, 2014, 11:26:21 am »
Bonjour,

Je charge mes ressources via multi-thread, mais le Sprite est vide, rien s'affiche, pourtant je n'ai pas d'erreur lors du chargement...
Je ne comprend pas... voici le thread qui charge le code,et la fonction qui l'utilise (J'utilise le pattern Gamestate ;) )

void loadFiles (int &rtr)
{
    thread_mutex.lock();
   
   
    if(val.ld_bar_txt.loadFromFile(resourcePath()+"LC_LOAD.png")
       &&
       val.main_title_tex->loadFromFile(resourcePath() + "main_title.png")
   
       )
    {
        tex=true;
    }
    // Musics
    msc=true; // je n'ai rien à charger pour le moment

    // If musics & Textures loaded Successfully :
    if(msc && tex)
    {
        cout << "Sound :" << msc << endl << "Textures" << tex << endl;
        cout << "Game ressources successfully loaded " << endl;
        rtr=1;
    }
    // If not :
    else
    {
        cout << "Sound :" << msc << endl << "Textures" << tex << endl;
        cout << "Game will quit : [GRAVE] CANNOT LOAD MUSICS OR TEXTURES " << endl;
        rtr=-1;
    }
   
    thread_mutex.unlock();
    load_finish=true;
}

void CGmenu::Init()
{

    if(!menu_music.openFromFile(resourcePath() + "PIXL_Rat_Twist.ogg"))
    {
        cout << "Error while loading music" << endl;
        exit(-1);
    }
    //rsc->main_title_tex->loadFromFile(resourcePath() + "main_title.png");
    main_title.setTexture(*rsc->main_title_tex);
    main_title.setPosition(50,50);
   // main_title.setScale(0.4,0.4);
   
   
    menu_music.play();
    menu_music.setVolume(70);
    menu_music.setLoop(1);
   
    cop.setString(L"© Pixel Box Inc 2014");
    cop.setFont(Fonts.m_pixel7);
    cop.setPosition(1000,665);
    cop.setStyle(sf::Text::Italic);
    cop.setColor(sf::Color::White);
    cop.setCharacterSize(40);
   
    play.setFont(Fonts.m_pixel7);
    play.setPosition(125,175);
    play.setStyle(sf::Text::Italic);
    play.setColor(sf::Color::White);
    play.setCharacterSize(60);
    play.setString("_Play");
   
    play_bound = play.getGlobalBounds();
   
   
    cout << "Fonts are Okay" << endl;
}

Les 2 codes sont dans des classes différentes.

HELP :(

Pages: [1] 2 Suivante »
anything