Я сделал карту с Tiled. Каждая плитка этого измеряет 32x32 px
как и мой главный герой спрайт.
В моем классе Player.cpp
У меня есть некоторые функции, которые вычисляют deltaY/X
которые решат, собираетесь ли вы Left/Right/Up/Down
а затем вы используете их в функции обновления.
Это мой код до сих пор:
void Player::moveX(int moveDirection) {
deltaX = moveDirection * PlayerConstants::WALK_SPEED;
playAnimation(deltaX > 0 ? "WalkRight" : "WalkLeft");
facing = deltaX > 0 ? DIRECTION ::RIGHT : DIRECTION::LEFT;
}
void Player::moveY(int moveDirection) {
deltaY = moveDirection * PlayerConstants::WALK_SPEED;
playAnimation(deltaY < 0 ? "WalkUp" : "WalkDown");
facing = deltaY < 0 ? DIRECTION ::UP : DIRECTION::DOWN;
}
void Player::update(float elapsedTime) {
_x += deltaX * elapsedTime;
_y += deltaY * elapsedTime;
AnimatedSprite::update(elapsedTime);
}
Скорость ходьбы 0.1
прямо сейчас.
Есть какие-нибудь догадки о том, как переместить его плиткой по плитке?
Вот что ты мог сделать.
Создайте 2 глобальные переменные, скажем, x_overflow
а также y_overflow
, Теперь в функции обновления вместо непосредственного добавления deltaX и deltaY к _x и _y добавьте deltaX и deltaY к x_overflow и y_overflow. Затем добавьте пару if-statments, проверяющих, больше ли x_overflow и y_overflow желаемое расстояние (я предполагаю 32px), и, если они есть, переместите вашего персонажа на 32px.
Что-то вроде этого
void Player::update(float elapsedTime) {
x_overflow += deltaX * elapsedTime;
y_overflow += deltaY * elapsedTime;
if (x_overflow >= 32) {
_x += 32;
x_overflow = 0;
}
else if (x_overflow <= -32) {
_x -= 32;
x_overflow = 0;
}
if (y_overflow >= 32) {
_y += 32;
y_overflow = 0;
}
else if (y_overflow <= -32) {
_y -= 32;
y_overflow = 0;
}
AnimatedSprite::update(elapsedTime);
}
Я на самом деле не тестировал этот код (то есть не копировал вставку), но вы должны понять основную идею и реализовать ее самостоятельно. Удачи!
Других решений пока нет …