Программирование игр для Windows. Советы профессионала


«Прозрачные» пиксели - часть 2


В принципе, это не так уж и плохо для программы, написанной полностью на Си.

Листинг 17.3. Простой двойной параллакс (PARAL1.C).

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

#include <dos.h>

#include "paral.h"

char *MemBuf,            // указатель на дублирующий буфер

*BackGroundBmp,     // указатель на битовую карту фона

*ForeGroundBmp,     // указатель на битовую карту

// ближнего плана

*VideoRam;          // указатель на видеобуфер

PcxFile pcx;             // структура данных

// для чтения PCX-файла

int volatile KeyScan;    // заполняется обработчиком

// прерывания клавиатуры

int frames=0,            // количество нарисованных кадров

PrevMode;            // исходный видеорежим

int background, // позиция прокрутки фона

foreground, //позиция прокрутки битовой карты

// ближнего плана position;    // общее расстояние прокрутки

void _interrupt (*OldInt9)(void); // указатель на обработчик

// прерывания клавиатуры BIOS

// Функция загружает 256 - цветный PCX-файл

int ReadPcxFile(char *filename,PcxFile *pcx)

{

long i;

int mode=NORMAL,nbytes;

char abyte,*p;

FILE *f;

f=fopen(filename,"rb");

if(f==NULL)

return FCX_NOFILE;

fread(&pcx->hdr,sizeof(PcxHeader),1, f);

pcx_width=1+pcx->hdr.xmax-pcx->hdr.xmin;

pcx->height=1+pcx->hdr.ymax-pcx->hdr.ymin;

pcx->imagebytes=(unsigned int) (pcx->width*pcx->height);

if(pcx->imagebytes > PCX_MAX_SIZE) return PCX_TOOBIG;

pcx->bitmap= (char*)malloc (pcx->imagebytes);

if(pcx->bitmap == NULL) return PCX_NOMEM;

p=pcx->bitmap;

for(i=0;i<pcx->imagebytes;i++)

{

if(mode == NORMAL)

{

abyte=fgetc(f);

if((unsigned char)abyte > 0xbf)

{ nbytes=abyte & 0x3f;

abyte=fgetc(f);

if(--nbytes > 0)

mode=RLE;

}

}

else if(-—nbytes == 0) mode=NORMAL;

*p++=abyte;

}

fseek(f,-768L,SEEK_END);      // получить палитру,из PCX-файла

fread(pcx->pal,768,1,f);

p=pcx->pal;




Начало  Назад  Вперед



Книжный магазин