SFML CircleShape运动无效

时间:2015-08-07 11:47:59

标签: c++ sfml

我试图在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;

}

0 个答案:

没有答案