123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- program BitmapSprites;
- {$mode objfpc}
- uses
- ctypes, nds9;
- //a simple sprite structure
- //it is generally preferred to separate your game object
- //from OAM
- type
- TMySprite = record
- gfx: pcuint16;
- size: SpriteSize;
- format: SpriteColorFormat;
- rotationIndex: integer;
- paletteAlpha: integer;
- x: integer;
- y: integer;
- end;
- var
- sprites: array [0..2] of TMySprite;
- i, angle: integer;
- begin
- with Sprites[0] do
- begin
- gfx := nil;
- size := SpriteSize_32x32;
- format := SpriteColorFormat_Bmp;
- rotationIndex := 0;
- paletteAlpha := 15;
- x := 20;
- y := 15;
- end;
- with Sprites[1] do
- begin
- gfx := nil;
- size := SpriteSize_32x32;
- format := SpriteColorFormat_256Color;
- rotationIndex := 0;
- paletteAlpha := 0;
- x := 20;
- y := 80;
- end;
- with Sprites[2] do
- begin
- gfx := nil;
- size := SpriteSize_32x32;
- format := SpriteColorFormat_16Color;
- rotationIndex := 0;
- paletteAlpha := 1;
- x := 20;
- y := 136;
- end;
- videoSetModeSub(MODE_0_2D);
- consoleDemoInit();
- //initialize the sub sprite engine with 1D mapping 128 byte boundary
- //and no external palette support
- oamInit(oamSub, SpriteMapping_Bmp_1D_128, false);
- vramSetBankD(VRAM_D_SUB_SPRITE);
- //allocate some space for the sprite graphics
- for i := 0 to 2 do
- sprites[i].gfx := oamAllocateGfx(oamSub, sprites[i].size, sprites[i].format);
- //ugly positional printf
- iprintf(#27 + '[1;1H' + 'Direct Bitmap:');
- iprintf(#27 + '[9;1H' + '256 color:');
- iprintf(#27 + '[16;1H' + '16 color:');
- //fill bmp sprite with the color red
- dmaFillHalfWords(ARGB16(1,31,0,0), sprites[0].gfx, 32*32*2);
- //fill the 256 color sprite with index 1 (2 pixels at a time)
- dmaFillHalfWords((1 shl 8) or 1, sprites[1].gfx, 32*32);
- //fill the 16 color sprite with index 1 (4 pixels at a time)
- dmaFillHalfWords((1 shl 12) or (1 shl 8) or (1 shl 4) or 1, sprites[2].gfx, 32*32 div 2);
- //set index 1 to blue...this will be the 256 color sprite
- SPRITE_PALETTE_SUB[1] := RGB15(0,31,0);
- //set index 17 to green...this will be the 16 color sprite
- SPRITE_PALETTE_SUB[16 + 1] := RGB15(0,0,31);
- angle := 0;
- while true do
- begin
- for i := 0 to 2 do
- begin
- oamSet(
- oamSub, //sub display
- i, //oam entry to set
- sprites[i].x, sprites[i].y, //position
- 0, //priority
- sprites[i].paletteAlpha, //palette for 16 color sprite or alpha for bmp sprite
- sprites[i].size,
- sprites[i].format,
- sprites[i].gfx,
- sprites[i].rotationIndex,
- true, //double the size of rotated sprites
- false, //don't hide the sprite
- false, false, //vflip, hflip
- false //apply mosaic
- );
- end;
- oamRotateScale(oamSub, 0, angle, (1 shl 8), (1 shl 8));
- angle := angle + 64;
- swiWaitForVBlank();
- //send the updates to the hardware
- oamUpdate(oamSub);
- end;
- end.
|