我正在开发2D益智游戏,其中一项功能就是能够推动板条箱,以便您可以爬上它们到达目的地。我已经尝试了许多方法来实现这一点,但没有一个能够成功。我的主要问题是我不知道在哪里放我的代码。例如,我不想在播放器类中处理板条箱的移动,因为这不会是整洁的,就像有些人说的那样“#34;如果你&#39重新下棋,典当和骑士的规则不应该符合女王的规则。如果有人有答案或可以提供伪代码解释,我们将不胜感激。
答案 0 :(得分:0)
在我的游戏中,我亲自使用Box2D来处理碰撞,因为它抽象了很多东西,你可以根据需要调查它。虽然如果你的游戏没有使用很多物理,使用纯SFML可能会节省更多时间。
就纯粹的SFML而言,你需要只检测两个盒子的边缘何时被击中,何时击中它们,同时移动两个盒子的#34;和"框"以同样的速度。
现在你可以使用SFML getGlobalBounds()和" intersect"完成这个任务,但我个人发现它并没有给我最好的结果(盒子看起来太多了#34;在彼此里面#34;在我看来)。以下是我在SFML中检查碰撞的一些代码:
此示例是当玩家从左侧推动框时(因此框与玩家一起向右移动)。
//variables outside of gameloop initialize what you want.
sf::RectangleShape player, dynamicBody; //used rectangles to test
... //go inside game loop...
//collide from left side
if (player.getPosition().x == (dynamicBody.getPosition().x - dynamicBody.getSize().x) && (player.getPosition().y == dynamicBody.getPosition().y))
{
dynamicBody.move(1, 0);
//release push
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
player.setPosition(player.getPosition().x - 1.0, player.getPosition().y);
}
}
注意这一行 player.setPosition(player.getPosition()。x - 1.0,player.getPosition()。y);
要释放推送,您需要提供一个小的delta值(1.0工作正常,但你可以降低),否则盒子往往会粘住。 delta值足够小,你不会注意到任何不稳定的动作。
向左推动框将与上面的代码类似(只是相反的值)。
要跳到框顶部,您可以通过多种方式处理。举个简单的例子,您可以重置" "地面价值"当玩家在它上面时,它是最重要的,然后在玩家离开时将地面值恢复正常。
如果您想了解更多信息,我会快速证明这一点:https://github.com/BenTarman/SFML-DynamicCollision/tree/master/sfmlDynamicCollision
就将代码放在面向对象程序中的位置而言,我首先会假设您的框由一个类表示。也许他们继承了一个"实体"上课,但这并不重要。如果这个类可以访问播放器精灵,你可以将逻辑放在那里的方法中。
此外,如果您想要更通用的东西,可以在碰撞类中处理此逻辑。这个类的方法最有可能采用2个精灵并返回布尔值来说明是否发生了碰撞。如果你的游戏只有盒子,我不会看到它的需要,但它仍然是一个很好的练习。如果您有疑问,可以随意提出新问题。