Looks good. Some changes needed for multiple sprites…
vector <Sprite> sprites;
sprites.push_back(Sprite(1900,725));
sprites.push_back(Sprite(2005, 725));
int dragSpriteIndex = -1; // 0 is a valid index to the first sprite, so we can't use it to indicate no sprite is selected. Thus we use -1 for that.
//Sprite sprite; // not needed, using sprite[dragSpriteIndex] instead
int prevX=0, prevY=0;
bool quit = false;
int deltaX = 0, deltaY = 0;
else if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT)
{
prevX = event.button.x;
prevY = event.button.y;
dragSpriteIndex = -1; // initially deselect in case no sprite is found
for (int i=0; i<(int)sprites.size(); i++) // loop over all sprites
{
Sprite &sprite = sprites[i]; // make reference to the current sprite, so we don't need to type sprites[i] in follwing code...
if (prevX >= sprite.x&&prevX <= sprite.x + 45 && prevY >= sprite.y&&prevY <= sprite.y + 45)
{
dragSpriteIndex = i; // select the current sprite
break; // if a sprite is found, no need to check the others
}
}
}
else if (event.type == SDL_MOUSEBUTTONUP && event.button.button == SDL_BUTTON_LEFT)
{
dragSpriteIndex = -1;
}
You also nee to add such loop over all sprites for the drawing code at the end.
Then we need to move the selected sprite, and add a -1 check in case no sprite is selected:
else if (event.type == SDL_MOUSEMOTION && dragSpriteIndex != -1)
{
Sprite &sprite = sprites[i];
// no changes needed after that...
deltaX = event.motion.x - prevX;
deltaY = event.motion.y - prevY;
prevX = event.motion.x;
prevY = event.motion.y;
sprite.x += deltaX;
sprite.y += deltaY;
}
Then with some luck it should already work.
(Btw, instead using C for loop like my code you can also use std::iterators to iterate over std::containers, which can be faster due to using pointers instead index and base address. Personally i'm just too lazy to do so, as it's more typing.)