LINUX.ORG.RU

SDL mouse button repeat

 , ,


0

2

Здравствуйте! Знаю, что есть такая полезная фича в SDL, как event.key.repeat. Он позволяет не обрабатывать нажатие клавиши на клаве вторично, пока она не будет отпущена и нажата снова. Есть ли что-то в SDL2, что позволяет дать тот же эффект, только на нажатие клавиш мыши?

Ответ на: комментарий от anonymous

Ну смотри: есть checkbox (я написал), все отлично, но если немного дольше задержать кнопку мыши, он начинает включаться и выключаться.

egordorichev
() автор топика
Ответ на: комментарий от egordorichev

А вот сам код:


class checkbox{
	public:
		checkbox(int nx, int ny, int nw, int nh, bool nvalue);
		~checkbox();
		int getX(){ return x; };
		int getY(){ return y; };
		int getW(){ return w; };
		int getH(){ return h; };
		void setX(int nx){ x = nx; };
		void setY(int ny){ y = ny; };
		void setW(int nw){ w = nw; };
		void setH(int nh){ h = nh; };
		void check(SDL_Event *event);
		wigetState getState(){ return state; };
		bool isChecked(){ return value; };
		bool getValue(){ return value; };
	private:
		int x;
		int y;
		int h;
		int w;
		bool value;
		wigetState state;
};

...

void checkbox::check(SDL_Event* event)
{
	int mx, my;
	SDL_GetMouseState(&mx, &my);
	switch(event->type){
		case SDL_MOUSEBUTTONDOWN:
			if(mx >= x && mx <= x + w && my >= y && my <= y + w){
				if(value) value = false; else value = true;
				state = PRESSED;
			}
			break;
		case SDL_MOUSEMOTION:
			if(mx >= x && mx <= x + w && my >= y && my <= y + w){
				state = MOUSEENTER;
			}
			else
				state = MOUSEOUT;
			break;
		case SDL_MOUSEBUTTONUP: if(mx >= x && mx <= x + w && my >= y && my <= y + w) state = MOUSEENTER; break;
	}
}
egordorichev
() автор топика

Иди на сайт SDL и ищи там в форумах и документации.

anonymous
()
Ответ на: комментарий от egordorichev

Ну смотри: есть checkbox (я написал), все отлично, но если немного дольше задержать кнопку мыши, он начинает включаться и выключаться.

В обычных GUI программах такого никогда не было. Как ты так смог? Нажатия клавиш мыши не автоповторяются. xev подтверждает.

anonymous
()
Ответ на: комментарий от egordorichev

Выполняй действие смены режима на UP.

anonymous
()
Ответ на: комментарий от andreyu

if(value) value = false; else value = true;

А так не будет проще:
value = !value;

спасибо)

Выполняй действие смены режима на UP.

Извини. Я тебя не понимаю.

Как ты так смог?

Очень просто - сильно нужно было.

egordorichev
() автор топика
Ответ на: комментарий от egordorichev

Извини. Я тебя не понимаю.

Видимо речь идет о смене состояния чекбокса по событию mouse button up.

Но вообще проблема какая-то надуманная. Я SDL2 не смотрел, но ваш код адовый.

andreyu ★★★★★
()

Никакой repeat не нужен. Клавиша нажата после первого KEYDOWN и до соответствующиего KEYUP. То же самое с мышью.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.