Atom Nieuws nummer 3
../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif
pagina 5
Sprites.h
door Roland Leurs

In het vorige nummer van Atom Nieuws heeft u het eerste deel van mijn grafische toolkit voor Linux svgalib kunnen bekijken. Hier volgt het tweede deel: sprites. Met deze functies kunt u sprites met afmetingen van 32x32 pixels gebruiken. Ook de visualisatie van de muiscursor kan met deze functies vereenvoudigd worden.

Zowel 'sprites.h' als een voorbeeld 'memory' kunt u terugvinden op de vorige regioschijf of op mijn webpagina: http://home.12move.nl/~sh249966 . ( site is gesloten H. )

De volgende sprite functies zijn geimplementeerd:
sprite_init() - Definieer sprite base en initialisatie
sprite_def() - Definieer sprite
sprite_set()- Plaats sprite op het scherm
sprite_unset()- Verwijder sprite van het scherm
sprite_move()- Verplaats sprite op het scherm
sprite_put() - Plaats sprite, zonder administratie
sprite_hit()- Test overlap van twee sprites

sprite_init() geeft als return-waarde terug of het alloceren van de benodigde geheugenruimte gelukt is. De overige functies retourneren een statusbyte. De afzonderlijke bits hebben de volgende betekenis:

+---+---+---+---+---+---+---+---+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+---+---+---+---+---+---+---+---+
   |   |   |   |   |   |   |   |
   |   |   |   |   |   |   |   +---- muis button 1 (alleen sprite_hit)
   |   |   |   |   |   |   +-------- muis button 2 (alleen sprite_hit)
   |   |   |   |   |   +------------ muis button 3 (alleen sprite_hit)
   |   |   |   |   +---------------- ongeldige parameter
   |   |   |   +-------------------- geen sprites beschikbaar
   |   |   +------------------------ ongeldig spritenummer 1
   |   +---------------------------- ongeldig spritenummer 2
   +-------------------------------- overlap van sprite 1 en 2 cq muis

Muis routines:
mouse_init()- initialiseert de muis voor gebruik
mouse_on()- activeert de muiscursor op het scherm
mouse_off()- schakelt de muiscursor op het scherm uit
mouse_move()- verplaatst de muiscursor op het scherm
mouse_hotspot()- geeft positie van hotspot aan

Gebruikte globale variabelen:
sprmax- maximaal aantal sprites
sprbase- pointer naar sprite administratie
sprx[ ] - array met x-coordinaten
spry[ ] - array met y-coordinaten

Macro's:
MOUSECUR         - 0       geeft spritenummer van muiscursor weer

Opmerking omtrent muisfuncties:
De functies voor de muis zijn een visuele aanvulling op de muisfuncties die in SVGALIB <vgamouse.h> beschikbaar zijn. Standaard zijn er geen voorzieningen voor de muiscursor aanwezig. Aangezien de hier beschreven functies een aanvulling zijn is het noodzakelijk om de initialisatie met de beschikbare functies van SVGALIB uit te voeren.

int mouse_hotspot(int x, int y)

Hiermee kan de hotspot van de muis aangegeven worden. Normaal is het linker bovenhoekje van de muiscursor (0,0) de hotspot. Naar gelang de vorm van de muiscursor kan deze hotspot aangepast worden. De parameters 'x' en 'y' moeten beiden tussen 0 en 31 liggen. Indien de waarde hier buiten valt zal de vlag 'ongeldige parameter' in het statusbyte gezet worden. De hotspot wordt dan niet gewijzigd.
Returncodes: zie beschrijving van statusbyte.

int mouse_move(void)

Indien de muis verplaatst is sinds de laatste aanroep van deze functie wordt de cursor op het scherm op de nieuwe positie geplaatst.
Returncodes: zie beschrijving van statusbyte.

int mouse_off(void)

Deze functie verwijdert de muiscursor van het scherm.
Returncodes: zie beschrijving van statusbyte.

