• 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

Object Storage Arubacloud
0 głosów
447 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 (156,140 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 (212,870 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 (156,140 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ź 582 wizyt
0 głosów
2 odpowiedzi 211 wizyt
pytanie zadane 28 sierpnia 2016 w C i C++ przez Kosmaty205 Początkujący (340 p.)
0 głosów
0 odpowiedzi 314 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez oski. eskimoski Początkujący (380 p.)

92,660 zapytań

141,553 odpowiedzi

319,993 komentarzy

62,028 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...