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

Auteur Sujet: Freeze  (Lu 2230 fois)

0 Membres et 1 Invité sur ce sujet

yhu420

  • Jr. Member
  • **
  • Messages: 75
    • Voir le profil
    • E-mail
Freeze
« le: Octobre 17, 2013, 01:38:28 pm »
Bonjour tout le monde,
J'ai enfin réussi à installer SFML (mais ça a été dur), et j'ai découvert avec consternation que pour trouver un bon tuto complet sur SFML c'est coton. Donc j'ai commencé à essayer de comprendre comment marchait l'exemple de pong et essayé de bidouiller un peu, sauf que là,  gros freeze dès que je touche à quelque chose!
Je sais que c'est dans les règles du forum de pas faire des messages trop longs mais là je vois vraiment pas où est l'erreur donc je vous met tout le code, désolé  :-\

#include <SFML/Graphics.hpp>
#include <iostream>

#define NEXTTOMENU (selecter.getPosition().y == 20.f) || (selecter.getPosition().y == 50.f) || (selecter.getPosition().y == 100)

int main()
{
        //Declare variables
        int frames = 0;
    sf::RenderWindow window(sf::VideoMode(500, 500), "SFML works!");
        std::vector<sf::CircleShape> pos(3);
        std::vector<sf::RectangleShape> txt(3);

        pos[0].setPosition(30,20);
        pos[1].setPosition(30,50);
        pos[2].setPosition(30,100);

        for(int i=0;i<3;i++)
        {
                pos[i].setRadius(2);
                pos[i].setFillColor(sf::Color(200,200,100));
                txt[i].setSize(sf::Vector2f(100,25));
                txt[i].setFillColor(sf::Color(100,100,200));
                txt[i].setPosition(pos[i].getPosition().x +5, pos[i].getPosition().y);
        }

        sf::RectangleShape selecter;
        selecter.setSize(sf::Vector2f(30,30));
        selecter.setPosition(pos[1].getPosition().x -10.f,pos[1].getPosition().y);

        sf::Clock clock;

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
                //Here we go!

                short menuSelected=1;
                float deltaTime = clock.restart().asSeconds();
                const float selecterSpeed = 400.f;

                //If the selecter is next to a menu
                if(NEXTTOMENU)
                {

                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up) && (menuSelected != 0) )
                {
                        while((selecter.getPosition().y != 50.f)||(selecter.getPosition().y != 20.f))
                        {
                                selecter.move(0.f, -selecterSpeed * deltaTime);
                        }
                        menuSelected--;
                        std::cout << "pressin'up\n";
                        std:: cout << "menuselected= " << menuSelected;
                }

                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down) && (menuSelected != 2))
                {
                        while((selecter.getPosition().y != 50.f)||(selecter.getPosition().y != 100.f))
                        {
                                selecter.move(0.f, selecterSpeed * deltaTime);
                        }
                        menuSelected++;
                        std::cout << "Pressin'down\n";
                        std::cout << "menuselected= " << menuSelected;
                }
                }

                window.clear(sf::Color(50, 200, 50));

                for(int i=0;i<3;i++)
                {
                        window.draw(pos[i]);
                        window.draw(txt[i]);
                }
                                       
                window.draw(selecter);

                window.display();

                frames++;
                std::cout << "Displayed " << frames << std::endl;
    }

        return EXIT_SUCCESS;
}
 

La console affiche le nombre de frames correctement jusqu'à ce que j'appuie sur haut ou bas, où tout s'arrete..

Merci pour vos réponses..

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Freeze
« Réponse #1 le: Octobre 17, 2013, 01:47:39 pm »
Citer
j'ai découvert avec consternation que pour trouver un bon tuto complet sur SFML c'est coton
Sérieusement ?

Citer
Je sais que c'est dans les règles du forum de pas faire des messages trop longs mais là je vois vraiment pas où est l'erreur
C'est pas très compliqué à debugger. Tu peux faire une exécution pas à pas avec ton debugger, ou mettre des "cout << blop" un peu partout jusqu'à ce que tu trouves la ligne de code qui stoppe ton programme.

Et tu serais tombé là :
while((selecter.getPosition().y != 50.f)||(selecter.getPosition().y != 20.f))

Tu penses vraiment que la position de ton entité va être très exactement 50 ou 20 ? Et pas 50.0001 ou 19.9999 par exemple ? ;)

