C++ 如何创建有界反弹动画?(SFML)
我必须在一个打开的SFML中以一定角度移动一个球,并将其保持在窗口大小内(就像DVD一样),但我当前的函数使其处于底部,并且不会“反弹”。它滑过底部,到达另一个角落后停止。初始位置为(1,1)C++ 如何创建有界反弹动画?(SFML),c++,animation,sfml,C++,Animation,Sfml,我必须在一个打开的SFML中以一定角度移动一个球,并将其保持在窗口大小内(就像DVD一样),但我当前的函数使其处于底部,并且不会“反弹”。它滑过底部,到达另一个角落后停止。初始位置为(1,1) isLeftRight,istopbotom是检查它们是否到达边缘的布尔值简单解决方案 使用速度并操纵碰撞时的速度;然后,使用速度更新位置。 分别检查每条边,并在此基础上确定一个相关的速度分量 e、 g.(遵循你的价值观) //位置: 浮点数x=1.f; 浮动y=1.f; //速度: 浮动vx=0.1f;
isLeftRight
,istopbotom
是检查它们是否到达边缘的布尔值简单解决方案
使用速度并操纵碰撞时的速度;然后,使用速度更新位置。
分别检查每条边,并在此基础上确定一个相关的速度分量
e、 g.(遵循你的价值观)
//位置:
浮点数x=1.f;
浮动y=1.f;
//速度:
浮动vx=0.1f;
浮球vy=0.2f;
// ... 然后,内部循环:
//检查碰撞(并调整速度):
if(x<0.f)
vx=0.1f;
如果(x>640.f),则为else
vx=-0.1f;
if(y<0.f)
vy=0.2f;
如果(y>640.f),则为else
vy=-0.2f;
//更新位置(仍在循环内):
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;
const sf::Vector2f windowSize(640.f,640.f);
常数sf::矢量2f速度计数(0.1f,0.2f);
矢量2f位置(1.f,1.f);
sf::Vector2f速度=速度计数;
// ... 然后,内部循环:
//检查碰撞(并调整速度):
如果(位置x<0.f)
velocity.x=VelocityMount.x;
else if(position.x>windowSize.x)
velocity.x=-VelocityMount.x;
如果(位置y<0.f)
velocity.y=VelocityMount.y;
else if(position.y>windowSize.y)
velocity.y=-VelocityMount.y;
//更新位置(仍在循环内):
位置+=速度;
您应该注意到,速度是在循环的每次迭代中添加到位置的值,并且在不考虑与边碰撞时,速度不会改变
初始问题
最初的问题是,如果它没有碰到边缘,它总是朝着同一个方向移动(朝右下角)。这意味着它永远不会被允许上升到底部边缘以上(或远离右边缘)。如何检查
isTopBottom()
和isLeftRight()
?你在比较浮点数吗?我在比较“\u bubble.getPosition().x/y>=640”对于布尔值,窗口本身是640x640对象可能从顶部反弹,然后从侧面反弹。你的步进循环只有在从底部反弹时才会停止,不是吗?你必须停止任何边界的循环。
// 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;
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;