• 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

VPS Starter Arubacloud
0 głosów
426 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 (155,460 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,630 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 (155,460 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ź 567 wizyt
0 głosów
2 odpowiedzi 203 wizyt
pytanie zadane 28 sierpnia 2016 w C i C++ przez Kosmaty205 Początkujący (340 p.)
0 głosów
0 odpowiedzi 285 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez oski. eskimoski Początkujący (380 p.)

92,454 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...