Ensuite ta condition n'a aucun sens : "tant que Y est différent de 50 ou Y est différent de 20". Comme Y ne pourra vraissemblablement jamais valoir à la fois 50 et 20, cette condition sera vraie quoiqu'il arrive.
Laurent Gomila - SFML developer

yhu420

  • Jr. Member
  • **
  • Messages: 75
    • Voir le profil
    • E-mail
Re : Freeze
« Réponse #2 le: Octobre 17, 2013, 05:46:07 pm »
Pour ce qui est du tuto, ok c'est un tuto, mais je veux dire c'est pas en lisant ça que tu vas savoir faire ton jeu/app, ce qui faut c'est des TP, des exemples d'utilisation courants, et un objectif à atteindre à la fin du cours, mais bon là, c'est pas le sujet..

J'ai un peu modifié mon code, et j'ai trouvé d'où venait l'erreur:
       
bool IsmoreorlessnexttoY(sf::RectangleShape &ent1, sf::RectangleShape &ent2, float margin = 1.f)
{
        return ((ent1.getPosition().y - ent2.getPosition().y < margin) && (ent1.getPosition().y - ent2.getPosition().y > -margin));
}
               
while(!IsmoreorlessnexttoY(selecter,txt[1]) || !IsmoreorlessnexttoY(selecter,txt[2]))
                        {
                                selecter.move(0.f, selecterSpeed * deltaTime);
                                std::cout << "selecter*delta: " << selecterSpeed * deltaTime << std::endl;
                        }

Et en fait le selecter ne move pas du tout, donc la boucle est infinie,  selecterSpeed * deltaTime = entre 1,8 et 2,2

Qu'ai-je fait de mal?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Freeze
« Réponse #3 le: Octobre 17, 2013, 06:08:53 pm »
Citer
Pour ce qui est du tuto, ok c'est un tuto, mais je veux dire c'est pas en lisant ça que tu vas savoir faire ton jeu/app, ce qui faut c'est des TP, des exemples d'utilisation courants, et un objectif à atteindre à la fin du cours, mais bon là, c'est pas le sujet..
Dans ce cas il faut parler de tutoriel de création de jeu, pas de tutoriel sur SFML ;)

Note qu'il y a un livre qui traite très exactement de ce sujet, si ça t'intéresse (cf. le site web, rubrique "Ressources").

Citer
Et en fait le selecter ne move pas du tout, donc la boucle est infinie,  selecterSpeed * deltaTime = entre 1,8 et 2,2
Ta condition est toujours incorrecte : selecter.y ne pourra jamais être à la fois proche de txt[1] et de txt[2] (sauf s'ils sont presque égaux), donc tu ne pourras jamais sortir de ta boucle. Ensuite à quoi sert-elle ? Autant faire directement un selecter.setPosition(..., txt[1]) par exemple. Il faut bien comprendre que tant que tu es à l'intérieur de la boucle, ton application ne vit plus : plus de gestion d'évènement, d'affichage, etc... donc ça ne sert à rien de rester bloquer dedans à faire des choses qui de toute façon ne seront pas visibles tant que tu n'en seras pas sorti.
Laurent Gomila - SFML developer

yhu420

  • Jr. Member
  • **
  • Messages: 75
    • Voir le profil
    • E-mail
Re : Freeze
« Réponse #4 le: Octobre 17, 2013, 07:55:24 pm »
Je veux pas faire ça, je voudrais que selecter monte et descende jusqu'à un certain point sans qu'on puisse interférer. De toute facon je pense que vais reprendre tout mon code depuis le début en essayant une autre structure parce qu'avec du recul c'est vraiment très mauvais, mais bon faut bien débuter quelque part.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Freeze
« Réponse #5 le: Octobre 17, 2013, 09:11:59 pm »
En effet, la programmation c'est un éternel recommencement ;)

Même si on ne doit pas pouvoir interférer, il ne faut pas pour autant bloquer ta boucle principale. Il faut que la logique de haut niveau continue à se dérouler, si quelque chose doit bouger ou ne pas réagir au clavier alors il faut le gérer via un état particulier (concrètement : par exemple un booléen isMoving, et tant qu'il est vrai alors d'une part tu déplaces ton entité vers sa destination et d'autre part tu ignores les évènements claviers).
Laurent Gomila - SFML developer