Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Biblioteka SFML 2.0 Wprawianie obiektu w ruch

Ostatnio zmodyfikowano 2013-06-16 12:40
Autor Wiadomość
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:
C/C++
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ć.
P-85638
MrPoxipol
» 2013-06-15 20:32:47
Przykłady z kursu o wytwarzaniu gier 2D są napisane pod SFML 1.6.

odpowiednik dla SFML 2.0: http://www.sfml-dev.org/documentation/2.0 /classsf_1_1CircleShape.php.
P-85642
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
P-85659
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ć.
P-85660
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?
C/C++
#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.
P-85663
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.
P-85666
Wicon
Temat założony przez niniejszego użytkownika
» 2013-06-16 12:40:23
Ok, to dzięki za pomoc, zamykam temat.
P-85673
« 1 »
  Strona 1 z 1