summaryrefslogtreecommitdiff
path: root/packages/libndsfpc/examples/graphics/Sprites/bitmap_sprites/BitmapSprites.pp
blob: 261e6c08abe07df7169fb8f9a13635d27d23a4be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
program BitmapSprites;

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 := -1;
    paletteAlpha := 0;
    x := 20;
    y := 80;
  end;

  with Sprites[2] do
  begin
    gfx := nil;
    size := SpriteSize_32x32;
    format := SpriteColorFormat_16Color;
    rotationIndex := -1;
    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.