IFeel3 Temat założony przez niniejszego użytkownika |
[SFML] Problem ze skonstruowaniem obiektu (kurs) » 2014-04-22 18:34:26 Próbując napisać program analogiczny jak w kursie tutaj: http://cpp0x.pl/kursy/Wytwarzanie-Gier-2D-C++/Wprawianie-obiektow-gry-w-ruch/415 natknąłem się na problem, ponieważ widocznie używam nowszej wersji biblioteki. Otóż błąd kompilacji wyskakuje przy ostatniej pętli, gdzie podaje złe argumenty do klasy sf::Shape::Circle : for( VObiektyT::const_iterator i = vObiekty.begin(); i != vObiekty.end(); ++i ) oknoAplikacji.Draw( sf::Shape::Circle( i->x, i->y, 10, sf::Color::Red ) );
Zastanawiałem się jak ten problem rozwiązać, ponieważ wystarczyłoby jako argument podać wskaźnik do obiektu sf::CircleShape. Wpadłem na pomysł, aby zdefiniować w klasie Object zmienną, która reprezentowałaby kształt, w tym wypadku koła. W jaki sposób to zrobić? Czy istnieje prostsze rozwiązanie? Poniżej wklejam kod: main.cpp #include <SFML/Window.hpp> #include <SFML/Graphics.hpp> #include <vector> #include "Object.h"
int main() { sf::RenderWindow OknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Okno Aplikacji" ); typedef std::vector < Object > VObjectT; VObjectT VObiekty; VObiekty.push_back( Object( 50, 50, 1.0 ) ); VObiekty.push_back( Object( 100, 250, 3.5 ) ); VObiekty.push_back( Object( 300, 100, 5.0 ) ); VObiekty.push_back( Object( 500, 500, 2.5 ) ); while( OknoAplikacji.isOpen() ) { sf::Event zdarzenie; while( OknoAplikacji.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) OknoAplikacji.close(); if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape ) OknoAplikacji.close(); } VObiekty[ 0 ].Przesun( 300, 300 ); VObiekty[ 1 ].Przesun( 400, 300 ); VObiekty[ 2 ].Przesun( 40, 30 ); VObiekty[ 3 ].Przesun( 250, 250 ); OknoAplikacji.clear(); for( VObjectT::const_iterator it = VObiekty.begin(); it != VObiekty.end(); it++ ) { OknoAplikacji.draw( sf::CircleShape( it->ksztalt ) ); } OknoAplikacji.display(); } return 0; }
Object.h (Object.cpp raczej nie jest potrzebny) #ifndef OBJECT_H #define OBJECT_H
class Object { public: Object(); Object( float f_x = 0.0, float f_y = 0.0, float f_v = 1.0 ); float x; float y; float v; sf::Shape ksztalt; void Przesun( float, float ); protected: private: };
#endif
|
|
pekfos |
» 2014-04-22 19:18:11 wystarczyłoby jako argument podać wskaźnik do obiektu sf::CircleShape. Wpadłem na pomysł, aby zdefiniować w klasie Object zmienną, która reprezentowałaby kształt, w tym wypadku koła. W jaki sposób to zrobić? Czy istnieje prostsze rozwiązanie? |
Tak, te po 'wystarczyłoby'. Nie. |
|
IFeel3 Temat założony przez niniejszego użytkownika |
» 2014-04-22 19:59:45 Dziękuję za wyczerpującą odpowiedź, ale potrzebuję w jakiś sposób dostarczyć informacji o zmieniających się współrzędnych x i y. |
|
pekfos |
» 2014-04-26 20:39:29 Gdzie dostarczyć? Masz w Object składowe x i y. |
|
bnk120 |
» 2014-04-27 02:34:26 Zastanów się co ma reprezentować klasa Object. Ten tutorial co podałeś jest napisany dla SFML 1.6. Spójrz, w jaki sposób jest tworzony sf::Shape::Circle. Zobacz czy tak da radę tworzyć obiekty w nowszej wersji SFML, a jeżeli nie da, to znajdź inny sposób by je utworzyć. |
|
CodeMeister |
» 2014-04-27 10:53:56 Nie rozumiem po co tworzysz zmienne x i y w Object, gdy pozycje można ustawić bezpośrednio w CircleShape (setPosition()). Dodatkowo jako argument .draw() podaj tego CircleShapea z klasy Object zamiast tworzyć jego kopię. Warto zaznaczyć także że zamiast implementować własną funkcje do przesuwania obiektów można użyć metody move(). Jeśli chcesz pisać gry to zacznij lepiej od tutoriala SFML 2.0 (jest dostępna wersja 2.1 w wersji ang ale nie ma większych różnic) Jeśli w miarę ogarniasz ang (nie musi być poziom master hardcore :p) znajdź na YT filmy gościa CodingMadeEasy i jego serię o SFML 2.0 bardzo fajnie tłumaczy for( VObjectT::const_iterator it = VObiekty.begin(); it != VObiekty.end(); it++ ) { OknoAplikacji.draw( it->ksztalt ); }
i tutaj zmiana na: sf::CircleShape ksztalt; (Object.cpp) i w konstruktorze ustaw mu odpowiednie wartości |
|
IFeel3 Temat założony przez niniejszego użytkownika |
» 2014-05-02 19:13:24 Dziękuję za odpowiedzi, spróbuję przy tym trochę podłubać |
|
« 1 » |