Пытаясь создать класс для простого эксперимента по отскоку мяча, где я ошибаюсь? - PullRequest
0 голосов
/ 30 июня 2018

Я очень новичок в программировании на С ++ и пытаюсь создать простую программу с использованием SFML, в которой можно создавать шары, которые будут подпрыгивать. Тем не менее, я застрял еще до того, как попал в симулятор физики. Кажется, я не могу заставить свой класс по мячу работать. Я хотел использовать его для хранения переменных для каждого созданного шара, а также для обновления и рисования функций. Но каждый раз, когда я сталкиваюсь с какой-то ошибкой, я не могу найти помощи по чему-то настолько простому.

#include <iostream>

#include <SFML\Audio.hpp>
#include <SFML\Graphics.hpp>
#include <SFML\Network.hpp>
#include <SFML\System.hpp>
#include <SFML\Window.hpp>


class Ball
{
public:

    // vector for position
    sf::Vector2 pos(100,100);

    // vector for velocity
    sf::Vector2 vel(0,0);

    void update()
    {
        // factors influence velocity
        // update position based on velocity
        pos.x += vel.x;
        pos.y += vel.y;
    }

    void draw()
    {
        // draw ball to the window using position vector
        sf::circleShape circle(10);
        circle.setPosition(pos.x,pos.y);
        circle.setFillColor(sf::Color::White);
        window.draw(circle);
    }
};

int main()
{
    /*create window settings*/
    sf::ContextSettings settings;
    settings.antialiasingLevel = 8; // set the antialiasing level

    /*create window*/
    sf::RenderWindow window;
    window.create(sf::VideoMode(800, 600), "Simple Physics", sf::Style::Default, settings);

    /*create ball(s)*/
    Ball ball01;

    /*Main loop*/
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            // "close requested" event: close the window
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear(sf::Color::White);

        // call ball.update(); and ball.draw();
        ball01.update();
        ball01.draw();

        window.display();
    }
}

Любая помощь или крит будет принята с благодарностью, заранее спасибо!

1 Ответ

0 голосов
/ 30 июня 2018

Попробуйте этот фрагмент:

1) Ваш цвет фона должен отличаться от цвета мяча.

2) Используйте window.setFramerateLimit () для замедления анимации.

3) Используйте граничное условие, чтобы мяч не выходил из поля зрения.

4) Draw () также нуждается в коррекции

class Ball
{
public:

    // vector for position
    sf::Vector2f pos{ 100, 100 };

    // vector for velocity
    sf::Vector2f vel{ 1, 1 };

    void update()
    {
        // factors influence velocity
        // update position based on velocity
        pos.x += vel.x;
        pos.y += vel.y;

        if (pos.x > 800 || pos.x < 0) vel.x = -vel.x; //boundary cond
        if (pos.y > 600 || pos.y < 0) vel.y = -vel.y; //boundary cond
    }

    void draw(sf::RenderWindow& window)
    {
        // draw ball to the window using position vector 
        sf::CircleShape circle(10);
        circle.setPosition(pos.x, pos.y);
        circle.setFillColor(sf::Color::White);

        window.draw(circle);
    }
};

int main()
{
    /*create window settings*/
    sf::ContextSettings settings;
    settings.antialiasingLevel = 8; // set the antialiasing level

                                    /*create window*/
    sf::RenderWindow window;
    window.create(sf::VideoMode(800, 600), "Simple Physics", sf::Style::Default, settings);

    /*create ball(s)*/
    Ball ball01;

    window.setFramerateLimit(60); //slow down speed
    /*Main loop*/
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            // "close requested" event: close the window
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear(sf::Color::Black); // ball is white so make backgnd black

        // call ball.update(); and ball.draw();
        ball01.update();
        ball01.draw(window);
        window.display();
    }
}
...