Optymalizacja tworzenia nowych obiektów SFM

0

Cześć, robię sobie prostą gierkę, która polega na zbieraniu bananów kulką - jeżeli kulka dotknie banana on znika, kulka się powiększa i gdzieś na mapie losowo powstaje nowy banan. Całość działa, ale nie wydaje mi się, że jest to odpowiednio zrobione i mógłby mi ktoś doradzić jak ulepszyć ten system, gdyż teraz operuje na 1 obiekcie wektora, gdzie raz go tworze i potem usuwam i tak w kółko ;D
Kod:

#include <SFML/Graphics.hpp>
#include"Ball.h"
#include"banana.h"
#include<cstdlib>
std::vector<banana> banany;
int main()
{

	srand(time(NULL));
	sf::RenderWindow window{ sf::VideoMode(800,600),"Pick-up" };
	window.setFramerateLimit(60);

	banany.emplace_back("banan.png", rand() % 768 + 32, rand() % 568 + 32); // tworzy banana losowo na mapie
	Ball ball(400, 300);
	sf::Event event;
	while (true)
	{
		
		window.pollEvent(event);
		window.clear();
		if (event.type == event.Closed)
		{
			window.close();
			break;
		}
		if (banany[0].bound().intersects(ball.globalb())) //funkcja sprawdzajaca czy kulka i sprite sie przecinaja
		{
			ball.zwieksz_rozmiar(ball);
			banany.pop_back();
			banany.emplace_back("banan.png", rand()%768+32, rand()%568+32); //znowu tworzy nowego banana 
		}
		ball.upgrade();
		banany[0].printbanana(window);//wyswietla banana 
		window.draw(ball);
		window.display();
	}
	
	return 0;

}

I jeszcze jedno pytanie z innej beczki, czy jest sposób, żeby kulka nie poruszała się po mapie ukosem, a tylko pionowo i poziomo?
Teraz to działa tak, jakby przy szybkiej zmianie klawisza np: z "D" na "W" kulka jedzie na pod katem 45* do obu osi ;)

1

Usuń vector i dodaj funkcję setNewPosition do klasy banana

#include <SFML/Graphics.hpp>
#include"Ball.h"
#include"banana.h"
#include<cstdlib>

int main()
{

    srand(time(NULL));
    sf::RenderWindow window{ sf::VideoMode(800,600),"Pick-up" };
    window.setFramerateLimit(60);

    banana banan("banan.png", rand() % 768 + 32, rand() % 568 + 32);
    Ball ball(400, 300);
    sf::Event event;
    while (true)
    {

        window.pollEvent(event);
        window.clear();
        if (event.type == event.Closed)
        {
            window.close();
            break;
        }
        if (banan.bound().intersects(ball.globalb())) //funkcja sprawdzajaca czy kulka i sprite sie przecinaja
        {
            ball.zwieksz_rozmiar(ball); // niepotrzebnie przekazujesz obiekt ball do funkcji wywołanej na rzecz tego samego obiektu 
            banan.setNewPosition(rand()%768+32, rand()%568+32);  // do implementacji
        }
        ball.upgrade();
        banan.printbanana(window);//wyswietla banana 
        window.draw(ball);
        window.display();
    }

    return 0;

}
0

Dobra, dodałem nową funkcje setNewPosition:

void banana::setNewPosition(float t_X, float t_Y)
{
	sprajt.setPosition(t_X, t_Y);
}

funkcje ball.zwieksz_rozmiar() tez porawiłem, żeby nie brała argumentu :) nie wiem czemu tak zrobiłem wcześniej
dzięki za pomoc, teraz to wyglada duzo lepiej!

1 użytkowników online, w tym zalogowanych: 0, gości: 1