В идеале он должен полностью инкапсулировать все обращения к устройству внутри себя, но поскольку мы уже решили использовать OpenGL, то писать еще один слой абстракции поверх OpenGL было бы слишком сложным и громоздким и не дало бы ощутимых преимуществ.
Хотя если планируется поддержка сразу нескольких интерфейсов вывода, то удобно весь доступ к устройству инкапсулировать внутри объекта View. Тогда смена интерфейса (например, переход от OpenGL к Direct3D) означает только смену объекта "Вид" (с OpenGlView на Direct3DView) и полностью скрыто как от остальных частей системы, так и от игрока.
Далее для вывода графической информации мы будем использовать только OpenGL и некоторые классы будут содержать в себе прямые вызовы OpenGL (а некоторые будут обращаться через класс View). Это позволит упростить интерфейс нашей системы и сделать его более наглядным.
Ниже приводится описание этого класса.
class View : public Object {
protected:
int width;
int height;
int bitsPerPixel;
Controller * controller;
Array modeList; // array of VideoMode's
public:
View ( const char * aName ) : Object ( aName ) {
width =0; // unknown
height =0; // unknown
bitsPerPixel =0; // unknown
controller = NULL; metaClass = &classlnstance;
virtual bool isOk () const
return falser-virtual void * getWindow () const
return NULL;
virtual char * getVendor () = 0,-
virtual char * getRenderer () = 0,-
virtual char * getVersion () =0;
Пишем портальный рендерер (часть I)
virtual int getChar () = 0
virtual bool getKeyboardState ( KeyboardStateS ) = 0 virtual bool getMouseState ( MouseStateS ) = 0
virtual void draw ( const Polygon3D& poly );
virtual void simpleDraw , ( const Polygon3D&,
int mask = 0 ) {} virtual void setFullScreen ( bool toFullScreen ) {} virtual void setSize ( int newWidth,