Еще одной важной обязанностью этого класса (помимо создания окна и его настройки, поддержки полноэкранного режима и т. п.) является чтение информации с клавиатуры и мыши. Для этого будет использоваться объект следующего вида:
:5В
class InputReader : public Object {
public:
InputReader ( View *, const char * theName ) : Object ( theName ) {}
virtual bool getKeyboardState ( KeyboardState& ) = 0; virtual bool getMouseState ( MouseState& ) = 0;
};
Информация о состоянии мыши и клавиатуры возвращается при помощи объектов следующих классов:
class KeyboardState l{
(private:
i char keys [256],-feublic:
KeyboardState ()
memset ( keys, '\0', sizeof ( keys ) );
char * getKeys () return keys;
bool isKeyPressed ( int keyCode ) const
return (keyCode >= 0 && keyCode < sizeof ( keys )) ?
(keys [keyCode] != 0) : false;
class MouseState {
public:
int mouseX;
int mouseY;
int wheel;
int mouseFlags; public:
MouseState ()
{
mouseX = 0;
mouseY = 0 ;
wheel = 0 ;
mouseFlags = 0; }
bool isMouseButtonPressed ( int buttonNo ) const {
return (mouseFlags & (1 << buttonNo)) != 0;
}
intgetMouseX () const {
return mouseX;
}
intgetMouseY () const {
return mouseY;
}
int getWheel () const {
return wheel;
}
void setState ( int x, int y, int wh, bool bl, bool b2, bool b3, bool b4 )
{
mouseX = x;
mouseY = y;
wheel = wh;
mouseFlags = (bl ? 1 : 0 ) | (b2 ? 2 : 0 ) | (b3 ? 4 : 0 ) | (b4 ? 8 : 0 ) ;
}
};
Пишем портальный рендерер (часть I)
Для обозначения клавиш удобно ввести независимые обозначения (которые приведены в файле keys.h).
За предоставление данного объекта отвечает объект класса View, и его методы опроса состояния мыши и клавиатуры используют данный объект. Это связано с тем, что при изменении некоторых параметров вывода (разрешения экрана, битовой глубины и т. п.) иногда может возникнуть необходимость в создании нового объекта InputReader.