Hé les gars, j'écrivais du code et j'ai trouvé une erreur particulière. La fonction convert_vector2d (& i_scale) convertit une chaîne en vector2d (hérite de sf :: vector2f). Si vous examinez les prochaines lignes de code, je fais deux fois la même opération.stocker les valeurs de retour puis en utilisant vs en utilisant directement C++
Code: Tout sélectionner
float x = convert_Vector2D(&i_scale).x;
float y = convert_Vector2D(&i_scale).y;
object.SetScale((convert_Vector2D(&i_scale)));
ss = object.GetScale();
object.SetScale(x , y);
ss = object.GetScale();
première fois que j'appelle setScale avec le vecteur de retour de convert_vector2d et ss = 1,1. J'appelle encore object.setScale cette fois avec x, y (les résultats stockés) et quand j'appelle object.getScale je reçois ss = 1,2 (ce qui est attendu/correct). J'ai franchi la fonction de conversion et renvoie 1,2 par les deux appels de fonction.
Code: Tout sélectionner
const Vector2D Map::convert_Vector2D(std::string * string_to_convert)
{
size_t foundit = 0;
Vector2D temp;
std::string one, two;
if((foundit = string_to_convert->find(',')) != std::string::npos &&
string_to_convert->find_first_of(',') == string_to_convert->find_last_of(',')) // only one comma per line.
{
one = string_to_convert->substr(0, foundit);
two = string_to_convert->substr(foundit+1, string_to_convert->size()); // +1 to skip over the comma.
temp.x = (float)strtod(one.c_str(), NULL);
temp.y = (float)strtod(two.c_str(), NULL);
check_conversion_errors_vector2d(temp, string_to_convert);
}
else
{
Debugger::print("MapLoader: Error: more then one comma on line %d of file %s. Stopping reading of file.\n",
i_Current_Line, mMapName.c_str());
i_QuitParsing = true; // TODO: maybe add return after this line?
}
return temp;
}
Toutes les idées sur la raison pour laquelle j'obtenir un comportement différent?
void Drawable::SetScale(float ScaleX, float ScaleY)
{
SetScaleX(ScaleX);
SetScaleY(ScaleY);
}
void Drawable::SetScale(const Vector2f& Scale)
{
SetScaleX(Scale.x);
SetScaleY(Scale.y);
}
void Drawable::SetScaleX(float FactorX)
{
if (FactorX > 0)
{
myScale.x = FactorX;
myNeedUpdate = true;
myInvNeedUpdate = true;
}
}
void Drawable::SetScaleY(float FactorY)
{
if (FactorY > 0)
{
myScale.y = FactorY;
myNeedUpdate = true;
myInvNeedUpdate = true;
}
}
constructeurs de copie SFML et les variables membres:
// = equals operator assignment
Vector2D& operator=(const Vector2D &rhs)
{
if(this == &rhs)
{
return *this;
}
else
{
this->x = rhs.x;
this->y = rhs.y;
return *this;
}
}
// = equals operator assignment
Vector2D& operator=(const sf::Vector2f &rhs)
{
this->x = rhs.x;
this->y = rhs.y;
return *this;
}
float x, y;
A quoi ressemblent les deux fonctions 'SetScale()'? –
ajouté à l'article original. –
Pouvez-vous nous montrer le code pour 'Vector2f' et' Vector2D' (spécifiquement, les variables membres, et les constructeurs de copie que vous avez)? Je soupçonne que vous pourriez avoir des membres nommés 'x' et' y' déclarés dans les deux. – Doug