Sign in to follow this  

SOLVED: SDL: Mouse button events not behaving as expected

This topic is 3038 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I've been following Lazy Foo's (excellent) tutorials and ran into a snag on lesson 9, which deals with mouse driven events: http://lazyfoo.net/SDL_tutorials/lesson09/index.php (Foo's sample code is available on the bottom of the screen). The idea is that there is a button on the screen that will change images depending on if the mouse is over or out of the image, as well as if the mousebutton is down or up while the mouse coordinates are within the bounds of the button image. Mouseover and mouseout work fine. However, when I click on the button, the "Mouse Up" image displays instead of the "Mouse Down" Here are the relevant chunks of code: main: Calls the button object's event handler
//MAIN
int main(int argc, char* args[]) 
{
	//Make sure the program waits for a quit
	bool quit = false;

	//Initialize
	if (init() == false) 
	{
		return 1;
	}

	//Load the files
	if (load_files() == false)
	{
		return 1;
	}

	if (buttonSheet == NULL)
	{
		return 1;
	}

	//Clip the sprite sheet
	set_clips();

	//Make the button
	Button myButton(170, 120, 320, 240);

	//Run until user closes the window
	while (quit == false)
	{
		//If there's an event to handle
		if (SDL_PollEvent(&event))
		{
			//Handle button events
			myButton.handle_events();

			//If user X's out the window...
			if (event.type == SDL_QUIT)
			{
				quit = true;
			}
		}

		//Fill the screen white
		SDL_FillRect(screen, &screen->clip_rect, SDL_MapRGB(screen->format, 0xFF, 0xFF, 0xFF) );

		myButton.show();

		//Update the screen
		if (SDL_Flip(screen) == -1)
		{
			return 1;
		}
	}

	//Clean up
	clean_up();

	return 0;
}


Button::handle_events(): Event handler for the button class
void Button::handle_events()
{
	//Mouse offsets
	int x = 0;
	int y = 0;

	//If the mouse moved
	if (event.type == SDL_MOUSEMOTION)
	{
		//Get the mouse offsets
		x = event.motion.x;
		y = event.motion.y;

		//If the mouse is over the button
		if ( (x > box.x) && (x < box.x + box.w) && (y > box.y) && (y < box.y + box.h) )
		{
			//Set the button sprite
			clip = &clips[CLIP_MOUSEOVER];
		}
		//otherwise, mouse is off the button
		else
		{
			//Set the button sprite
			clip = &clips[CLIP_MOUSEOUT];
		}
	}
	//If a mouse button was pressed
	if (event.type = SDL_MOUSEBUTTONDOWN)
	{
		//If the left button was pressed
		if (event.button.button == SDL_BUTTON_LEFT)
		{
			//Get the mouse offsets
			x = event.button.x;
			y = event.button.y;

			//If the mouse is over the button
			if ( (x > box.x) && (x < box.x + box.w) && (y > box.y) && (y < box.y + box.h) )
			{
				//Set the button sprite
				clip = &clips[CLIP_MOUSEDOWN];
			}
		}
	}
	//If a mouse button was released
	if (event.type = SDL_MOUSEBUTTONUP)
	{
		//If the left button was released
		if (event.button.button == SDL_BUTTON_LEFT)
		{
			//Get the mouse offsets
			x = event.button.x;
			y = event.button.y;

			//If the mouse is over the button
			if ( (x > box.x) && (x < box.x + box.w) && (y > box.y) && (y < box.y + box.h) )
			{
				//Set the button sprite
				clip = &clips[CLIP_MOUSEUP];
			}
		}
	}
}



I'm assuming I'm doing something simple wrong. I did doublecheck to ensure that the clips are mapped properly. Any thoughts? Thanks! EDIT: The SDL_QUIT event that was previously invoked by clicking the "X" in the title bar no longer works either. Have to close it with task manager. [Edited by - matrisking on August 17, 2009 8:06:18 PM]

Share this post


Link to post
Share on other sites

This topic is 3038 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this