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

OOP i SFML - I just don't get it...

Cloud VPS
0 głosów
425 wizyt
pytanie zadane 25 marca 2016 w C i C++ przez easytodo Mądrala (5,380 p.)

Witam, tak jak w temacie, mam straszne problemy z połączeniem OOPu i SFML'a.

Dopiero zaczynam przygodę z OOPem, rozumiem mniej więcej co, po co i jak i w konsoli sobie jakoś radzę z poukładaniem wszystkiego (oczywiście podstawy OOPu, na razie nie grzebię w polimorfizmie i funkcjach wirtualnych), ale takie podstawy jak np. dziedziczenie stosuję.

Chciałem spróbować stworzyć prostą grę - pokrótce: Bohater będący sprajtem porusza się po ekranie i zbiera punkty. Głębiej nie ma sensu opisywać, bo to nieistotne, ale oczywiście gra będzie dalej rozbudowywana. 

No ale pojawia się tytułowy problem. Może najpierw kod:

#include <iostream>
#include <SFML/Graphics.hpp>

class Hero
{
private:
	sf::Texture THero;
	sf::Sprite SHero;
public:
	void loadMedia()
	{
		THero.loadFromFile("hero.jpg");
		SHero.setTexture(THero);
	}
	void draw(sf::RenderWindow window)
	{
		window.draw(THero);
	}
};

class Point
{
private:
	sf::Texture TPoint;
	sf::Sprite SPoint;
public:
	void loadMedia()
	{
		TPoint.loadFromFile("dot.jpg");
		SPoint.setTexture(TPoint);
	}
};

int main()
{
	sf::RenderWindow window;
	window.create(sf::VideoMode(800, 600), "The Game v1.0");

	Hero hero;
	hero.loadMedia();

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

		hero.draw(window);

		window.display();
	}

	return 0;
}

Wcześniej próbowałem stworzyć klasę Window, tam zadeklarować okno i klasy Hero oraz Point dziedziczyć z Window żeby mieć dostęp do zmiennej okna, no ale to jest bez sensu bo wszystkie funkcje dostarczone przez SFML musiałbym "wsadzać" do funkcji w klasie, co jest dla mnie głupotą (np. window.display(), window.clear(), window.isOpen() ). 

Z drugiej strony, deklaracja okna w mainie jest dla mnie bardzo nieelegancka i chyba samego okna nie da się przesyłać do funkcji w klasie (u mnie wyskakują błędy kompilacji). 

Tak więc zwracam się do Was z prośbą o uratowanie mnie z opresji :D Proszę o ogólne przedstawienie jak to ma wyglądać, bo ja dostaję przy tym gorączki.

Ten kod jest "po przejściach", przerabiałem go 100 razy żeby wypróbować różne opcje więc wygląda jak wygląda, szczyt moich możliwości to nie jest, ale jak macie jakieś rady dla nowego to chętnie wysłucham :)

1 odpowiedź

0 głosów
odpowiedź 25 marca 2016 przez adrian17 Mentor (354,720 p.)
Kod który napisałeś na oko wygląda dobrze (poza paskudnym nazewnictwem pól, heh). Tylko musisz RenderWindow przekazać przez referencję.
komentarz 26 marca 2016 przez easytodo Mądrala (5,380 p.)
Po przekazaniu przez referencję w metodzie draw (klasa Hero) Visual podkreśla kropkę, błąd to: "no instance of overloaded function "sf::RenderWindow::draw" matches the argument list
argument types are: (sf::Texture)
object type is: sf::RenderWindow

Pomijając to, po prostu czuję, że kod nie powinien być zbudowany w ten sposób, może ktoś doświadczony powiedzieć, na jakie mniej więcej pliki go rozbić, gdzie dać pętlę główną programu?
1
komentarz 26 marca 2016 przez adrian17 Mentor (354,720 p.)
Na razie kod jest w miarę ok projektowo.

Okno nie rysuje tekstur, rysuj sf::sprite.

Podobne pytania

+4 głosów
0 odpowiedzi 431 wizyt
pytanie zadane 1 listopada 2016 w Nasze projekty przez Ehlert Ekspert (215,050 p.)
0 głosów
2 odpowiedzi 840 wizyt
0 głosów
1 odpowiedź 1,004 wizyt
pytanie zadane 6 sierpnia 2019 w C i C++ przez Kotleciok Nowicjusz (140 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 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

Kursy INF.02 i INF.03
...