ProgramováníPočítačInternetBlog

Simulace lávy

Vytvoření grafické simulace lávy v Pascalu.

Tento článek je o jednoduché simulaci lávy. Zdrojový kód je rozdělen do dvou částí:
UNITA pro práci s grafikou
Zdrojový kód lávy

Takže jak to je.

Nejdříve se vykreslí různobarevné vodorovné čáry (pozice x=100-160).Potom se udělá jednobarevný obdelník (x=150-200).
Vznikl nám barevný obrazec. Jelikož naše láva má mít červenou barvu, nastavíme proto paletu našim čarám na barvy v odstínech červené.
Máme tedy vykreslený oheň, teď už stačí ho oživit.
Cyklus opakovaně prochází body v rozmezí
x=2-318 => odebral jsem 2 pixely z obou stran, aby program nepřesáhl obrazovku y=0-190 => dole nechávám červený obdelník, protože vykresluju lávu a né oheň :-) Na vybraný pixel se nastaví barva z vybraného okolního pixelu v uhlopříčce

příklad: 789 4*6 123 pixel na pozici * může mít barvy {1,3,7,9} Celý tento cyklus se opakuje do té doby, než je stisknuta klávesa.
program lava;
uses crtp2,grafika; {Načtení potřebných unit}

function poz(c:word):word; {Funkce pro vybrání náhodného pixelu}
            begin
                 if random(2)=0 then poz:=c-random(2) else poz:=c+random(2);
            end;
(**********************************************)
var
   x,y:word; {Deklarace proměnných x,y}
begin
     randomize; {Nastavení náhodných čísel}
     init320x200; {Inicializace grafického módu 320x200x256}


                 (**********vykresleni obrazu plamene********************)
                 (******************************)
                 for x:=0 to 319 do              { vykreslí na obrazovku body}
                     for y:=100 to 160 do        {Barva se se úrčuje podle souřadnice y, takže máme vodorovné čáry různé barvy}
                         putpixel(x,y,y-99);
                 (******************************)

                 (******************************)
                 for x:=0 to 319 do             {Vykreslí se spodní část v jedné barvě}
                     for y:=150 to 200 do       {Tato část by se neměla v sekci "plamen" zmenit}
                         putpixel(x,y,51);
                 (******************************)

                 (******************************)
                 for y:=140 to 200 do            {Tato funkce nastaví různobarevným čarám červenou barvu v různých odstínech}
                     setpalette(y-140,y,0,0);
                 (******************************)
                 (***********konec vykresleni obrazu plamene*******************)
                 repeat
                       (*********************plamen***********************)
                       for x:=2 to 318 do
                           for y:=0 to 190 do
                               putpixel(x,y,getpixel(poz(x),poz(y)));
{Funkce plamen projde celou obrazovku,}
{na každý vybraný pixel vloží buď barvu vybraného pixelu(nic se nemení),}
{nebo barvu svého souseda (diagonálniho)}
                       (*********************konec plamene****************)
                 until keypressed;
                 readkey;
     end.
unit grafika;

interface

const
VGA=$A000;{Nastavení konstanty VGA}

{Seznam Procedur a Funkcí}
procedure init320x200;
procedure putpixel(x,y:word;barva:byte);
function getpixel(x,y:word):word;
procedure setpalette(index,r,g,b:byte);
{Konec seznamu Procedur a Funkcí}

implementation

{Jednotlivé procedury a funkce}






(************************Procedura na nastavení palety************)
procedure setpalette(index,r,g,b:byte);Assembler;
              ASM
                 mov ax,$1010;
                 mov BH,0;
                 mov BL,index;
                 mov DH,r;
                 mov CH,g;
                 mov CL,b;
                 int $10;
{Vysvětlení parametrů:
index = barva, jejichž paleta se má změnit
(r=červená,g=zelená,b=modrá)=barvy palety
}
             end;
(*********************konec************************)









(*****funkce na převedení z 2-rozmerné souradnice na 1-rozmernou****)
function getaddr(x,y:word):word;
         begin
              getaddr:=x+320*(y-1);
{Vysvětlení parametrů:
x,y se převedou do řádku
getaddr je vnitřní funkce uživatel k ní nemá přístup
používá se při getpixel a putpixel
}
         end;
(*****************konec*********************)











(***********Funkce na zjištění barvy pixelu**********)
function getpixel(x,y:word):word;
         begin
              getpixel:=mem[vga:getaddr(x,y)];
{Vysvětlení parametrů:
x,y=pozice pixelu
funkce vrací barvu na pozici x,y
}
         end;
(***************konec****************)







(*Procedura na inicializaci gradického rezimu 320x200x256*)
procedure init320x200; assembler;
          ASM
             mov ax,$13
             int $10
          End;
(******konec***************)










(******Procedura na vykreslení pixelu***)
procedure putpixel(x,y:word;barva:byte);
          begin
               mem[vga:getaddr(x,y)]:=barva;
{Vysvětlení parametrů:
x,y=pozice vykreslení pixelu
barva=barva pixelu
}
          end;
(**********konec**********)









end.
Celý zdrojový kód ke stáhnutí Zde Je to můj první článek o programování- NEPOVEDL SE MI :-(, doufám, že příště to bude lepší
Tagy:
grafikapascal
Podobné:
Pomocná Unita pro PascalPomocná Unita pro PascalMini učebnice PascaluMini učebnice Pascalu

Komentáře:

Jméno:
Vzkaz:
Jste člověk?Ano Ne