我试图在SFML中的屏幕上随机位置和位置生成10个圆圈。由于某些原因,因为添加事件,运动不起作用(不确定使用兰德是否导致问题)。
事件代表两种不同的模式,其中一个圆圈应该从屏幕边界反弹,而在第二个模式中它们应该以随机位置和速度重新出现。圆圈只是闪烁,然后重新出现在随机位置,而且不会超过5-6个。
我已经尝试在事件内外绘制圈子,以为我不了解事件过程。没有什么可以跟踪已经过去的时间,但是我已经编写了另一个功能齐全的SFML程序,它可以使用几乎完全相同的代码并且不使用时钟,唯一的区别就是只有#ts ss一个圆圈被移动。
float SIZE = 750;
struct Stone
{
sf::CircleShape st;
sf::Vector2f velocity;
Stone(float x, float y, float p1, float p2)
{
sf::Vector2f velocity (x,y);
st.setRadius(stoneRadius);
st.setFillColor(sf::Color::Black);
st.setOrigin(stoneRadius, stoneRadius);
st.setPosition(p1, p2);
}
....
void update_bounce()
{
st.move(velocity);
if (st.getPosition().x - stoneRadius <= 0)
velocity.x = -velocity.x;
else if ((st.getPosition().x + stoneRadius) >= SIZE)
velocity.x = -velocity.x;
if (st.getPosition().y - stoneRadius <= 0)
velocity.y = -velocity.y;
else if (st.getPosition().y + stoneRadius >= SIZE)
velocity.y = -velocity.y;
}
void update()
{
srand ( time(NULL) );
st.move(velocity);
if ( (st.getPosition().x - stoneRadius) <= 0 || (st.getPosition().x + stoneRadius) <= SIZE
|| (st.getPosition().y - stoneRadius) <= 0 || (st.getPosition().y - stoneRadius >= SIZE) )
{
float v = rand() % 4 + (6);
float p1 = rand () % 1500 + (-750);
float p2 = rand () % 1500 + (-750);
velocity.x = v;
velocity.y = v;
st.setPosition(p1, p2);
}
}
};
...
int main()
{
srand ( time(NULL) );
sf::RenderWindow window(sf::VideoMode(SIZE, SIZE), "test");
window.setFramerateLimit(30);
...
vector<Stone> gameStones;
for (int x = 0; x< 10; x++) {
float v = rand() % 12 + (-6);
float p1 = rand() % 1500 + (-750);
float p2 = rand() % 1500 + (-750);
gameStones.push_back(Stone(v,v,p1,p2));
}
while(window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Q)
{
window.close();
break;
}
else if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::R)
{
for(i=0; i<10; i++)
gameStones[i].update();
....
}
}
else if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::B)
{
for(i=0; i<10; i++)
gameStones[i].update_bounce();
....
}
}
window.clear(sf::Color::White);
window.draw(gameStones[0].st);
window.draw(gameStones[1].st);
window.draw(gameStones[2].st);
window.draw(gameStones[3].st);
window.draw(gameStones[4].st);
window.draw(gameStones[5].st);
window.draw(gameStones[6].st);
window.draw(gameStones[7].st);
window.draw(gameStones[8].st);
window.draw(gameStones[9].st);
...
window.display();
}
}
return 0;
}