for (int i = x; x < x1;) // skip invisible { // pixels at start
int count = * dataPtr++;
if ( count & 0x80 ) // transparent block i += count & 0x7F;
else {
count &= 0x7F;
if (i + count < x1 )
{
i += count; dataPtr += count;
}
else
{
dataPtr += x1 - i; count -= x1 - i;
if ( count > x2 - i)
count = x2 - i;
for (; count > 0; count- )
* videoPtr++ = * dataPtr++;

Компьютерная графика. Полигональные модели

}
}
}
for(; j <x2; i++ ) {
int count = * dataPtr++;
if ( count & 0x80 ) {
count &= 0x7F; i += count; videoPtr += count;
}
else
{
count &= 0x7F;
if ( count > x2 - i)
count = x2 - i;
i += count;
for (; count > 0; count- )
* videoPtr++ = * dataPtr++;
}
}
}
}
void Sprite :: storeUnder () {
int x1 = max ( 0, x - orgX );
int x2 = min ( screenWidth, x - orgX + width );
int y1 = max (0, y - orgY );
int y2 = min ( screenHeight, y - orgY + height);
char far * videoPtr = videoAddr + y1 * screenWidth + x1;
char * ptr = underlmage;
int step = screenWidth - (x2 - x1);
for (register int y = y1; y < y2; y++, videoPtr += step ) for (register int x = x1; x < x2; x++ ) * ptr ++ = * videoPtr ++;
}
void Sprite :: restoreUnder () {
int x1 = max ( 0, x - orgX );
int x2 = min ( screenWidth, x - orgX + width );
int y1 = max ( 0, y - orgY );
int y2 = min ( screenHeight, y - orgY + height);
char far * videoPtr = videoAddr + y1 * screenWidth + x1;
char * ptr = underlmage;
int step = screenWidth - (x2 - x1);.
for (register int y = y1; y < y2; y++, videoPtr += step ) for (register int x = x1; x < x2; x++ )

4. Работа с основными графическими устройствами

videoPtr ++ = * ptr ++;
}

Для успешной работы с подобными спрайтами нужен менеджер спрайтрв, осуществляющий управление их выводом и, при необходимости, скроллирование экрана.

Используя класс Sprite, несложно написать простейший вариант игры типа Command&Conquer, Red Alert, StarCraft или другой стратегии real-time.

Каждый уровень игры строится из набора стандартных картинок (tile) и набора спрайтов.


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