• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Generowanie losowych kółek na ekranie w bibliotece sfml

0 głosów
817 wizyt
pytanie zadane 12 marca 2018 w C i C++ przez programkamil Początkujący (270 p.)
Chciałbym aby program wygenerował mi na ekranie np 100 losowych kółek(losowy rozmiar, kolor) jednak mam problem z napisaniem kodu do tego, wiem że powinna znaleźć się tam pętla for i funkcja srand() ale nie mam pomysłu jak sie do tego zabrać. Życzliwie proszę o pomoc.
komentarz 12 marca 2018 przez mokrowski Mędrzec (158,960 p.)
Pokaż kod który już posiadasz. Teraz nawet nie wiadomo jak Ci podpowiedzieć bo nie wiadomo co już potrafisz a czego nie.
komentarz 12 marca 2018 przez programkamil Początkujący (270 p.)
#include "stdafx.h"
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>
#include <SFML\System.hpp>
#include <math.h>


int main()
{
	float r;
	r = 100;
	float Pi = 3.14;

	sf::RenderWindow window(sf::VideoMode(800, 600), "Armatka");//główne

	sf::CircleShape kolo1(r);
	kolo1.setFillColor(sf::Color::Green);//kolo1 z obwodka
	kolo1.setOutlineThickness(-0.04*r);
	kolo1.setOutlineColor(sf::Color::Red);

	sf::CircleShape kolo2(0.3*r);
	kolo2.setFillColor(sf::Color::Yellow);//kolo2 z obwodka
	kolo2.setOutlineThickness(-0.04*r);
	kolo2.setOutlineColor(sf::Color::Magenta);


	sf::RectangleShape rectangle(sf::Vector2f(2 * r, 0.4*r));//kwadrat
	rectangle.setFillColor(sf::Color::Yellow);

	kolo1.setOrigin(r, r);
	kolo1.setPosition(3 * r, 3 * r);  //określanie pozycji i rozmiaru kółek
	kolo2.setOrigin(0.3*r, 0.3*r);
	kolo2.setPosition(3 * r, 3 * r);
	rectangle.setOrigin(0, 0.2*r);
	rectangle.setPosition(3 * r, 3 * r);


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

		window.clear();
		window.draw(kolo1);//wyświetlenie
		window.draw(kolo2);
		window.draw(rectangle);
		window.display();

		float dX = sf::Mouse::getPosition(window).x - rectangle.getPosition().x;  //ruch za myszką
		float dY = sf::Mouse::getPosition(window).y - rectangle.getPosition().y;
		float rotation = atan2(dY, dX);
		rotation *= 180 / Pi;

		rectangle.setRotation(rotation);

	}

	return 0;
}

 

komentarz 12 marca 2018 przez programkamil Początkujący (270 p.)
i od tej armatki na około muszą powstać te losowe kółka

2 odpowiedzi

0 głosów
odpowiedź 12 marca 2018 przez Ehlert Ekspert (215,230 p.)

Tworzysz sobie wektor z typem sf::CircleShape potem jakąś ładną funkcję, która inicjuje nowy obiekt. Dodawaj do wektora i tyle.

W pętli głównej programu dodaj fora z auto i wykonaj na oknie metodę draw. Wszystko w temacie.

Btw. Jak chcesz dostawać jakieś fajne efekty to polecam ograniczyć FPSy i dodać pętlę stałokrokową. Wtedy w programie masz jeden zegar a z czasu może korzystać każdy obiekt.

0 głosów
odpowiedź 12 marca 2018 przez mokrowski Mędrzec (158,960 p.)

Masz tu draft tego czego oczekujesz:

#include <SFML/Graphics.hpp>
#include <array>
#include <random>

constexpr static size_t window_width = 800;
constexpr static size_t window_height = 600;
constexpr static size_t max_circles = 100;
constexpr static size_t max_radius = 100;

std::array<sf::CircleShape, max_circles> createCircleArray() {
    std::random_device rd; 
    std::uniform_int_distribution<unsigned> distX(0, window_width);
    std::uniform_int_distribution<unsigned> distY(0, window_height);
    std::uniform_int_distribution<float> radius(0, max_radius);
    std::array<sf::CircleShape, max_circles> circles;
    for(auto& circle: circles) {
        circle = sf::CircleShape(radius(rd));
        circle.setFillColor(sf::Color::Transparent);
        circle.setOutlineColor(sf::Color::Red);
        circle.setOutlineThickness(2);
        circle.setPosition(distX(rd), distY(rd));
    }
    return circles;
}

void drawCircles(sf::RenderWindow& window, std::array<sf::CircleShape, max_circles>& circles) {
    for(auto& circle: circles) {
        window.draw(circle);
    }
}

int main()
{
    sf::RenderWindow window(sf::VideoMode(window_width, window_height), "Window");
    auto circles = createCircleArray();
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close window: exit
            if (event.type == sf::Event::Closed)
                window.close();
        }
        // Clear screen
        //window.clear();
        drawCircles(window, circles);
        window.display();
    }
    return EXIT_SUCCESS;
}

 

Podobne pytania

0 głosów
1 odpowiedź 859 wizyt
0 głosów
2 odpowiedzi 574 wizyt
pytanie zadane 28 sierpnia 2016 w C i C++ przez Kosmaty205 Początkujący (340 p.)
0 głosów
0 odpowiedzi 691 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez oski. eskimoski Początkujący (380 p.)

93,741 zapytań

142,677 odpowiedzi

323,294 komentarzy

63,323 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...