Я разрабатываю код для небольшого игрового устройства, которое я разработал. Я полностью застрял, пытаясь построить то, что в конечном счете представляет собой График расположения карт.
У меня есть 2 структуры:
typedef struct point {
int x;
int y;
} point;
typedef struct location {
const point portal_in;
const point portal_out;
const byte *map;
const byte width;
const byte height;
struct location *portals[8];
point player;
struct location *return_to;
} location;
Каждое местоположение имеет список других местоположений, на которые оно ссылается, а также местоположение, на которое оно ссылается.
Я пытался настроить места следующим образом:
location build_locations()
{
location village = {
.portal_in={15, 14},
.portal_out={0, 0},
.map=&VILLAGE[0],
.width=32,
.height=16,
.player={15, 14},
.return_to=0
};
location loc = {
.portal_in={8, 7},
.portal_out={11, 10},
.map=&HOUSE[0],
.width=8,
.height=8,
.player={0, 0},
.return_to=&village
};
village.portals[0] = &loc;
return village;
}
это вызывается в моей main()
функции:
location current_location = build_locations();
И это работает, вплоть до точки - я могу нарисовать карту village
и переместить игрока вокруг нее:
display_map(¤t_location);
display_player(¤t_location);
и так далее. Проблема возникает, когда я хочу поменяться на новое место.
Если я попытаюсь переназначить current_location
, я получу ошибку компилятора с жалобой на assignment to read only variable
:
current_location = current_location.portals[0];
Это, пожалуй, самый сложный код, который я написал на C, так что я знаю, что я не в своей тарелке, когда речь идет о структурах и указателях, но я пытаюсь учиться, и я прошел долгий путь уже.
Есть ли лучший способ сделать то, что я пытаюсь сделать? Или я что-то упустил очевидное?
Спасибо
EDIT:
Это самый минимальный пример, который я могу придумать:
typedef unsigned char byte;
static const byte VILLAGE[] = {
0, 0, 0, 0, 175, 181, 181, 181, 181, 181, 181, 175, 0, 0, 0, 0,
/// And so on - indices of tiles defined elsewhere but irrelevant here
};
static const byte HOUSE[] = {
0, 0, 0, 0, 175, 181, 181, 181, 181, 181, 181, 175, 0, 0, 0, 0,
/// And so on - indices of tiles defined elsewhere but irrelevant here
};
typedef struct point {
int x;
int y;
} point;
typedef struct location {
const point portal_in;
const point portal_out;
const byte *map;
const byte width;
const byte height;
struct location *portals[8];
point player;
struct location *return_to;
} location;
location build_locations()
{
location village = {
.portal_in={15, 14},
.portal_out={0, 0},
.map=&VILLAGE[0],
.width=32,
.height=16,
.player={15, 14},
.return_to=0
};
location loc = {
.portal_in={8, 7},
.portal_out={11, 10},
.map=&HOUSE[0],
.width=8,
.height=8,
.player={0, 0},
.return_to=&village
};
village.portals[0] = &loc;
return village;
}
int main(void)
{
location current_location = build_locations();
if (current_location.player.x == 5 && current_location.player.y == 4)
{
current_location = current_location.portals[0];
}
}