Tvorba animací - rychlá grafika

Radek Štěrba, RASTER 1995.1

Každý, kdo někdy zkoušel naprogramovat něco v (Turbo)BASICU v grafickém módu, narazil jistě na problém s rychlostí. Pokud chcete provést na obrazovce nějakou grafickou animaci, bude to asi příliž pomalé.

Takže pro Vás, kteří potřebujete rychle vykreslit na dané místo nějaký grafický objekt, je určen následující text:

Dvojice strojových podprogramů (soubor SIRVYS.OBJ), které jsem pro Vás vyrobil, jsou po nahrání umístěny v 6. stránce paměti. Volají se z Basicu (či z TB) takto:

Tisknutí obrazu na obrazovku:

A=USR(1536,ODK,SIR,VYS,X,Y)
1536 .. startovací adresa podprogramu pro tisk
ODK .. místo v paměti RAM, od kterého máte uložena grafická data daného objektu
SIR .. šířka grafického objektu (udává se v bytech)
VYS .. výška grafického objektu (udává se v bodech)
X .. x-ová souřadnice umístění objektu na obrazovku (v bytech)
Y .. y-ová souřadnice (v bodech)

Uložení obsahu části obrazovky do paměti:

A=USR(1539,KAM,SIR,VYS,X,Y)
1539 .. startovací adresa podprogramu pro vyfocení části obrazu
KAM .. místo v paměti RAM, od kterého budou uložena data grafického objektu ležícího na daném místě obrazovky
SIR .. šířka grafického objektu (udává se v bytech)
VYS .. výška grafického objektu (udává se v bodech)
X .. x-ová souřadnice místa na obrazovce (v bytech)
Y .. y-ová souřadnice (v bodech)

Pozn.:

Údaj "v bytech" znamená v různých grafických módech různý počet bodů:

Gr.mód: Bodů na byte: Bytů na 1 řádek:
   0        1             40
   1        1             20
   2        1             20
   3        4             10
   4        8             10
   5        4             20
   6        8             20
   7        4             40
   8        8             40
   9        2             40
  10        2             40
  11        2             40
  12        1             40
  13        1             40
  14        8             20
  15        4             40

Př.
Pro určení místa v paměti, kam je možné uložit nafocené pozice (parametr KAM), je nutné zjistit začátek a konec volné paměti. Začátek najdeme zjištěním obsahu adres 144,145 (dvoubytová hodnota; ?DPEEK(144)), konec na adresách 741,742 (také dvoubytová hodnota). Přitom musíte brát neustále v úvahu, že prodlužováním (T)Basicovského programu se začátek volné paměti posunuje. Rovněž DIMenzování polí a řetězců má stejný účinek. Na horní mez volného prostoru má vliv použitý grafický mód - doporučuji vyzkoušet aktivaci požadovaného módu, a pak zjistit DPEEK(741). Paměť mezi takto zadefinovaným začátkem a koncem můžete použít pro vlastní potřebu.

Velikost potřebné paměti pro nějaký gr. objekt zjistíte vynásobením jeho šířky a výšky (SIZE=SIR*VYS). Pokud tedy chcete zaznamenat více objektů, je vždy nutno posunout parametr KAM o velikost předtím zaznamenaného objektu, jinak dojde k jeho překrytí novým.

Pokud máte nafoceny z obrazovky nějaké objekty, můžete si je uložit na záznamové médium a později už přímo z tohoto média načíst. Využitím tohoto způsobu odpadá nutnost vykreslovat a nafocovat na začátku programu grafické objekty, které pak budou v programu používány. Způsob s načtením grafických dat objektů ze záznamového média je elegantnější a šetří paměť, kterou by potřeboval vlastní (T)BASIC progam na operace spojené s vykreslováním a nafocováním těchto objektů.

Př.

GR.8
REM Namalování 3 grafických objektů
...
REM Nafocení:
REM 1.objekt 5x30 z místa 0,0 uložit do paměti od adr. 30000
A=USR(1539,30000,5,30,0,0)

REM 2.objekt 7x50 z místa 10,30 uložit do paměti od adr. 30150 (velikost předchozího objetu = 5*30 = 150 ; 30000+150=30150)
A=USR(1539,30150,7,50,10,30)

REM 3.objekt 4x16 z místa 20,50 uložit od adr. 30500 (=30150+7*50)
A=USR(1539,30500,4,16,20,50)

REM Poslední ukládaný objekt končí na adrese 30500+4*16 = 30564. Velikost všech tří objektů je 30564-30000=564 bytů.

REM Uložení na záznamové médium:
OPEN#1,8,0,"D:NAZEV"
BPUT#1,30000,564
CLOSE#1

END

Až budete tyto objekty potřebovat v nějakém programu, na jeho začátku data načtete:

OPEN#1,4,0,"D:NAZEV"
BGET#1,30000,564
CLOSE#1

REM ...a pak je můžete tisknout 
A=USR(1536,30000,... )
A=USR(1536,30150,... )
A=USR(1536,30500,... )

END

NEZAPOMEŇTE:
Samozřejmostí je, že v každém programu, ve kterém chcete tyto strojové podprogramy používat, musíte (nejlépe někde hned na začátku) zajistit jejich načtení příkazem BLOAD"D:SIRVYS.OBJ".

Pro snazší pochopení jsem napsal program v TurboBasicu, ve kterém jsou ukázána některá možná využití těchto strojových podprogramů.