Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建有界反弹动画?(SFML)_C++_Animation_Sfml - Fatal编程技术网

C++ 如何创建有界反弹动画?(SFML)

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;

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

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;