179 lines
2.2 KiB
Markdown
179 lines
2.2 KiB
Markdown
|
|
||
|
|
||
|
|
||
|
|
||
|
# Big Sprite
|
||
|
<div style="text-align: center"><img src="screenshot.png" alt="" /></div>
|
||
|
|
||
|
Renders a big sprite of 16x16. Since the Game Boy hardware does not directly
|
||
|
support sprites that large
|
||
|
|
||
|
## Source
|
||
|
Start by including `gb/gb.h` this file defines most important functions you
|
||
|
are going to need when develop Game Boy games.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
```c
|
||
|
#include <gb/gb.h>
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
The `sprite.c` file defines the sprite data in the form of an unsigned char
|
||
|
array. Most of the time you want to generate this file using tools such as
|
||
|
GBTD.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
```c
|
||
|
#include "sprite.c"
|
||
|
|
||
|
void main() {
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
Set the sprite size to 8x16 pixels, two tiles one above the other. Internally
|
||
|
sets bit 2 of the LCDC register to 1.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
```c
|
||
|
SPRITES_8x16;
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
Loads the tile patterns stored in `sprite` into the Sprite Tile Pattern
|
||
|
table.
|
||
|
|
||
|
* first parameter `0` determines at which position we should start loading.
|
||
|
* second parameter `4` determines how many tiles we want to loading
|
||
|
* third parameter `sprite` sets the variable to load from
|
||
|
|
||
|
This means that we are loading 4 tiles starting at 0 from the variable
|
||
|
sprite.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
```c
|
||
|
set_sprite_data(0, 4, sprite);
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
Tell sprite `0` to display sprite `0`. Since we are loading 8x16 tiles this
|
||
|
will make sprite 0 show tile `0` and tile `1`.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
```c
|
||
|
set_sprite_tile(0, 0);
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
Finally move a sprite to a position that we can see.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
```c
|
||
|
move_sprite(0, 75, 75);
|
||
|
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
We want to display a 16x16 sprite. Unfortunately the Game Boy hardware does
|
||
|
not directly support a sprite that large. So in order to have a sprite of
|
||
|
that size we are simply displaying two 8x16 tiles next to each other!
|
||
|
|
||
|
Since we've already loaded our entire sprite in line 16 we can now simply
|
||
|
tell sprite `1` to display our second sprite. Again, since we are displaying
|
||
|
8x16 tiles this statement will display tile `2` and tile `3`.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
```c
|
||
|
set_sprite_tile(1, 2);
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
In order to form the illusion of a bigger sprite we display the second tile
|
||
|
directly next to the other simply by offsetting the position 8 pixels to the
|
||
|
right.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
```c
|
||
|
move_sprite(1, 75 + 8, 75);
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
As always, in order for the sprites to display we need to call
|
||
|
`SHOW_SPRITES` once.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
```c
|
||
|
SHOW_SPRITES;
|
||
|
}
|
||
|
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
|