int mouse_on(void)

Deze functie leest de coordinaten van de muis en plaatst de muiscursor op het scherm. De muiscursor is gedefinieerd als sprite 0. De plaatsing van de muiscursor gebeurt met een sprite_set() aanroep.
Returncodes: zie beschrijving van statusbyte.

int sprite_def(int sprite_nr, char *sprdata)

Met deze functie wordt een sprite gedefinieerd. De eerste parameter is het spritenummer, de tweede parameter is een pointer naar de spritedata. Dit is een blok van 1024 bytes, waarbij ieder byte één pixel weergeeft. De pixelkleur ligt tussen 0 en 254. Gebruik de pseudo-kleur 255 voor een transparante pixel.
Sprite 0 (MOUSECUR) is gereserveerd voor de muiscursor; deze kan ook via sprite_def() gedefinieerd worden.
Returncodes: zie beschrijving van statusbyte.

int sprite_hit(int sprite1, int sprite2)

Met deze functie kan eenvoudig getest worden of twee sprites elkaar raken. Het gaat hierbij om een overlap van de gehele sprites, eventuele transparante pixels aan de rand van de sprite worden ook tot de sprite gerekend. Het kan dus voorkomen dat twee sprites (waarvan er op het scherm een kleiner is dan 32x32 pixels) elkaar raken terwijl dat niet te zien is op het scherm. Gebruik in die gevallen de onderstaande vergelijking om te testen of de sprites elkaar raken:

if((abs(sprx[sprite1]-sprx[sprite2])<??) &&
(abs(spry[sprite1]-spry[sprite2])<??))

waarbij de vraagtekens vervangen worden door de benodigde afmetingen.
Indien voor de tweede sprite 'MOUSECUR' wordt opgegeven zal getest worden of de hotspot van de muis zich op de sprite bevindt. Tevens wordt altijd de status van de drie muisknoppen in het statusbyte weergegeven worden, dus ook als er geen overlap tussen de sprite en de muis is.
Returncodes: zie beschrijving van statusbyte.

int sprite_init(int nr_of_sprites)

Initialiseert de administratie van de sprites en reserveert de daarvoor benodigde geheugenruimte. Het aantal sprites wordt als parameter meegegeven. Deze waarde wordt toegekend aan de globale variabele 'sprmax'. Per sprite zijn 2048 bytes nodig voor de spritedefinitie en de opslag van de achtergrond informatie , plus 2 integer array elementen (normaliter 2 bytes per element).
Returncodes:
0 - initialisatie gelukt
1 - initialisatie niet gelukt, waarschijnlijk te weinig geheugen beschikbaar

int sprite_move(int sprite_nr, int new_x, int new_y)

Deze functie verplaatst de opgegeven sprite naar de positie (new_x, new_y) en herstelt daarbij de beeldscherm informatie op de oude positie en slaat de beeldscherm informatie van de nieuwe positie op.
Returncodes: zie beschrijving van statusbyte.

int sprite_put(int sprite_nr, int x, int y)

Deze functie plaatst een sprite wel op het beeldscherm, maar werkt daarbij de administratie niet bij. Ook wordt de beeldscherm informatie niet opgeslagen. Sprites die op deze manier geplaatst worden kunnen niet meer met andere functies benaderd worden.
Returncodes: zie beschrijving van statusbyte.

int sprite_set(int sprite_nr, int x, int y)

Deze functie plaatst een sprite, opgegeven met 'sprite_nr') op het scherm op de positie (x,y). De achtergrond wordt opgeslagen in het spritegeheugen en de coordinaten worden in de tabel bijgewerkt.
Returncodes: zie beschrijving van statusbyte.

int sprite_unset(int sprite_nr)

Deze functie verwijdert de opgegeven sprite van het beeldscherm en plaatst de oude beeldscherm informatie weer terug. De sprite coordinaten worden in de tabel op (-1,-1) gezet.
Returncodes: zie beschrijving van statusbyte.

../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif