2017-07-27 141 views
1

我已经完成了平铺平面地图。它的每一个瓷砖都会测量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现在。

任何猜测如何通过瓷砖来移动它的瓷砖?

+0

是'moveDirection'的值是-1还是1? – travisjayday

+0

@travisjayday确实是! – James

+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); 
} 

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

+0

它确实有道理。我现在就试试看,一旦它起作用,我会让你知道:)谢谢! – James

+0

请不要客气! – travisjayday

+0

它实际上工作!目前看起来不太光滑,但我会考虑如何解决它:)!谢谢 – James