Grafické finty
Na začátek bych se rád omluvil PIŽImu a Aleši Zíkovi za to, že jim
tak trochu fušuju do řemesla. Dále pak všem čtenářům, kteří naletěli
na RedOxovu fintu a myslí si, že jsem úplně blbej. Jen tak na
vysvětlenou můj poslední článek C++ kontra Pascal byl původně články
dva. (nádherná toť věta) Druhá část tzn. Poznámka k PIŽIho článku
Asembler pro blbé měl původně být samostatný článek reagující na
hlášku, že si máme program napsat ve svém oblíbeném jazyce a porovnat
ho s PIŽiho asemblerskym. Já jsem to udělal za čtenáře a chtěl to
zveřejnit. Jenže RedOx jakožto šéfredaktor mé dva články skopíroval
k sobě takže i ten druhý vyzněl jako srovnání Pascalu a C++. To jsem
neměl vůbec v úmyslu. Tímto se vám (vlastně za RedOxe) omlouvám.
Ale teď už k samotným grafickým fintám. Dnes bych vám chtěl chtěl
ukázat fintu základní, a to hrátky s paletou. Máme-li na obrazovce
nějaký obrázek, můžeme jednoduše změnit jeho náladu jednoduchou
změnou palety. Takto můžeme udělat svítání, šero atp. Pomocí změn
palety můžeme dokonce udělat i něco jako animaci. Když např.
nakreslim více objektů v různých fázích různou barvu (neměli by se
překrývat) a potom udělám viditelnou jen jednu barvu, tak nám vznikne
něco jako animace. Samozřejmě úplně jednoduchá, ale zato poměrně
rychlá. Na to jak se to dá udělat se můžete kouknout na přiloženém
prográmku. Zase jsou tam samozřejmě nějaké prasárny a alespoň jedna
chyba, ale jinak to celkem jde. Nedoporučuji se dívat na některé fáze
moc dlouho, bolej z toho oči.
Všiměte si tý prasárny při kreslení kružnic PYTHAGOROVOU VĚTOU, no
fuj že se nestydíš. Stydim.
#include <dos.h>
#include <mem.h>
#include <math.h>
#include <conio.h>
#define byte unsigned char
//delka palety
#define PL 768
char pal[PL];
//vyplni kruznicema nebo jinejma patvarama
void fillc(byte b){
int dx,dy,c,d;
char ch;
long l;
char far *p,*q,*r,*s;
p=(char*)MK_FP(0xA000,0);
q=(char*)MK_FP(0xA000,63999);
r=(char*)MK_FP(0xA000,319);
s=(char*)MK_FP(0xA000,63680);
for (dy=100,c=0;dy;dy--){
for (dx=160;dx;dx--,c++){
l=dx*dx;
l+=dy*dy;
if (b==1) ch=sqrt(l);//kruznice
if (b==2) ch=l;
if (b==3) ch=l*2;
if (b==4) ch=l*20;
*(p++)=ch;*(q--)=ch;
*(r--)=ch;*(s++)=ch;
}
p+=160;q-=160;
r+=480;s-=480;
}
}
//ceka na navrat paprsku
void wairet(){
while (((inportb(0x3DA)) & 8));
while (!((inportb(0x3DA)) & 8));
}
//nastavuje paletu
void setpal(){
int c;
wairet();
outportb(0x3c8,0);
for (c=0;c<768;c++) outportb(0x3c9,pal[c]);
}
//inicialisuje graficky mod m
void grinit(char m){
asm{
mov ah,0
mov al,m
int 10h
}
}
//nuluje paletu
void nulpal(){
setmem(pal,PL,0);
}
//vyplni carama
void filll(){
byte c;
char far *p;
p=(char*)MK_FP(0xA000,0);
for (c=0;c<200;c++) {
_fmemset(p,c,320);
p+=320;
}
}
//posune paletu o 1 dal
void downpal(){
char ch[3];
memcpy(&ch[0],&pal[3],3);
memcpy(&pal[3],&pal[6],PL);
memcpy(&pal[PL],&ch[0],3);
}
/***********************************************************************/
/**************************** M A I N *********************************/
/***********************************************************************/
void main(){
byte mod;
int c,d,e;
grinit(0x13);
//nastavuje paletu
for (c=0;c<PL;) {
pal[c++]=c/2;
pal[c++]=c/4;
pal[c++]=c/6;
}
setpal();
for (e=0;e<5;e++){
if (e) fillc(e); else filll();
getch();
//presunuje paletu
while (!kbhit()) {
downpal();
setpal();
}
}
grinit(2);
}
HIPP
výheň