Системы координат — Расчет сеточных шнуров из (x, y) позиции Переполнение стека

У меня есть массив [15] [15] с путем для моего объекта. 0 это стена, все остальное делает путь (1-> 2-> 3 -> …-> end). Это отражение игрового поля размером 450px x 450px (30px x 30px — это одно поле).

Для массива [15] [15] выглядит так:

080000000000000
010111011101110
010101010101010
010101010101010
010101010101010
010101010101010
010101010101010
010101010101010
010101010101010
010101010101010
010101010101010
010101010101010
010101010101010
011101110111010
000000000000090

Я получил:
map2

Мой объект движется с некоторой скоростью * скорость:

void Enemy::move()
{
this->get_dir();
this->x += this->velX * this->speed; // velX = -1 is left, 1 is right
this->y += this->velY * this->speed; // velY = -1 is up, 1 is down
}

get_dir () проверяет, какое направление (скорость) должно быть установлено, вот так:

void Enemy::get_dir()
{
Point p; // {x, y} struct

p = this->get_grid(); // it tries to calculate X, Y axis into an array number
if (p.y < 14 && path_grid[p.y + 1][p.x] - 1 == path_grid[p.y][p.x])
{
this->velY = 1;
this->velX = 0;
return;
}
/* same goes for rest of directions */

this->velX = this->velY = 0; // if none matched it stops (reached end)
return;
}

Point Enemy::get_grid()
{
int x, y;

for(y = 0;y < 15;y++)
{
if (this -> y >= y * 30 && this->y < (y + 1) * 30) break;
}

for(x = 0;x < 15;x++)
{
if (this -> x >= x * 30 && this->x < (x + 1) * 30) break;
}

return make_point(x, y);
}

Но, как вы можете заметить, это приведет к тому, что мой объект пойдет по следующему пути:
дорожка

Потому что он проверяет верхний левый угол, и если я двигаюсь вправо, это должно изменить точку начала, но я не могу понять, как это сделать. Когда я попытался добавить 30 (размер растрового изображения объекта), если он идет вправо, он останавливается в верхнем -> правом углу. Какое решение здесь?

0

Решение

Удалили большую часть моего ответа, так как, похоже, неправильно поняли вопрос. Но я оставлю эту часть о вашем get_grid функция быть сумасшедшим. Просто используйте математику (я предполагаю, что x а также y целые числа):

Point Enemy::get_grid()
{
return make_point(x / 30, y / 30);
}

Кроме того, если вы хотите взять свою позицию сетки и показать ее в центре плитки, где каждая плитка имеет площадь 30 пикселей, то сделайте следующее:

int pixelX = gridX * 30 + 15;
int pixelY = gridY * 30 + 15;
2

Другие решения

Вы просто должны быть в состоянии найти следующую открытую позицию по сетке, но должны следить за последним ходом, чтобы не возвращаться, например:

void movePlayer(){
const GridMap& gridMap = getGridMap(); //returns the 14x14 grid
const Position& currentPosition = getCurrentPosition(); //returns the current player position
const Position& previousPosition = _getPreviousPosition(); //private helper func
//returns a list of position where the current player at the given position can move to

//at point (x,y) you can move to NORTH,SOUTH,EAST, or WEST one unit, from the gridMap
//using the currentPosition, return the list of cells that the player at the given position can move to.
const PositionList& currentMovablePositions = _getMovablePosition(currentPosition,gridMap);
//return the first matching position that isn't currentPosition or previousPosition
const Position& nextMovePosition = _getNextMovablePosition(currentMovablePosition,currentPosition,previousPosition);

this->animateTo( nextMovePosition );

}

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector