通过瓷砖移动瓷砖

时间:2017-07-27 13:26:23

标签: c++ sdl-2 tiled

我用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

有关如何通过平铺移动它的任何猜测?

1 个答案:

答案 0 :(得分:1)

这是你能做的。

创建2个名为x_overflowy_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);
}

我还没有真正测试过这段代码(即不要复制粘贴),但你应该了解它背后的主要思想并自己实现。祝你好运!