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ň