keyboard_ru - oxygine/oxygine-framework GitHub Wiki

Клавиатура

Oxygine не имеет своего собственного API для обработки клавиш. Если вам необходим доступ к клавиатуре, то необходимо использовать функции из SDL2 (или Marmalade).

Есть несколько способов обрабатывать нажатия кнопок в SDL:

  • Event Based
  • опрос клавиш

Event Based

Когда пользователь нажимает любую клавишу, то срабатывает событие SDL_KEYDOWN и SDL_KEYUP.

Пример:

#include "oxygine-framework.h"

void example_init()
{
	ox::core::getDispatcher()->addEventListener(ox::core::EVENT_SYSTEM, onEvent);
}


void onEvent(Event* ev)
{
	SDL_Event *event = (SDL_Event*)ev->userData;

	if (event->type != SDL_KEYDOWN)
		return;

	//all key codes could be found in "SDL_keyboard.h" from SDL
	switch (event->key.keysym.sym)
	{
		case SDLK_RETURN:			
			//ENTER key was pressed, handle it
		break;
		case SDLK_SPACE:			
			//SPACE key was pressed, handle it
		break;
	}
}

с помощь ox::core::EVENT_SYSTEM можно перехватывать все SDL события.

Опрос клавиш

Опрос состояния нужных клавиш. Обычно применяется в цикле и подходит для мягкого и точного управления движением объекта.

В данном примере перегружается метод Actor::doUpdate, который вызывается каждый кадр и опрашивается состояние клавиш A, S, D, W. В следствии чего изменяется позиция спрайта на экране:

#include "oxygine-framework.h"

class MySprite: public Sprite
{
protected:
	void doUpdate(const UpdateState &us);
};

void MySprite::doUpdate(const UpdateState &us)
{
	const Uint8* data  = SDL_GetKeyboardState(0);
     
	//calculate speed using delta time
	float speed = 1.0f * (us.dt / 1000.0f);

	Vector2 pos = getPosition();
     
	if (data[SDL_SCANCODE_A]) pos.x -= speed;
	if (data[SDL_SCANCODE_D]) pos.x += speed;
	if (data[SDL_SCANCODE_W]) pos.y -= speed;
	if (data[SDL_SCANCODE_S]) pos.y += speed;

	setPosition(pos);
}