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

[SFML] Problem ze skonstruowaniem obiektu (kurs)

Ostatnio zmodyfikowano 2014-05-02 19:13
Autor Wiadomość
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 :

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 ) );


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
C/C++
#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 ) ); // petla, ktora mialaby odwolywac sie do ksztaltu
        }
       
       
        OknoAplikacji.display();
    }
   
   
   
    return 0;
}

Object.h (Object.cpp raczej nie jest potrzebny)
C/C++
#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;
    // wspolrzedne polozenia i predkosci
   
    sf::Shape ksztalt; // ?
   
   
   
    void Przesun( float, float );
   
   
   
protected:
private:
};

#endif // OBJECT_H

P-108520
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'.

C/C++
sf::Shape ksztalt; // ?
Nie.
P-108523
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.
P-108527
pekfos
» 2014-04-26 20:39:29
Gdzie dostarczyć? Masz w Object składowe x i y.
P-108771
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ć.
P-108784
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

C/C++
for( VObjectT::const_iterator it = VObiekty.begin(); it != VObiekty.end(); it++ )
{
   
    OknoAplikacji.draw( it->ksztalt ); // petla, ktora mialaby odwolywac sie do ksztaltu
}
i tutaj zmiana na:
sf::CircleShape ksztalt;
 (Object.cpp) i w konstruktorze ustaw mu odpowiednie wartości
P-108789
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ć
P-109117
« 1 »
  Strona 1 z 1