【问题标题】:How to create bounded bounce animation? (SFML)如何创建有界反弹动画? (SFML)
【发布时间】:2019-11-20 01:50:58
【问题描述】:

我必须在打开的 SFML 中以一定角度移动一个球并将其保持在窗口大小内(就像 DVD 一样),但我当前的功能使它到底部并且不会“反弹”。它滑过底部并在到达另一个角落时停止。初始位置为(1,1)

void Bubble::updatePosition() {
  if( isTopBottom() ){
    do{
      _x += .1;
      _y += -.2;
    }while( !isTopBottom() );
  }

  else if( isLeftRight() ){
    do{
      _x += -.1;
      _y += .2;
    }while( !isLeftRight() );
  }

  else{
    _x += .1;
    _y += .2;
  }
  _bubble.setPosition(_x, _y);
}

isLeftRightisTopBottom 是布尔值,用于检查它们是否已到达边缘

【问题讨论】:

  • 如何检查isTopBottom()isLeftRight()?你在比较浮点数吗?
  • 我正在比较 "_bubble.getPosition().x/y >= 640" 的布尔值,窗口本身是 640x640
  • 对象可能会从顶部反弹,然后从侧面反弹。只有当它从底部反弹时,您的步进循环才会停止,不是吗?您必须停止循环使用任何类型的边界。

标签: c++ animation sfml


【解决方案1】:

简单的解决方案

使用速度并在碰撞时操纵速度;然后,使用速度来更新位置。 分别检查每条边,并据此决定一个相关的速度分量。

例如(遵循你的价值观)

// Positions:
float x = 1.f;
float y = 1.f;
// Velocities:
float vx = 0.1f;
float vy = 0.2f;

// ... then, inside loop:

// Check collisions (and adjust velocity):
if (x < 0.f)
    vx = 0.1f;
else if (x > 640.f)
    vx = -0.1f;
if (y < 0.f)
    vy = 0.2f;
else if (y > 640.f)
    vy = -0.2f;

// update position (still inside loop):
x += vx;
y += vy;

更清洁的解决方案

这与上面的简单解决方案相同,但由于您标记了 SFML,您可以使用 SFML 向量将两个组件保持在一起。还修改了变量名称以更清晰。将窗口的大小和速度量也从硬编码到逻辑中提取出来:

const sf::Vector2f windowSize(640.f, 640.f);
const sf::Vector2f velocityAmount(0.1f, 0.2f);
sf::Vector2f position(1.f, 1.f);
sf::Vector2f velocity = velocityAmount;

// ... then, inside loop:

// Check collisions (and adjust velocity):
if (position.x < 0.f)
    velocity.x = velocityAmount.x;
else if (position.x > windowSize.x)
    velocity.x = -velocityAmount.x;
if (position.y < 0.f)
    velocity.y = velocityAmount.y;
else if (position.y > windowSize.y)
    velocity.y = -velocityAmount.y;

// update position (still inside loop):
position += velocity;

您应该注意到,速度是在循环的每次迭代中添加到位置的值,并且在不考虑与边缘碰撞时速度不会改变。

最初的问题

您遇到的最初问题是,如果它没有碰到边缘,它总是朝同一个方向(朝向右下角)移动。这意味着它永远不会被允许超过底部边缘(或远离右侧边缘)。

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2021-11-17
    • 1970-01-01
    • 2020-06-17
    • 2017-04-05
    相关资源
    最近更新 更多