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 :
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
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(); } }
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.
Partager