undefined reference to `player::ruch(int, sf::Sprite)

0

Mam błąd, którego nie umiem naprawić. W miejscach w programie oznaczonych strzałką pojawia mi się błąd:

undefined reference to `player::ruch(int, sf::Sprite)

Sprawdzałem czy sfml jest prawidłowo skonfigurowany ale było prawidłowo skonfigurowane.

#include <SFML/Graphics.hpp>

struct player                               //struktura gracz
{
    sf::Sprite sprajt;                      //sprajt gracza
    sf::Texture tekstura_1;
    void ruch(int i, sf::Sprite sprit);      //funkcja pozwalająca na poruszanie się
  //  void grawitacja(int i);                 //funkcja odpowiedzialna za grawitacje
};

int main()
{
    sf::RenderWindow okno( sf::VideoMode( 1280, 800, 32 ), "SpaceWar" );
    sf::RectangleShape podloga( sf::Vector2f( 1280, 50 ) ); // tworzymy prostok¹t
    podloga.setPosition( 0, 750 ); // i ustawiamy mu pozycjê
    podloga.setFillColor(sf::Color(0, 245, 62));
    player gracz;
    gracz.tekstura_1.loadFromFile("kwadrat.png");     //"pomalowanie" tekstury
    gracz.sprajt.setTexture(gracz.tekstura_1);


    while( okno.isOpen() )
    {
        sf::Event zdarzenie;
        while( okno.pollEvent( zdarzenie ) )
        {
            int rucha =0 ;

            if( zdarzenie.type == sf::Event::Closed )
                 okno.close();

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 okno.close();

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Left )
            {
                rucha = 1;
                gracz.ruch(rucha, gracz.sprajt);   // <-----------------------------
            }

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Right )
            {
                rucha = 2;
                gracz.ruch(rucha, gracz.sprajt);    // <----------------------------------
            }

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down)
            {
                rucha = 3;
                gracz.ruch(rucha, gracz.sprajt);    // <----------------------------------------
            }


            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up)
              {
                rucha = 4;
                gracz.ruch(rucha, gracz.sprajt);  // <-----------------------------------------
            }

            rucha = 0;
        }
        okno.clear( sf::Color( 0, 150, 255 ) );
        okno.draw(gracz.sprajt);
        okno.draw(podloga);
        okno.display();
    }
    return 0;
}

void ruch(int i, sf::Sprite sprit)
{
    switch(i)
    {
    case 1:
            sprit.move(10,0); 
            break;
    case 2:
            sprit.move(-10,0);
            break;
    case 3:
            sprit.move(0,10); 
            break;
    case 4:
            sprit.move(0,-10);
            break;
    }
        return;
}

//void grawitacja()
//{
  //  int k;
   // k = 3;
  //  void ruch(3);
//}
2

Musi być

void player::ruch(int i, sf::Sprite sprit)
1

rucha
xD a moze jednak nie rucha :D

nie masz zdefiniowanej funkcji

player::ruch(int, sf::Sprite)

jedynie masz (popatrz, ze nie ma nigdzie player)

void ruch(int i, sf::Sprite sprit)
0

Zaznaczyłem złe linijki kodu z błędem. Zaraz poprawię.

1

Strzałki pokazują wywołania gracz.ruch bo napisałeś

void ruch(int i, sf::Sprite sprit)
{
    switch(i)
    {
    case 1:
            sprit.move(10,0); 
            break;
    case 2:
            sprit.move(-10,0);
            break;
    case 3:
            sprit.move(0,10); 
            break;
    case 4:
            sprit.move(0,-10);
            break;
    }
        return;
}

zamiast

void player::ruch(int i, sf::Sprite sprit)
{
    switch(i)
    {
    case 1:
            sprit.move(10,0); 
            break;
    case 2:
            sprit.move(-10,0);
            break;
    case 3:
            sprit.move(0,10); 
            break;
    case 4:
            sprit.move(0,-10);
            break;
    }
        return;
}
0

Program się uruchomił. Problemem było to że kwadrat się nie rusza. Problemem było chyba to że przesyłałem sprajta do funkcji przez wartość. Zamieniłem wartość na wskaźnik i program się nie urochamia.

#include <SFML/Graphics.hpp>

struct player                               //struktura gracz
{
    sf::Sprite sprajt;                      //sprajt gracza
    sf::Texture tekstura_1;
    void ruch(int i, sf::Sprite sprit);      //funkcja pozwalająca na poruszanie się
  //  void grawitacja(int i);                 //funkcja odpowiedzialna za grawitacje
};

int main()
{
    sf::Sprite* wskaz;
    sf::RenderWindow okno( sf::VideoMode( 1280, 800, 32 ), "SpaceWar" );
    sf::RectangleShape podloga( sf::Vector2f( 1280, 50 ) ); // tworzymy prostok¹t
    podloga.setPosition( 0, 750 ); // i ustawiamy mu pozycjê
    podloga.setFillColor(sf::Color(0, 245, 62));
    player gracz;
    wskaz =& gracz.sprajt;
    gracz.tekstura_1.loadFromFile("kwadrat.png");     //"pomalowanie" tekstury
    gracz.sprajt.setTexture(gracz.tekstura_1);


    while( okno.isOpen() )
    {
        sf::Event zdarzenie;
        while( okno.pollEvent( zdarzenie ) )
        {
            int rucha =0 ;

            if( zdarzenie.type == sf::Event::Closed )
                 okno.close();

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 okno.close();

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Left )
            {
                rucha = 1;
                gracz.ruch(rucha, wskaz);
            }

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Right )
            {
                rucha = 2;
                gracz.ruch(rucha, wskaz);
            }

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down)
            {
                rucha = 3;
                gracz.ruch(rucha, wskaz);
            }


            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up)
              {
                rucha = 4;
                gracz.ruch(rucha, wskaz);
            }

            rucha = 0;
        }
        okno.clear( sf::Color( 0, 150, 255 ) );
        okno.draw(gracz.sprajt);
        okno.draw(podloga);
        okno.display();
    }
    return 0;
}

void player::ruch(int i, sf::Sprite sprit)
{
    switch(i)
    {
    case 1:
            sprit.move(10,0); //  <--------------------
            break;
    case 2:
            sprit.move(-10,0); // <-----------------------
            break;
    case 3:
            sprit.move(0,10); // <--------------------------
            break;
    case 4:
            sprit.move(0,-10); // <---------------------------
            break;
    }
        return;
}

//void grawitacja()
//{
  //  int k;
   // k = 3;
  //  void ruch(3);
//}
0

Żeby to zadziałało musisz jeszcze w deklaracji zaznaczyć, że przekazujesz sprit przez wskaźnik

void ruch(int i, sf::Sprite *sprit);

oraz zmienić sprit.move na sprit->move w player::ruch

1 użytkowników online, w tym zalogowanych: 0, gości: 1