IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Crash lors de l'appel d'une fonction membre :)


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Crash lors de l'appel d'une fonction membre :)
    Salut j'ai un problème curieux comme on peut avoir en c++ à chaque fois. ^^

    Lorsque je déplace le personnage à la souris pas de problème.
    Mais lorsque je veux le déplacer au clavier j'ai un crash.

    Voici la partie du code ou ça crash :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    for (unsigned int i = 0; i < caracters.size(); i++) {
                Caracter* caracter = static_cast<Caracter*>(caracters[i]);
                if (caracter->isAlive()) {
                    if (caracter->isMoving()) {
                        if (dynamic_cast<Hero*>(caracter) && dynamic_cast<Hero*>(caracter)->isMovingFromKeyboard()) {
                            Vec3f actualPos = Vec3f(caracter->getCenter().x, caracter->getCenter().y, 0);
                            sf::Int64 elapsedTime = caracter->getClkTransfertTime().getElapsedTime().asMicroseconds();
                            Vec3f newPos = caracter->interpolation.first + (caracter->interpolation.second - caracter->interpolation.first) * ((float) elapsedTime / (float) (ping + timeBtwnTwoReq.asMicroseconds()));
                            Ray ray(actualPos, newPos);
                            if (World::collide(caracter, ray)) {
                                newPos = actualPos;
                            }
                            for (unsigned int i = 0; i < getRenderComponentManager().getNbComponents(); i++) {
                                View view = getRenderComponentManager().getRenderComponent(i)->getView();
                                Vec3f d = newPos - view.getPosition();
                                view.move(d.x, d.y, d.y);
                                getRenderComponentManager().getRenderComponent(i)->setView(view);
                            }
                            Vec3f d = newPos - actualPos;
                            World::moveEntity(caracter, d.x, d.y, d.y);
                            getView().move(d.x, d.y, d.y);
                            World::update();
                        } else {
                            Vec3f actualPos (caracter->getCenter().x, caracter->getCenter().y, 0);
                            sf::Int64 elapsedTime = caracter->getClkTransfertTime().getElapsedTime().asMicroseconds();
                            Vec3f newPos = Computer::getPosOnPathFromTime(caracter->interpolation.first, caracter->getPath(),elapsedTime,caracter->getSpeed());
                            Vec3f d = newPos - actualPos;
                            Vec2f dir = d.normalize();
                            if (caracter->isInFightingMode() &&
                                Vec2f(caracter->getCenter().x, caracter->getCenter().y).computeDist(Vec2f(caracter->getFocusedCaracter()->getCenter().x, caracter->getFocusedCaracter()->getCenter().y)) <= caracter->getRange()) {
                                int delta = caracter->getRange() - Vec2f(caracter->getCenter().x, caracter->getCenter().y).computeDist(Vec2f(caracter->getFocusedCaracter()->getCenter().x, caracter->getFocusedCaracter()->getCenter().y));
                                newPos -= dir * delta;
                                d = newPos - actualPos;
                                caracter->setMoving(false);
                            }
                            if (caracter->isMoving() &&
                                caracter->getPath().size() > 1 &&
                                newPos.computeDist(caracter->getPath()[caracter->getPath().size() - 1]) <= PATH_ERROR_MARGIN) {
                                caracter->setMoving(false);
                                newPos = caracter->getPath()[caracter->getPath().size() - 1];
                                d = newPos - actualPos;
                            }
     
                            if (dir != caracter->getDir())
                                caracter->setDir(dir);
                            if (caracter->getId() == hero->getId()) {
                                for (unsigned int i = 0; i < getRenderComponentManager().getNbComponents(); i++) {
                                    if (getRenderComponentManager().getRenderComponent(i) != nullptr) {
                                        View view = getRenderComponentManager().getRenderComponent(i)->getView();
                                        view.move(d.x, d.y, d.y);
                                        getRenderComponentManager().getRenderComponent(i)->setView(view);
                                    }
                                }
                                getView().move(d.x, d.y, d.y);
                            }
                            World::moveEntity(caracter, d.x, d.y, d.y);
                            World::update();
                        }
                    }
    Et voici ce que me donne la pile d'appel du débugueur :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #0 0x805c534	sorrok::MyAppli::onExec(this=0xbffef528) (/home/laurent/Développement/Projets-c++/ODFAEG-CLIENT/application.cpp:695)
    #1 0x808ab7f	odfaeg::core::Application::exec(this=0xbffef528) (/usr/local/include/odfaeg/Core/application.h:91)
    #2 0x8087eca	main(argv=1, argc=0xbffff614) (/home/laurent/Développement/Projets-c++/ODFAEG-CLIENT/main.cpp:18)

    Pourtant je ne fais rien d'autre que ça!
    J'envoie les informations au serveur qui lui me renvoie la position du personnage après l'appui sur la touche.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    void MyAppli::keyHeldDown (sf::Keyboard::Key key) {
            previousKey = actualKey;
            actualKey = key;
            //BoundingRectangle rect (pos.x, pos.y, getView().getSize().x, getView().getSize().y);
            if (actualKey != sf::Keyboard::Key::Unknown && key == sf::Keyboard::Key::Z) {
                if (!hero->isMoving()) {
                    if (actualKey != previousKey) {
                        std::cout<<"actual key : "<<(actualKey != previousKey)<<std::endl;
                        Vec2f dir(0, -1);
                        hero->setDir(dir);
                        sf::Int64 cli_time = Application::getTimeClk().getElapsedTime().asMicroseconds();
                        std::string message = "MOVEFROMKEYBOARD*"+conversionIntString(hero->getId())+"*"+conversionFloatString(dir.x)+"*"+conversionFloatString(dir.y)+"*"+conversionLongString(cli_time);
                        SymEncPacket packet;
                        packet<<message;
                        Network::sendTcpPacket(packet);
                    }
     
                }
            } else if (actualKey != sf::Keyboard::Key::Unknown && key == sf::Keyboard::Key::Q) {
                if (!hero->isMoving()) {
                    if (actualKey != previousKey) {
                        std::cout<<"move from keyboard"<<std::endl;
                        Vec2f dir(-1, 0);
                        hero->setDir(dir);
                        sf::Int64 cli_time = Application::getTimeClk().getElapsedTime().asMicroseconds();
                        std::string message = "MOVEFROMKEYBOARD*"+conversionIntString(hero->getId())+"*"+conversionFloatString(dir.x)+"*"+conversionFloatString(dir.y)+"*"+conversionLongString(cli_time);
                        SymEncPacket packet;
                        packet<<message;
                        Network::sendTcpPacket(packet);
                    }
                }
            } else if (actualKey != sf::Keyboard::Key::Unknown && actualKey == sf::Keyboard::Key::S) {
                if (!hero->isMoving()) {
                    if (actualKey != previousKey) {
                        std::cout<<"actual key : "<<(actualKey != previousKey)<<std::endl;
                        Vec2f dir(0, 1);
                        hero->setDir(dir);
                        sf::Int64 cli_time = Application::getTimeClk().getElapsedTime().asMicroseconds();
                        std::string message = "MOVEFROMKEYBOARD*"+conversionIntString(hero->getId())+"*"+conversionFloatString(dir.x)+"*"+conversionFloatString(dir.y)+"*"+conversionLongString(cli_time);
                        SymEncPacket packet;
                        packet<<message;
                        Network::sendTcpPacket(packet);
                    }
                }
            } else if (actualKey != sf::Keyboard::Key::Unknown && key == sf::Keyboard::Key::D) {
                if (!hero->isMoving()) {
                    if (actualKey != previousKey) {
                        std::cout<<"move from keyboard"<<std::endl;
                        Vec2f dir(1, 0);
                        hero->setDir(dir);
                        sf::Int64 cli_time = Application::getTimeClk().getElapsedTime().asMicroseconds();
                        std::string message = "MOVEFROMKEYBOARD*"+conversionIntString(hero->getId())+"*"+conversionFloatString(dir.x)+"*"+conversionFloatString(dir.y)+"*"+conversionLongString(cli_time);
                        SymEncPacket packet;
                        packet<<message;
                        Network::sendTcpPacket(packet);
                    }
                }
            }
        }

    PS : je met à jour le code sur le dépôt git maintenant que j'ai réussi à corriger pas mal de bugs, j'y ai passé des nuits car il faut vraiment que j'avance dans la création de mon jeux j'avais laissé tombé pendant une longue période et puis j'ai envie d'être game master!

    J'ai tout essayé, unity, java, c++, etc..., mais à chaque fois il y a des bugs.

    Je ne sais pas comment elles font les grosses sociétés de jeux ou alors elles créent leur propre compilateur.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Elles utilisent deux concepts qui n'a rien à voir avec le langage: la rigueur et la planification.

    Connaître le langage ne suffit pas pour savoir s'en servir (ce n'est pas parce que tu as tous les outils requis et de l'acier à volonté que tu construiras une bonne voiture)
    Savoir ce que tu vas faire et pourquoi avant de commencer, jusque dans les moindres détails permet de ne pas avoir de bug.

    Par ailleurs, beaucoup de jeux ont des bugs (malheureusement)
    Et la majorité des "grands" jeux sont développés par des équipes qui sont forcées de discuter, de défendre leurs idées.

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'ai trouvé pourquoi, j'ai oublié de testé si le composant retourné n'était pas null, car, getRenderComponent peut renvoyer null.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. IE7 lors de l'appel d'une fonction JS
    Par foued_scorpion dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/04/2007, 14h19
  2. Réponses: 3
    Dernier message: 13/12/2006, 16h01
  3. Créer un tableau lors de l'appel d'une fonction
    Par MiJack dans le forum Langage
    Réponses: 11
    Dernier message: 01/02/2006, 11h18
  4. Réponses: 2
    Dernier message: 09/01/2006, 09h38
  5. Réponses: 5
    Dernier message: 06/01/2006, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo