if ( pos + 1 >= length ) return -1;
unsigned short v = Munsigned short *) (bits + pos);

Основные классы для рендерера. Работа с ресурсами

pos += 2 ; return v;
}
long getLong () {
if ( pos + 3 >= length ) return -1;
long v = Mlong *) (bits + pos);
pos += 4;
return v;
}
unsigned long getUnsignedLong () {
if ( pos + 3 >= length ) return -1;
unsigned long v = *(unsigned long *) (bits + pos); pos += 4 ; return v;
}
void * getPtr () const {
return bits + pos;
}
void * getPtr ( int offs ) const {
if ( offs < 0 I I offs >= length ) return NULL;
return bits + offs;
}
int seekCur ( int delta ) {
pos += delta;
if ( pos > length )
pos = length;
if ( pos < 0 )
pos = 0;
return pos;
}
int seekAbs ( int offs ) {
pos = offs;
if ( pos > length )
pos = length;
if ( pos < 0 )
pos = 0;
return pos;
}
int getBytes ( void * ptr, int len ); bool getString ( Strings str );
static MetaClass classlnstance;
} ;

Методы get служат для доступа к элементу данных заданного типа. При этом указатель внутри объекта автоматически сдвигается к следующему элементу.

Методы seek служат для явного перемещения указателя.

На компакт-диске содержатся реализации классов OsFileSystem для доступа к обычным файлам, PakFileSystera, служащего для доступа к ресурсам внутри файла рак игр Quake и Quake II, и ZipFileSystem, служащего для доступа внутри zip-архивов (и соответственно ркЗ-файлов игры Quake III).

При этом удобно иметь набор объектов-поставщиков ресурсов, и тогда каждый запрос на получение ресурса по очереди передается каждому из таких объектов до тех пор, пока требуемый ресурс не будет найден (или не будет исчерпан этот список). Подобный подход является примером паттерна "Цепочка ответственности" [12].

Для декодирования ресурсов также удобно использовать объекты - каждый объект соответствует определенному формату ресурсов и пытается

Основные классы для рендерера. Рабдта с ресурсами

его декодировать. При этом все такие декодеры должны быть унаследованы от приводимого ниже абстрактного класса ResourceDecoder.


⇐ Предыдущая| |Следующая ⇒