SFML - Dynamická alokace paměti – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

SFML - Dynamická alokace paměti – C / C++ – Fórum – Programujte.comSFML - Dynamická alokace paměti – C / C++ – Fórum – Programujte.com

 

Kenvelo+2
Super člen
8. 10. 2015   #1
-
0
-

Zdravím, zasekl sem se u alokace paměti pro texturu. Mám funkci která vykresluje pole 10x10 o velikosti čtverce 50x50

a potřeboval bych pro třídní funkci alokovat paměť jelikož neznám přesný počet vykreslených textur. Funkce se dá přirovnat ke grafickému editoru. Když kliknu do pozice x : 7 a y 6 tak zde by se měla vykreslit má zvolená textura

class brush
{
public:
	.....
	void draw(sf::RenderWindow &window);

private:
	sf::Texture t_Grass1;
	sf::Sprite s_Grass1;
};

void brush::draw(sf::RenderWindow &window)
{
	s_Grass1.setTexture(t_Grass1);
	
}

Vše ostatní mám jen nevím jak alokovat paměť pro s_Grass1.

Předem díky za radu.

Nahlásit jako SPAM
IP: 89.177.211.–
Díky bohu, že počítače vymysleli muži. Kdyby to byly ženy, tak binární soustavu reprezentují jedničky, nuly a "možná"
ondrej39+1
Věrný člen
8. 10. 2015   #2
-
0
-

#1 Kenvelo
Však ty s_Grass1 nepoužíváš jako pointer, místa už máš dost, na stacku, stačí do něho přiřadit hodnotu, nebo co ti na tom nefunguje?

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
Kenvelo+2
Super člen
9. 10. 2015   #3
-
0
-

#2 ondrej39
Asi sem to špatně vysvětlil ta textura se má vykreslit na pozici tam kde kliknu myší a myslím, že bez alokace to nejde. Respektive pozice ukládám do pole ale je hloupost tvorit pole o 2000 prvcích když se textura vytvoří třeba jen 4x nebo bude potřeba větší pole. Jen prostě nevím jak to udělat..

Nahlásit jako SPAM
IP: 89.177.211.–
Díky bohu, že počítače vymysleli muži. Kdyby to byly ženy, tak binární soustavu reprezentují jedničky, nuly a "možná"
ondrej39+1
Věrný člen
9. 10. 2015   #4
-
0
-

#3 Kenvelo
A co ti nefunguje na tomto způsobu?

void brush::draw(sf::RenderWindow &window) {
    s_Grass1.setTexture(t_Grass1);

    auto x = static_cast<float>(sf::Mouse::getPosition(window).x);
    auto y = static_cast<float>(sf::Mouse::getPosition(window).y);

    s_Grass1.setPosition(sf::Vector2f(x, y));
    window.draw(s_Grass1)
}
Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Kenvelo+2
Super člen
9. 10. 2015   #5
-
0
-

#4 ondrej39
Mno nevím jak to funguje, textura se sice zobrazí na určitém místě ale když kliknu myší znovu tak se přepíše pozice a vykreslí se jinde. Potřebuji aby tam kde kliknu zůstala
 

void brush::draw(sf::RenderWindow &window)
{
		s_Grass1.setTexture(t_Grass1);

		if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
		{
			auto x = static_cast<float>(sf::Mouse::getPosition(window).x);
			auto y = static_cast<float>(sf::Mouse::getPosition(window).y);
			s_Grass1.setPosition(sf::Vector2f(x, y));
		}

			
				
				window.draw(s_Grass1);

		
	
}
Nahlásit jako SPAM
IP: 89.177.196.–
Díky bohu, že počítače vymysleli muži. Kdyby to byly ženy, tak binární soustavu reprezentují jedničky, nuly a "možná"
ondrej39+1
Věrný člen
9. 10. 2015   #6
-
0
-

#5 Kenvelo
Nabízejí se ti dvě možnosti...

1) Chceš mít jednu instanci třídy brush a kdykoliv když zavoláš brush::draw chceš, aby se vykreslila další položka. V tomto případě budeš potřebovat přímo ve třídě brush kolekci sf::Sprite, třeba std::vector<sf::Sprite>, pokaždé, když zavoláš brush::draw, vytvoří se ti nový sf::Sprite, přidá do kolekce a zavolá se window.draw(nověPřidanýSpriteDoKolekce).

2) Chceš mít více instanci třdy brush, protože třída brush vždycky vykreslí jen jeden sf::Sprite. V takovém případě budeš potřebovat někde výš ve svém programu například std::vector<brush>, když bude chtít někdo kreslit, tak se vytvoří nový brush a na něm se zavolá brush::draw.

Osobně bych se přikláněl spíš k prvnímu z těch dvou řešení, vzhledem k tomu, že brush vždycky bude kreslit stejnou věc.

P.S. Vypadá to, že sf::Sprite nemá nadefinovaný move konstruktor ani assignment operátor. V tom případě by možná bylo lepší namísto std::vector<sf::Sprite> použít std::vector<std::unique_ptr<sf::Sprite>>, abys zbytečně nekopíroval celé objekty.

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Kenvelo+2
Super člen
9. 10. 2015   #7
-
0
-

#6 ondrej39
První možnost nezní špatně jen teda jestli sem to pochopil dobře tak můžu vykreslovat jen s_Grass1 ale když budu mít druhou texturu s_Grass2 tak se přepíše přes tu první ? 

Nahlásit jako SPAM
IP: 89.177.196.–
Díky bohu, že počítače vymysleli muži. Kdyby to byly ženy, tak binární soustavu reprezentují jedničky, nuly a "možná"
ondrej39+1
Věrný člen
9. 10. 2015   #8
-
0
-

#7 Kenvelo
Nevím, jestli budu mít přesnou syntaxi správně, v C++ v poslední době zas tak moc nedělám, ale tady je nástřel řešení, jak nějak by to mohlo vypadat:

#include <vector>
#include <memory> // std::unique_ptr<T>

class brush
{
public:
    .....
    void draw(sf::RenderWindow &window);

private:
    sf::Texture t_Grass1;
    std::vector<std::unique_ptr<sf::Sprite>> sprites;
};

void brush::draw(sf::RenderWindow &window)
{
    auto grassSprite = std::unique_ptr<sf::Sprite>(new sf::Sprite(t_Grass1));

    if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
        auto x = static_cast<float>(sf::Mouse::getPosition(window).x);
        auto y = static_cast<float>(sf::Mouse::getPosition(window).y);
        grassSprite->setPosition(sf::Vector2f(x, y));
    }

    sprites.push_back(std::move(grassSprite));
    window.draw(grassSprite);
}
Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 63 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý