У меня есть структура:
typedef struct Image {
byte height;
byte width;
byte data[];
} Image;
, и я создаю 2 изображения:
static const __flash Image GRID = {
.width = 16,
.height = 8,
.data = {
0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82, ...
}
};
static const __flash Image HOUSE1 = {
.width = 24,
.height = 24,
.data = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ...
}
};
Затем я создаю массив указателей на изображения:
static const __flash Image *IMAGES[] = {
&GRID,
&HOUSE1,
};
Я могу нарисовать изображение, используя мою draw_image()
функцию:
void main(void)
{
draw_image(IMAGES[0], 16, 16);
}
У меня есть карта:
typedef struct Map {
word cols;
word rows;
byte tiles[];
} Map;
static const __flash Map level_1 = {
.cols = 16,
.rows = 8,
.tiles = {
0,0,1,0,...
поле .tiles
представляет собой список индексов в IMAGES
массив.Я делаю это таким образом, потому что мой движок не знает, какие изображения доступны, без уведомления:
void draw_map(const Map __memx *map, const Image __memx *tileset[]);
{
...
draw_image(tileset[map->tiles[index]], x, y);
...
}
, названный так:
void main(void)
{
draw_map(&level_1, &IMAGES[0]);
}
Компилятору это не нравится ивыдает мне несовместимые предупреждения типа указателя.Карта не прорисована:
note: expected
‘const __memx Image ** {aka const __memx struct Image **}’
but argument is of type
‘const __flash Image ** {aka const __flash struct Image **}’
Я попытался удалить []
из объявления draw_map()
:
void draw_map(const Map __memx *map, const __memx Image *tileset);
, но это вызвало ошибку при вызове draw_image()
Звоните:
error: incompatible type for argument 1 of ‘draw_image’
draw_image(tileset[0], c*8+(64 - r*8), r*8);
^
tile-engine.c:63:6: note: expected
‘const __memx Image * {aka const __memx struct Image *}’ but argument is of type
‘Image {aka const __memx struct Image}’
Где я иду не так?
void draw_image(const Image __memx *image, int x, int y)
{
byte rows = image->height>>3;
byte cols = image->width>>3;
for(byte r=0 ; r<rows ; r++)
{
for(byte c=0 ; c<cols ; c++)
{
draw_tile(&image->data[(r*cols+c)*8], &image->data[(r*cols+c)*8], x+(c*8), y+(r*8));
}
}
}