Dlaczego SDL podczas eventu myszy zmienia stan boola?

0

Cześć! Chciałbym sprawdzić czy podczas trzymania lewego przycisku myszy zmienna jest równa 1, jeśli tak, wykonać operację. Jednak Gdy trzymam lpm, a bool przed kliknięciem wynosił 1 zmienia stan na 0, co uniemożliwia wykonanie operacji. Mogłem trochę zagmatwać sprawę, dlatego może pokaże to w kodzie.

class InputManager
{
public:
	InputManager() {}

	void UpdateEvent(SDL_Event& event) {
		this->event = event;
	}

	bool MouseMotion() {
		if (event.type == SDL_MOUSEMOTION) {

			float x = (float)event.motion.x;
			float y = (float)event.motion.y;

			setMouseCoords(x, y);
			return true;
		}
		return false;
	}

	bool CheckMouseBounds(int minX, int maxX, int minY, int maxY)
	{
		bool collisionX = mouseCoords.x >= minX && mouseCoords.x <= maxX;
		bool collisionY = mouseCoords.y >= minY && mouseCoords.y <= maxY;

		return collisionX && collisionY;
	}

	bool MouseButtonDown(int button)
	{
		if (event.type == SDL_MOUSEBUTTONDOWN) {
			if (event.button.button == button) {
				return true;
			}
		}
		return false;
	}

	bool MouseButtonUp(int button)
	{
		if (event.type == SDL_MOUSEBUTTONUP) {
			if (event.button.button == button) {
				return true;
			}
		}
		return false;
	}
private:
	SDL_Event event;
};
int main(int argc,char* args[] ) {
	InputManager input;
	Test test;
	while(!quit) {
		while(SDL_PollEvent(&event)) {
			
			input.UpdateEvent(event);
			test.UpdateInput(input);
		}

		...
	}
	return 0;
}
class Test {
public:
	Test() {}
	
	void UpdateInput(InputManager input) {
		while(input.MouseMotion()) {
			check = input.CheckMouseBounds(x, y, x + w, y+ h);
			std::cout<<check<<std::endl;
			if(input.MouseButtonDown(SDL_BUTTON_LEFT && check) {
				DoSomething();
			}
		}
	}

	void DoSomething() {
		...
	}
private:
	bool check = false;
}

W metodzie UpdateInput sprawdzam czy check jest w obszarze, w którym klik ma działać. Wypisuje na ekranie, kiedy kursor jest w tym obszarze, ale lewy przycisk nie jest kliknięty - check = true, kiedy jest w tym obszarze i kliknę lewy przycisk - check zmienia się na false, przez co operacja nie jest wykonywana.

W jaki sposób to naprawić?

0

Sprawdzasz tylko ostatni event, zamiast trzymać stan.
Obstawiam, że powinno to wyglądać jakoś tak (w pseudo-c++):

void handleEvent(Event evt) {
  switch (evt.type) {
    case EVT_MOUSE_UP:
      this->mouseUp = true;
      break;

    case EVT_MOUSE_DOWN:
      this->mouseUp = false;
      break;
  }
}

bool isMouseUp() {
  return this->mouseUp;
}
0
Patryk27 napisał(a):

Sprawdzasz tylko ostatni event, zamiast trzymać stan.
Obstawiam, że powinno to wyglądać jakoś tak (w pseudo-c++):

void handleEvent(Event evt) {
  switch (evt.type) {
    case EVT_MOUSE_UP:
      this->mouseUp = true;
      break;

    case EVT_MOUSE_DOWN:
      this->mouseUp = false;
      break;
  }
}

bool isMouseUp() {
  return this->mouseUp;
}

Trochę w sumie nie rozumiem za bardzo o co chodzi w tym.

0

Pomyśl o stanie myszki jak o włączniku: komunikat SDL_MOUSEBUTTONUP go włącza, a komunikat SDL_MOUSEBUTTONDOWN - wyłącza.
W momencie, gdy włącznik jest włączony - użytkownik trzyma wciśnięty klawisz myszki.

Inny przykład - wyobraź sobie, że Twoja aplikacja odbiera następujące komunikaty:

left mouse button activated
mouse moved at (10, 10)
mouse moved at (20, 20)
mouse moved at (30, 30)
left mouse button deactivated

Ty w swoim kodzie sprawdzasz tylko ostatni event - czyli gdy użytkownik naciśnie lewy przycisk myszy i ruszy kursorem, Twoim ostatnim eventem będzie właśnie ruszenie kursorem i zwrócisz, że klawisz nie jest naciśnięty, chociaż nie jest to prawdą. Dlatego potrzebujesz tutaj zmiennej pomocniczej aktywowanej na komunikat mouse up i deaktywowanej na mouse down.

0

Już rozumiem. Dzięki wielkie

1

@Patryk27: https://wiki.libsdl.org/SDL_MouseButtonEvent

An SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP event occurs whenever a user presses or releases a button on a mouse.

Czyli DOWN to wciśnięcie, a UP to zwolnienie. Toś mnie zbałamucił… :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1