Wicon Temat założony przez niniejszego użytkownika |
Biblioteka SFML 2.0 Wprawianie obiektu w ruch » 2013-06-15 19:58:34 Witam, to mój pierwszy post więc się przedstawię może najpierw. Nazywam się Rafał, znajomi mówią na mnie Wicon. Chciałem stworzyć swój pierwszy obiekt wprawiony w ruch. Do tej pory wszystkie problemy udawało mi się rozwiązywać samemu, jednak teraz kompletnie nie mam pojęcia co mam robić. Pracuję w środowisku Visual C++ 2010. Próbowałem wprawić obiekt w ruch zgodnie z tym tutorialem znajdującym się na tym forum w dziale: Wytwarzanie gier 2D. Robiłem wszystko na prawdę dokładnie, czytałem, starałem się zrozumieć itd. i wszystko było dobrze, dopóki nie dodałem tej części kodu: for( VObiektyT::const_iterator i = vObiekty.begin(); i != vObiekty.end(); ++i ) oknoAplikacji.draw( sf::Shape::Circle( i->x, i->y, 10, sf::Color::Red ) ); Problem jest ze słówkiem "Circle". Na początku pomyślałem, że pewnie coś źle zrobiłem, przeanalizowałem kod kilka razy i w końcu zdeterminowany postanowiłem wszystko skasować i wkleić gotowy kod z tutoriala, o którym wspomniałem i okazało się, że ja nie jestem niczemu winny. Słówko "Circle" nadal było podkreślone jako błąd i kod się nie kompilował. Wygląda na to, że słówko Circle nie jest przez kompilator rozpoznawane. Oto log kompilacji: 1>------ Build started: Project: MyGame, Configuration: Debug Win32 ------ 1> Main.cpp 1>c:\wicon\programy\mygame\mygame\mygame\main.cpp(84): error C2039: 'Circle' : is not a member of 'sf::Shape' 1> c:\wicon\programy\microsoft visual studio 10.0\library\sfml2.0\include\sfml\graphics\shape.hpp(44) : see declaration of 'sf::Shape' 1>c:\wicon\programy\mygame\mygame\mygame\main.cpp(84): error C3861: 'Circle': identifier not found ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Gdy stawiam drugi dwukropek po słówku Shape, pojawia się lista rozwijana tego, co mogę tam wpisać, ale nigdzie nie ma tam żadnych figur, pojawiają się natomiast następujące słówka: draw, drawable, getFillColor itd. nie będę oczywiście wszystkich wymieniał. Biblioteka SMFL 2.0 raczej została zainstalowana i skonfigurowana poprawnie, bo test biblioteki został przeprowadzony pomyślnie i wszystkie poprzednie czynności, które z pomocą tej biblioteki wykonywałem, też były wykonywane bez większych problemów. Myślę, że opis problemu jest wystarczająco szczegółowy, proszę mi powiedzieć co jest przyczyną tego błędu i jak go rozwiązać. |
|
MrPoxipol |
» 2013-06-15 20:32:47 |
|
Wicon Temat założony przez niniejszego użytkownika |
» 2013-06-15 22:43:21 Jeśli zamiast sf::Shape::Circle wpiszę sf::CircleShape to wciąż Visual C++ podkreśla mi "sf" jako błąd. To część logu kompilacji, która mówi o tym błędzie: 1>c:\wicon\programy\mygame\mygame\mygame\main.cpp(89): error C2661: 'sf::CircleShape::CircleShape' : no overloaded function takes 4 arguments |
|
MrPoxipol |
» 2013-06-15 22:53:17 Widocznie nie wystarczy zmienić tylko nazwy, ale też i argumenty(ich ilość). Popatrz w dokumentacje.
/edit: W 2.0 nie ma takiego konstruktora, więc musisz to rozdzielić. |
|
Wicon Temat założony przez niniejszego użytkownika |
» 2013-06-15 23:34:07 Wziąłem to na swój łeb i napisałem taki kod, tylko czy jest on poprawny z punktu widzenia programisty? #include <SFML/Graphics.hpp>
using namespace sf;
int main() { int x, y; x = 400; y = 300; bool spr = false; CircleShape kolo( 50 ); kolo.setFillColor( Color( 150, 50, 250 ) ); kolo.setOutlineThickness( 5 ); kolo.setOutlineColor( Color( 0, 255, 0 ) ); kolo.setPosition( x, y ); RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Wytwarzanie Gier 2D, C++ | http://cpp0x.pl" ); while( oknoAplikacji.isOpen() ) { if( spr == false ) { x = x - 1; y = y - 1; if( x < 151 ) spr = true; }; if( spr == true ) { x = x + 1; y = y + 1; if( x > 399 ) spr = false; }; kolo.setPosition( x, y ); Event zdarzenie; while( oknoAplikacji.pollEvent( zdarzenie ) ) { if( zdarzenie.type == Event::Closed ) oknoAplikacji.close(); if( zdarzenie.type == Event::KeyPressed && zdarzenie.key.code == Keyboard::Escape ) oknoAplikacji.close(); }; oknoAplikacji.clear(); oknoAplikacji.draw( kolo ); oknoAplikacji.display(); }; return 0; }; 1 przebieg pętli to 1 klatka, idea ta została zachowana, kółko jest przez cały czas w ruchu i przemieszcza się w tą i z powrotem po takim torze, po jakim chciałem. No ale tak jak już napisałem, nie jestem pewien czy ten kod jest napisany poprawnie i czy programista może pisać gry w taki sposób, czy raczej nie powinien. |
|
MrPoxipol |
» 2013-06-16 09:59:08 Z tego co widzę, to tak, ale mam jedną uwagę. Zamiast pisać x = x + 1 lepiej jest pisać x += 1 , ponieważ takie użycie jest szybsze. |
|
Wicon Temat założony przez niniejszego użytkownika |
» 2013-06-16 12:40:23 Ok, to dzięki za pomoc, zamykam temat. |
|
« 1 » |