球物理,碰撞检测

时间:2016-05-02 16:50:30

标签: c++ sfml

我正在使用SFML进行2D游戏。我相信你知道那场比赛。这场比赛有2个盖帽和1个球,你必须把球击回敌人。你只能用那个挡块上下移动。但是我遇到了很多问题。我希望我的球能够表现得真实(物理上),特别是当它碰到阻挡时。

第二个问题是我不知道如何解决敌人阻挡的运动,因为我想对抗计算机。暂时我已经解决了这个问题:

if ball is above block: move block up if ball is under block: move block down

第三个是我不知道如何检查球是否击中阻挡。我已经尝试过SFML页面中的代码,但它根本不起作用。

int main()
{
    sf::ContextSettings settings;
    settings.antialiasingLevel = 8;
    float rychlost=5.0f;
    float rychlostKruhX=5.0f;
    float rychlostKruhY=5.0f;
    int okraj=28;
    int vyskaBloku,sirkaBloku;
    const int polomerKruhu=20;
    const int FPS=60;
    const int sirkaOkna=800;
    const int vyskaOkna=600;
    int blockX,blockY;


    RenderWindow window(VideoMode(sirkaOkna, vyskaOkna), "SFML works!",sf::Style::Default, settings);
    window.setFramerateLimit(FPS);

    Texture pozadie;
    if (!pozadie.loadFromFile("background.jpg")){
        return EXIT_FAILURE;
    }

    Sprite pozadieSprite(pozadie);


    Texture block;
    if (!block.loadFromFile("block.jpg")){
        return EXIT_FAILURE;
    }

    //ball
    CircleShape kruh(polomerKruhu);
    kruh.setFillColor(Color::White);
    kruh.setPosition(sirkaOkna/2-polomerKruhu/2,vyskaOkna/2-polomerKruhu/2);

    vyskaBloku=block.getSize().y;
    sirkaBloku=block.getSize().x;

    Sprite blockSpriteLeft(block);
    Sprite blockSpriteRight(block);
    //pozicia blokov
    blockSpriteLeft.setPosition(okraj,vyskaOkna/2-vyskaBloku/2);
    blockSpriteRight.setPosition(sirkaOkna-(okraj*2),vyskaOkna/2-vyskaBloku/2);

    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(pozadieSprite);
        //UP
        if (Keyboard::isKeyPressed(Keyboard::Up))
        {
             blockSpriteLeft.move(0, -rychlost);
             blockY=blockSpriteLeft.getPosition().y;
             //ak ide mimo okna
             if (blockY<0){
                 blockSpriteLeft.setPosition(okraj,0);
             }

        }
        //DOWN
        if (Keyboard::isKeyPressed(Keyboard::Down))
        {
             blockSpriteLeft.move(0, rychlost);
             blockY=blockSpriteLeft.getPosition().y;
             //if block is out of window
             if (blockY>vyskaOkna-vyskaBloku){
                 blockSpriteLeft.setPosition(okraj,vyskaOkna-vyskaBloku);
             }

        }
        //movement of ball
        kruh.move(-rychlostKruhX,rychlostKruhY);

        //if ball goes out of window
        if (kruh.getPosition().y<0){rychlostKruhY=-rychlostKruhY;}
        if (kruh.getPosition().y>vyskaOkna-polomerKruhu*2){rychlostKruhY=-rychlostKruhY;}

        //if the ball is behind the block
        if (kruh.getPosition().x < okraj) {break;}
        if (kruh.getPosition().x > sirkaOkna-2*okraj) {break;}

        //movement of right block (PC)
        if (kruh.getPosition().y > blockSpriteRight.getPosition().y) {blockSpriteRight.move(0,rychlost);}
        if (kruh.getPosition().y < blockSpriteRight.getPosition().y) {blockSpriteRight.move(0,-rychlost);}

        //if right block goes out of window
        if (blockSpriteRight.getPosition().y < 0 ) { blockSpriteRight.setPosition(sirkaOkna-2*okraj,0);}
        if ((blockSpriteRight.getPosition().y + vyskaBloku )> vyskaOkna ) { blockSpriteRight.setPosition(sirkaOkna-2*okraj,vyskaOkna-vyskaBloku);}


        window.draw(kruh);
        window.draw(blockSpriteLeft);
        window.draw(blockSpriteRight);
        window.display();

    }

    return 0;
}

0 个答案:

没有答案