Notez que l'ordre peut aller dans un sens ou dans l'autre (effacer d'abord puis repousser, juste que cette façon ne nécessite pas de créer une référence locale à l'objet) .Repousser l'objet, puis l'effacer à son emplacement précédent dans std :: list
for (GameObjItr gameObj = m_gameObjects.begin();
gameObj != m_gameObjects.end(); gameObj++) {
if (*gameObj && *gameObj != gameObject) {
const sf::FloatRect &otherObj = (*gameObj)->GetCollisionBox();
if(mainObj.Intersects(otherObj)) {
m_gameObjects.splice(m_gameObjects.end(), m_gameObjects, gameObj);
return m_gameObjects.back();
}
}
}
return NULL;
}
L'idée est que si la fonction trouve un objet entrant en collision avec l'objet passé, il ajoute cet objet à la fin de la liste, l'efface de sa position actuelle, puis retourne l'objet. Je ne pense pas que l'invalidation de l'itérateur soit un problème puisque je reviens immédiatement après l'effacement?
Le code provoque le blocage du programme.
P.S. cppreference dit qu'effacer "supprime" l'objet, mais j'ai supposé que cela l'a juste enlevé de la liste. (Si cela est faux, comment puis-je supprimer un élément par son emplacement La fonction de suppression doc que je suis en train de lire ne permet que de passer la valeur de l'objet). Editer: L'emplacement de l'accident n'est pas toujours le même, mais il se produit à cause de ce code (c'est-à-dire si je le rétablis, il agit normalement). Quelles sont les causes d'un accident retardé de manière variable? Je ne veux pas que l'objet trouvé soit détruit.
GameObject* GameObjectManager::DetectCollision(const GameObject *
gameObject) {
const sf::FloatRect &mainObj = gameObject->GetCollisionBox();
for (GameObjItr gameObj = m_gameObjects.begin();
gameObj != m_gameObjects.end(); gameObj++) {
if (*gameObj && *gameObj != gameObject) {
const sf::FloatRect &otherObj = (*gameObj)->GetCollisionBox();
if(mainObj.Intersects(otherObj)) {
m_gameObjects.splice(m_gameObjects.end(), m_gameObjects, gameObj); //<--------
return m_gameObjects.back(); //<-------------
}
}
}
return NULL;
}
Modifier Trouvé le bogue, lors du déplacement de l'objet à la fin de la liste, causé boucle infinie entre 2 GameObjects en collision. Désolé, impossible de déchiffrer le code affiché.
S'il s'agit d'une 'std :: liste', vous devriez pouvoir appeler' splice() 'pour déplacer le noeud de son emplacement actuel à la fin de la liste, plutôt que de copier l'élément et de l'effacer de son emplacement d'origine. –
m_gameObjects.splice (m_gameObjects.end(), m_gameObjects, gameObj); return m_gameObjects.back(); semble toujours tomber en panne. – person
Rien à voir avec la question, mais puis-je suggérer que l'utilisation de noms de variables plus courts rendrait votre code beaucoup plus clair. C'est évidemment lié à un jeu, alors pourquoi tout doit être préfixé avec "jeu"? Et toutes les choses sont des objets, donc gameObj, otherObj, et gameObjects sont tous plutôt vides de sens - pensez à des noms courts et non génériques. –