Absolut unerklärliche Änderung ohne Grund!



  • Hey Forumler,

    ich arbeite gerade an einem kleinen Spiel. Alles klappt wunderbar und ich habe
    gerade die Kollisionsfunktionen fertiggestellt:

    void CollideSlime(vector<Slime> & slimes, vector<Guy> & guys)
    {
    	for(unsigned int i = 0; i < guys.size(); i++)
    	{
    		for(unsigned int j = 0; j < slimes.size(); j++)
    		{
    			if(slimes[j].liveTime > 100) //Nur wenn der Schleim gerade erst abgeschossen wurde, also sein livetime noch größer als 100 ist ("alter schleim" soll keine kollision auslösen, sondern nur noch angezeigt werden)
    			{
    				if(slimes[j].degree == 0 || slimes[j].degree == 180) //Wenn der Slime nach Oben oder unten abgefeuert wurde
    				{
    					if(guys[i].x + guys[i].boundx > slimes[j].x - slimes[j].boundx / 2
    						&& guys[i].x - guys[i].boundx < slimes[j].x + slimes[j].boundx / 2) 
    					{
    						guys[i].image = guys[i].image_infi; //Bei treffer guy grün färben
    					}
    				}
    				else if(slimes[j].degree = 90 || slimes[j].degree == 270) // Wenn der Slime nach links oder Rechts abgefeuert wurde
    				{
    					if((guys[i].x + guys[i].boundx) > slimes[j].x && (guys[i].x - guys[i].boundx) < (slimes[j].x + slimes[j].boundx)) 
    					{
    						guys[i].image = guys[i].image_infi; //Bei treffer guy grün färben
    					}
    				}
    			}
    		}
    
    	}
    }
    

    Beim Ausführen passiert etwas extrem eigenartiges:

    Die Boxen bei degree 90 und 270 werden nicht mehr auf den screen gezeichnet hier die unveränderte DrawFunktion:

    void DrawSlime(vector<Slime> & slimes) 
    {
    	for(unsigned int i = 0; i < slimes.size(); i++)
    	{
    		if(slimes[i].live)
    		{
    			if(slimes[i].degree == 0) // Abschuss nach oben
    			{
    				//al_draw_filled_rectangle(slimes[i].x -slimes[i].boundx / 2, slimes[i].y - slimes[i].boundy, slimes[i].x + slimes[i].boundx / 2, slimes[i].y, al_map_rgb(233,23,23));
    				al_draw_rotated_bitmap(slimes[i].image, al_get_bitmap_width(slimes[i].image) / 2, al_get_bitmap_height(slimes[i].image) / 2, slimes[i].x , slimes[i].y - al_get_bitmap_height(slimes[i].image) / 2 , slimes[i].degree * 3.14159 / 180, 0);
    			}
    			else if(slimes[i].degree == 90) //nach rechts
    			{
    				//al_draw_filled_rectangle(slimes[i].x + slimes[i].boundx / 2, slimes[i].y - slimes[i].boundy, slimes[i].x + slimes[i].boundx / 2, slimes[i].y, al_map_rgb(233,23,23)); 
    				al_draw_rotated_bitmap(slimes[i].image, al_get_bitmap_width(slimes[i].image) / 2, al_get_bitmap_height(slimes[i].image) / 2, slimes[i].x + al_get_bitmap_height(slimes[i].image) / 2 , slimes[i].y  , slimes[i].degree * 3.14159 / 180, 0);
    			}
    			else if(slimes[i].degree == 180) //nach unten
    			{
    			   al_draw_rotated_bitmap(slimes[i].image, al_get_bitmap_width(slimes[i].image) / 2, al_get_bitmap_height(slimes[i].image) / 2, slimes[i].x , slimes[i].y + al_get_bitmap_height(slimes[i].image) / 2 , slimes[i].degree * 3.14159 / 180, 0);
    			}
    			else if(slimes[i].degree == 270) // nach links
    			{
    			   al_draw_rotated_bitmap(slimes[i].image, al_get_bitmap_width(slimes[i].image) / 2, al_get_bitmap_height(slimes[i].image) / 2, slimes[i].x - al_get_bitmap_height(slimes[i].image) / 2 , slimes[i].y  , slimes[i].degree * 3.14159 / 180, 0);
    			}
    			else
    			{
    				slimes[i].live = false;
    			}
    		}
    
    	}
    }
    

    😕 😕 😕 😕 😕

    Für mich ist es unerklärlich warum die Kästen nicht gezeichet werden???

    Ich habe mal die Reihenfolge der Funktionen in der Gameloop getauscht aber das hat nix gebracht.

    Kann mit jemand weiter helfen?

    Das wäre super!

    mfg



  • degree hat welchen Typ? Ah, double ... verstaendlich. Warum sollte man Fliesskommazahlen nicht mittels == auf Gleichheit pruefen?



  • was sagt denn der debugger dazu?



  • knivil schrieb:

    Warum sollte man Fliesskommazahlen nicht mittels == auf Gleichheit pruefen?

    Bastle dir ne Funktion wie folgt

    template <class T>
    bool isEqual (const T &number1, const T &number2, const T epsilon);
    


  • ums dir nochmal genau zu sagen: "==" vergleiche bei fließkommazahlen sind häufig fehleranfällig, da die darstellung der dezimalzahlen als binärzahl nicht exakt ist und daher im code z.B. 90.0f vllt als 89.9995 oder so da steht(beispielhaft)



  • Alternative: Die (durch den Standard garantierte) lexikographische Ordnung der IEEE-754-Fließkommazahlen nach Interpretierung des Bitmusters als vorzeichenbehafteter Integer ausnutzen.


Anmelden zum Antworten