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.
|