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

Pages: [1]
1
Général / Re : Physique de saut
« le: Avril 08, 2016, 10:30:20 am »
Ah oui effectivement, le sujet est donc résolu, je vous remercie pour votre aide.

2
Général / Re : Physique de saut
« le: Avril 07, 2016, 10:43:55 pm »
Au sujet du visuel je suis d'accord donc rien que pour ça je vais procéder comme tu me l'a dit merci, mais pourrait-tu me dire ce que ça change au niveau de la portabilité ? Je pensais que "\\" ce qui équivaut à "\" c'était pareil que "/"

3
Général / Re : Physique de saut
« le: Avril 07, 2016, 04:57:14 pm »
Oui c'est sûr que ça aurait été moins compliqué mais je voulais mettre en oeuvre la loi de Newton :p

4
Général / Re : Physique de saut
« le: Avril 07, 2016, 04:43:24 pm »
Ah oui je vois merci du coup je dois simplement ajouter la position de départ (t = 0) du saut à chaque fois !
En faite c'est comme si le saut recommencé à chaque fois du coup.

Ça fonctionne parfaitement, merci beaucoup pour votre aide !

Oui c'est pour un jeu de plateforme.


Voici le code final pour ceux qui aurait le même soucis :

void Game::play()
{
        gState = GAME_STATE::G_RUNNING;
       
        Map map;
        map.load(".\\Data\\Map\\level.map", "tile");

        Character player(sf::Vector2f(0, 0), "player");
        player.setCenter();

        float v_init = 2;
        float angle_init = Utils::pi/3;
        float t = 0;

        sf::Vector2f lastPos = player.getPosition();

        while (getWindow().isOpen() && gState == GAME_STATE::G_RUNNING)
        {
                sf::Event event;
                while (getWindow().pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                getWindow().close();
                }

                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                {
                        gState = GAME_STATE::G_PAUSED;
                        break;
                }
                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                {
                        getView().move(3, 0);
                }

                sf::Vector2f jump, newPos;

                jump.x = cos(angle_init) * v_init * t;
                jump.y = -(-Utils::g*pow(t, 2)/2000 + v_init*sin(angle_init)*t);


                newPos = lastPos + jump;

                player.setPosition(newPos);
                t += 10;


                getWindow().clear(sf::Color::Black);

                getWindow().setView(getView());
                getWindow().draw(map);

                getWindow().setView(getWindow().getDefaultView());
                getWindow().draw(player);

                getWindow().display();
        }
}
 

5
Général / Re : Structure d'un projet
« le: Avril 07, 2016, 04:42:02 pm »
Salut à toi,

il n'y a pas vraiment de modèle fixe, tu es libre de gérer ton projet selon tes besoins et de façon à ce que le développement de ton projet soit le plus rapide et simple possible.

Moi je développe un petit jeu en 2D et au niveau de la structure j'ai fait en sorte de pouvoir modifier facilement chaque composants et ainsi garder cette base pour d'autres jeux, sans pour autant modifier la totalité du code.

Tu peux découper ton code en différents modules qui constituent chacun une partie du programme.
Par exemple toujours pou un jeu moi j'ai opté pour :

Une classe "Game" : Elle se charger de créer la fenêtre, de gérer la view, d'afficher le menu, de lancer une partie ect....

Une classe "Map" : Elle se charge de générer une map en fonction d'un fichier map et d'une texture.

Une classe "Character" : C'est la classe qui permet de gérer les personnages, jouable ou non, soumis ou non à la gravité ect...

Une classe CharacterAnimate: Elle se charge de gérer les animations de la classe Character (courir, marcher ect...)

J'ai aussi des classes qui me permettent de gérer la création de textures et de polices sans doublons ect...

Je t'ai donné ma façon de faire mais ce n'est pas la meilleurs, il est toujours possible d'améliorer pour rendre le programme encore plus dynamique, ce qu'il faut c'est que tu sois à l'aise dans le développement de ton code, que ce soit un maximum intuitif et dynamique pour éviter d'écrire 50 fois la même lignes si tu peux concentrer ça dans une classe.

Si tu veux encore d'autres informations tu peux regarder sur google: "UML Game 2D" par exemple, si tu fais un jeux sinon tu adapte ta recherche.

Tu verras des exemples pour structurer une application.

6
Général / Re : Physique de saut
« le: Avril 07, 2016, 04:27:03 pm »
Oui j'ai bien compris mais quand mon personnage saute il se trouve à des coordonnées x,y dans mon monde 2D et donc les positions du sauts calculées doivent être ajoutées aux positions pour que le saut soit dans la continuité du mouvement non ?

Pour preuve, si je fais setPosition(jump), mon personnage fait bien l'hyperbole mais en partant de 0,0 vu que je calcule les coordonnées du saut sans me baser sur sa position, tandis que si j'y ajoute la position actuelle le saut se fait en partant de là ou il a commencé.



7
Général / Re : Physique de saut
« le: Avril 07, 2016, 03:10:37 pm »
Je ne comprends pas trop là, je dois obligatoirement ajouter la position actuelle en plus de celle du saut, sinon là mon sprite commence son saut aux coordonnées 0;0, il ne prends pas en compte le placement avant le saut.

8
Général / Re : Physique de saut
« le: Avril 07, 2016, 02:31:10 pm »
g = 9.81

Sinon oui pour le fait que ça descend je n'ai pas édité mon code mais j'avais simplement ajouter "-" devant jump.y vu que c'est inversé.

void Game::play()
{
        gState = GAME_STATE::G_RUNNING;
       
        Map map;
        map.load(".\\Data\\Map\\level.map", "tile");

        Character player(sf::Vector2f(0, 0), "player");
        player.setCenter();

        float v_init = 0.15;
        int angle_init = Utils::pi/3;
        float t = 0;

        while (getWindow().isOpen() && gState == GAME_STATE::G_RUNNING)
        {
                sf::Event event;
                while (getWindow().pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                getWindow().close();
                }

                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                {
                        gState = GAME_STATE::G_PAUSED;
                        break;
                }
                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                {
                        getView().move(3, 0);
                }

                sf::Vector2f jump, lastPos, newPos;

                jump.x = cos(angle_init) * v_init * t;
                jump.y = -(-Utils::g*pow(t, 2)/2000 + v_init*sin(angle_init)*t);

                lastPos = player.getPosition();

                newPos = lastPos + jump;
                player.setPosition(newPos);
                t += 0.2;


                getWindow().clear(sf::Color::Black);

                getWindow().setView(getView());
                getWindow().draw(map);

                getWindow().setView(getWindow().getDefaultView());
                getWindow().draw(player);

                getWindow().display();
        }
}
 

Voici le code modifié, ou je déplace le sprite avec setPosition mais plus la vue.
Ça fait bien une parabole depuis que j'ai diminué la vitesse initiale à 0.15 et t avec une incrémentation de 0.2.

Ce qui me pose maintenant soucis c'est que j'aimerais bien savoir comment avoir mathématiquement la bonne valeur de t et de v_init, sans faire ça au pif x)

9
Général / Re : Physique de saut
« le: Avril 07, 2016, 01:32:48 pm »
J'ai essayé en déplacement le sprite avec setPosition mais le soucis reste le même.
Ca vient surement de mes paramètres utilisés dans la formule mais je trouve pas.

10
Général / Re : Physique de saut
« le: Avril 07, 2016, 01:17:11 pm »
J'ai mis le framerate à 60 avec la méthode de RenderWindow, du coup j'ai essayé de mettre 1/60 = 0.016 mais c'est pareil.


11
Général / Physique de saut
« le: Avril 07, 2016, 11:58:51 am »
Salut à tous, je viens vers vous car comme mon titre l'indique j'ai un soucis avec la physique d'un saut 2D.
J'aime bien comprendre quand j'utilise quelques choses donc j'ai commencé à me remémorer mes cours sur la loi de newton.

https://www.kartable.fr/terminale-s/physique-chimie/specifique/chapitres-33/applications-des-lois-de-newton/cours/applications-des-lois-de-newton/22620

Dans ce cours, pour les équations horaires du mouvement on obtient ce système :

OG⎯→{ x(t)=0
          {  y(t)=v0⋅cos(α)⋅t
          { z(t)=−12⋅g⋅t2+v0⋅sin(α)⋅t


Dans le jeu la fonction y(t) correspond à l'axe x et z(t) correspond à l'axe y.
J'ai donc simuler un petit saut, voici le code:

void Game::play()
{
        gState = GAME_STATE::G_RUNNING;
       
        Map map;
        map.load(".\\Data\\Map\\level.map", "tile");

        Character player(sf::Vector2f(0, 0), "player");
        player.setCenter();

        int v_init = 2;
        int angle_init = Utils::pi / 3;
        float t = 0;


        while (getWindow().isOpen() && gState == GAME_STATE::G_RUNNING)
        {
                sf::Event event;
                while (getWindow().pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                getWindow().close();
                }

                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                {
                        gState = GAME_STATE::G_PAUSED;
                        break;
                }
                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                {
                        getView().move(3, 0);
                }

                sf::Vector2f jump;

                jump.x = cos(angle_init) * v_init * t;
                jump.y = -0.5 * Utils::g*pow(t, 2) + v_init*sin(angle_init)*t;

                getView().move(jump);
                t += 0.001;


                getWindow().clear(sf::Color::Black);

                getWindow().setView(getView());
                getWindow().draw(map);

                getWindow().setView(getWindow().getDefaultView());
                getWindow().draw(player);

                getWindow().display();
        }
}

Le soucis c'est que mon personnage monte bien mais il ne redescend jamais ou alors il redescendra dans quelques décennie.

Je ne vois pas trop d'ou peut venir ce soucis, j'ai mis l'incrémentation de t avec des valeurs très petite pour avoir le temps de bien voir la trajectoire.

Si quelqu'un pourrait m'aiguiller sur ce sujet, merci d'avance !

12
Fenêtrage / Re : Étrange soucis avec la vue
« le: Avril 06, 2016, 09:42:18 pm »
Résolu, autant pour moi le soucis c'est que je mettais mes conditions pour le clavier dans la boucle d’événements.

13
Fenêtrage / Étrange soucis avec la vue
« le: Avril 06, 2016, 09:37:43 pm »
Salut à tous, je suis nouveau sur ce forum.

Je connais SFML depuis quelques temps et là j'ai décidé de m'y lancer à nouveau.
Je fais un petit jeu 2D et j'utilise donc la classe View pour déplacer ma map.

Le soucis que je rencontre est assez étrange, lorsque l'utilisateur appuie sur la flèche droite du clavier la vue se déplace de 3 sur l'axe X mais ce déplacement est accélérer lorsque je déplace ma souris dans la fenêtre.

Pourtant à aucun moment dans mes événements j'utilise le déplacement de la souris pour faire quoi que ce soit.

Voici le code en question:

void Game::play()
{
        gState = GAME_STATE::G_RUNNING;
       
        Map map;
        map.load(".\\Data\\Map\\level.map", "tile");

        Character player(sf::Vector2f(0, 0), "player");
        player.setCenter();

        while (getWindow().isOpen() && gState == GAME_STATE::G_RUNNING)
        {
                sf::Event event;
                while (getWindow().pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                getWindow().close();

                        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                        {
                                gState = GAME_STATE::G_PAUSED;
                                break;
                        }
                       
                        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                        {
                                getView().move(3, 0);
                        }
                }

                getWindow().clear(sf::Color::Black);

                getWindow().setView(getView());
                getWindow().draw(map);

                getWindow().setView(getWindow().getDefaultView());
                getWindow().draw(player);

                getWindow().display();
        }
}

Si quelqu'un souhaite voir le soucis je peux envoyer l’exécutable.

Pages: [1]