2013-04-09 10 views
37

Niedawno zacząłem zbierać C++ i bibliotekę SFML i zastanawiałem się, czy zdefiniowałem Sprite na pliku o nazwie "player.cpp", jak nazwałbym go w mojej głównej pętli znajdującej się w "main.cpp "?Jak wywołać funkcję znalezioną w innym pliku?

Oto mój kod (należy pamiętać, że jest to SFML 2.0, a nie 1.6!).

main.cpp

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 
#include "player.cpp" 

int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(800, 600), "Skylords - Alpha v1"); 

    while (window.isOpen()) 
    { 
     sf::Event event; 
     while (window.pollEvent(event)) 
     { 
      if (event.type == sf::Event::Closed) 
       window.close(); 
     } 

     window.clear(); 
     window.draw(); 
     window.display(); 
    } 

    return 0; 
} 

player.cpp

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 

int playerSprite(){ 
    sf::Texture Texture; 
    if(!Texture.loadFromFile("player.png")){ 
     return 1; 
    } 
    sf::Sprite Sprite; 
    Sprite.setTexture(Texture); 
    return 0; 
} 

Jak gdzie Potrzebuję pomocy jest w "main.cpp", gdzie mówi window.draw(); w moim kodzie losowania. W tym nawiasie powinna pojawić się nazwa Sprite, którą chcę załadować na ekran. O ile szukałem i próbowałem zgadywać. Nie udało mi się sprawić, by funkcja rysowania działała z moim ikonką na drugim pliku. Czuję, że brakuje mi czegoś dużego i bardzo oczywistego (w obu plikach), ale z drugiej strony każdy profesjonalista był kiedyś nowy.

Odpowiedz

49

Możesz użyć plików nagłówkowych.

Dobra praktyka.

Możesz utworzyć plik o nazwie player.h zadeklarować wszystkie funkcje, które są potrzebne, przez inne pliki cpp w tym pliku nagłówkowym i uwzględnić je w razie potrzeby.

player.h

#ifndef PLAYER_H // To make sure you don't declare the function more than once by including the header multiple times. 
#define PLAYER_H 

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 

int playerSprite(); 

#endif 

player.cpp

#include "player.h" // player.h must be in the current directory. or use relative or absolute path to it. e.g #include "include/player.h" 

int playerSprite(){ 
    sf::Texture Texture; 
    if(!Texture.loadFromFile("player.png")){ 
     return 1; 
    } 
    sf::Sprite Sprite; 
    Sprite.setTexture(Texture); 
    return 0; 
} 

main.cpp

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 
#include "player.h"   //Here. Again player.h must be in the current directory. or use relative or absolute path to it. 

int main() 
{ 
    // ... 
    int p = playerSprite(); 
    //... 

Nie taka dobra praktyka, ale działa na małe projekty. deklarują swoją funkcję w main.cpp

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 
// #include "player.cpp" 


int playerSprite(); // Here 

int main() 
{ 
    // ... 
    int p = playerSprite(); 
    //... 
+0

Dobrze, proszę pana, jesteś blisko uratowania mojego tyłka. Zawsze słyszałem o tych przeklętych plikach nagłówkowych, ale nigdy tak naprawdę nie zaglądałem do nich, są one dość ważne, prawda? Ale oto inne pytanie, kiedy już to zrobiłem i zaimportowałem je do "main.cpp", jak wyglądałby mój plik "main.cpp" w obszarze window.draw, jak by to poszło? – Safixk

+0

@Safixk Tak. Kiedy twój kod zacznie się powiększać, stają się niezwykle ważne. Proponuję utworzyć pliki nagłówkowe, jeśli masz więcej niż plik cpp –

+0

W porządku, wypróbuj swój nowy kod, który właśnie wysłałeś, sprawdź ponownie w 5 – Safixk

0

Twój sprite jest tworzony w połowie drogi poprzez funkcję playerSprite ... to też wykracza poza zakres i przestaje istnieć po zakończeniu tej samej funkcji. Sprite musi zostać utworzony w miejscu, w którym można go przekazać do playerSprite, aby go zainicjować, a także tam, gdzie można go przekazać do funkcji rysowania.

Być może zadeklarować powyżej swojego pierwszego while?

+2

Powinno to być komentarzem, ponieważ nie jest związane z pytaniem, które zadał – Chachmu

+3

był przeznaczony do rozwiązania jego problemu. czy zawsze skanujesz tygodniowe odpowiedzi, które chcesz wykorzystać? może potrzebujesz bardziej produktywnego hobby – cppguy

Powiązane problemy