【问题标题】:Random shape and movement generation not drawing shape随机形状和运动生成不绘制形状
【发布时间】:2021-08-20 02:42:47
【问题描述】:

我最近一直在编写一个简单的 C++ 和 SFML 程序,但遇到了困难。基本上我想做两件事:

  1. 我想生成一些随机坐标的圆
  2. 我想让这些圆圈在屏幕上随机移动

我认为最好为圆圈使用矢量,这样我就可以使用 am int 来确定形状的数量。

坐标生成正确,但形状未绘制到屏幕上!

这是我的代码:

#include "SFML/Graphics.hpp"
#include <stdlib.h>
#include <iostream>

int main()
{
    srand(time(NULL));

    const int WINDOW_X = 800;
    const int WINDOW_Y = 480;

    sf::RenderWindow window(sf::VideoMode(WINDOW_X, WINDOW_Y), "Epidemic Simulation", sf::Style::Close | sf::Style::Titlebar);

    int numPeople = 2;
    float size = 5;
    int status = 0;

    //Declare CircleShape
    std::vector<sf::CircleShape> person(size);

    //Change color depending on status
    for (int i = 0; i < numPeople; i++)
    {
        if (status == 0)
            person[i].setFillColor(sf::Color::Green);
        else if (status == 1)
            person[i].setFillColor(sf::Color::Red);
        else if (status == 2)
            person[i].setFillColor(sf::Color::Black);
        else
        {
            std::cout << ("Error: Incorrect color value");
            person[i].setFillColor(sf::Color::Green);
        }
    }

    //Generate random coordinates for each circle
    for (int i = 0; i < numPeople; i++)
    {
        int xPos = rand() % WINDOW_X - (size * 2);
        int yPos = rand() % WINDOW_Y - (size * 2);

        if (xPos < (size * 2))
            xPos = 0;

        if (yPos < (size * 2))
            yPos = 0;

        std::cout << ("X position: ") << xPos << (", Y position: ") << yPos << "\n";
    }

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

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

        //Draw circle
        for (int i = 0; i < numPeople; i++)
            window.draw(person[i]);

        window.display();
    }

    return 0;
}

知道为什么形状没有绘制吗?以及如何让形状沿随机方向移动?

【问题讨论】:

  • 您将随机圆心位置传递给图形系统的位置在哪里?

标签: c++ random sfml


【解决方案1】:

看来您只需要进行一些更改。

主要的(来自diff 命令的输出)是:

>     // Give the circles definite radius value and segment count:
>     for (int i = 0; i < numPeople; i++)
>     {
>         person[i].setRadius(size);
>         person[i].setPointCount(100);
>     }

还有:

    // Generate random coordinates for each circle:
    for (int i = 0; i < numPeople; i++)
    {
        int xPos = rand() % WINDOW_X - (size * 2);
        int yPos = rand() % WINDOW_Y - (size * 2);
        ... <clip> ...
        person[i].setPosition(xPos, yPos);
    }

旁注:

srand()rand() 函数是旧版 C API 的一部分。它们不适用于新的 C++ 代码。建议#include &lt;random&gt; 标头并使用 C++11 API。详情见论文:n3551.pdf

【讨论】:

  • 太棒了,感谢您的帮助!我最终肯定会调查随机库。我现在主要只是使用 rand 来启动和运行。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多