array incrementation

Started by
1 comment, last by aregee 10 years, 1 month ago

I wanted to draw a grid with array of sprites. And I made it work with this code


// loop over each sprite, setting their textures
// grid
for(int i = 0; i < 20; i++)
{
	spr[i].setTexture(tex);
	spr[i].scale(sf::Vector2f(0.55f, 0.55f));

	// 1st row
	if(i < 10)
		spr[i].setPosition(105.6f * i, y);
	// 2nd row
	if(i > 10 || i < 20)
		spr[i+10].setPosition(105.6f * i, y + 52.8f);
	// 3rd row
	//if(i > 20 || i < 30)
	//	spr[i+20].setPosition(105.6f * i, y + 105.6f);

}

Now I want to optimize this code so I can use it more efficiently later. The code brakes if I set spr instead of spr[i+10] in second if loop. Why is this? How can I continue through the array without +10 or whatever next to it?

Advertisement

You just need to learn to use the modulo operator.

for(int i = 0; i < 30; i++)
{
spr[i].setTexture(tex);
spr[i].scale(sf::Vector2f(0.55f, 0.55f));

spr[i].setPosition(105.6f * (i % 10), y + (52.8f * (i / 10)));

}

Vortez solution is the way to go, but it seems you have a flaw in your logic:


    if(i < 10) //This will be run if i is less than 10
    if(i > 10 || i < 20) //This will be run regardless
    if(i > 20 || i < 30) //This will be run regardless

What you have written is exactly the same as:


    if(i < 10) //This will be run if i is less than 10
    if(true) //This will be run regardless
    if(true) //This will be run regardless

I think this is what you meant:


    if(i < 10) //This will be run if i is less than 10
    if(i >= 10 && i < 20) //This will be run if i is greater or equal to 10, but less than 20
    if(i >= 20 && i < 30) //This will be run if i is greater or equal to 20, but less than 30

EDIT: Although operator precedence ensures the correct order of operation in this case, I usually wrap the tests like this for ease of reading:


    if ((i >= 20) && (i < 30))
But that is probably just taste... smile.png

This topic is closed to new replies.

Advertisement