почему не срабатывает move() для sf::CircleShape

441
02 ноября 2017, 07:16

Не получается задать движение шаров в функции update():

#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <vector>
#include <iostream>
using namespace std;
using namespace sf;

constexpr unsigned BALLS_COUNT = 4;
const string WINDOW_TITLE = "Moving balls";
constexpr unsigned WINDOW_WIDTH = 800;
constexpr unsigned WINDOW_HEIGHT = 600;
struct Ball
{
    CircleShape shape;
    Vector2f offset;
};
void pollEvents(RenderWindow& window)
{
    Event event{};
    while (window.pollEvent(event))
    {
        switch (event.type)
        {
        case Event::Closed:
            window.close();
            break;
        default:
            break;
        }
    }
}
void update(vector<Ball>& balls, float deltaTime)
{
    for (auto ball: balls)
    {
        //cout << "ball.shape.getPosition().x == " << ball.shape.getPosition().x << endl;
        //cout << "ball.shape.getPosition().y == " << ball.shape.getPosition().y << endl;
        //cout << "deltaTime == " << deltaTime << endl;
        //cout << "ball.offset.x == " << ball.offset.x << endl;
        //cout << "ball.offset.y == " << ball.offset.y << endl;
        ball.shape.move(ball.offset * deltaTime);
    }
}
void redrawFrame(RenderWindow& window, vector<Ball>& balls)
{
    window.clear();
    for (auto ball: balls)
    {
        window.draw(ball.shape);        
    }
    window.display();
}
void init(vector<Ball>& balls)
{
    const vector<Color> colors = {
        Color(128, 64, 255),
        Color(255, 64, 128),
        Color(128, 255, 64),
        Color(64, 128, 255)    
    };
    const vector<Vector2f> speeds = {
        { 100.f, 100.f },
        { -150.f, -150.f },
        { 200.f, 200.f },
        { -250.f, -250.f }    
    };
    const vector<float> sizes = {
        40,
        40,
        40,
        40
    };    

    const vector<Vector2f> positions = {
        { sizes.at(0), sizes.at(0) },
        { WINDOW_WIDTH - 3 * sizes.at(1), WINDOW_HEIGHT - 12 * sizes.at(1) },
        { WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2 },
        { WINDOW_WIDTH - 3 * sizes.at(3), WINDOW_HEIGHT - 3 * sizes.at(3) }
    };
    for (int i = 0; i < BALLS_COUNT; ++i)
    {
        balls.at(i).offset = speeds.at(i);
        balls.at(i).shape.setRadius(sizes.at(i));
        balls.at(i).shape.setPosition(positions.at(i));
        balls.at(i).shape.setFillColor(colors.at(i));
    }    
}
int main()
{
    Clock clock;
    ContextSettings settings;
    RenderWindow window(VideoMode({WINDOW_WIDTH, WINDOW_HEIGHT}), WINDOW_TITLE, Style::Default, settings);
    vector<Ball> balls(BALLS_COUNT);
    init(balls);
    while (window.isOpen())
    {
        float deltaTime = clock.restart().asMilliseconds();
        pollEvents(window);
        update(balls, deltaTime);
        redrawFrame(window, balls);
    }
}    
Answer 1

Потому что так вы получаете копии значений:

for (auto ball: balls)

Делайте так:

for (auto& ball: balls)

Ну, или работайте через итераторы или [] :)

READ ALSO
msvc2010: ошибка: C2440: инициализация: невозможно преобразовать

msvc2010: ошибка: C2440: инициализация: невозможно преобразовать

Использую std::multiset Он определен в подключаемых заголовках vs2010 Компилятор (msvc2010) ругается на то, что я неверно инициализирую экземпляр std::multiset::const_iterator,...

333
WINAPI/Winapi C++, отрисовка Bitmap

WINAPI/Winapi C++, отрисовка Bitmap

При отрисовке изображения Bitmap оно накладывается на само себя, а если выносить вне, то происходит мерцание изображения

513
Poco &amp; Mysql = ошибка Error in my_thread_global_end(): 1 threads didn&#39;t exit

Poco & Mysql = ошибка Error in my_thread_global_end(): 1 threads didn't exit

Использую библиотеку Poco в своем проектеА именно подключение к mysql

328
Ошибка при конвертации BSTR в QString

Ошибка при конвертации BSTR в QString

У меня есть функция, которая делает выборку по WMI, вот пример - https://msdnmicrosoft

252