Как вызвать функцию, найденную в другом файле?

недавно я начал собирать C++ и библиотеку SFML, и мне было интересно, определил ли я спрайт в файле, который называется "player.cpp "как бы я назвал его на моем основном цикле, расположенном в" main.cpp"?

вот мой код (имейте в виду, что это SFML 2.0, а не 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;
}

плеер.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;
}

Как, где мне нужна помощь, находится в " main.cpp", где говорится окно.draw (); в моем коде рисования. В этой скобке, там должно быть имя Спрайта, который я хочу загрузить на экран. Насколько я искал, и пытался угадать. Мне не удалось заставить эту функцию рисования работать с моим спрайтом в другом файле. Я чувствую, что мне не хватает чего-то большого и очень очевидного (в обоих файлах), но опять же, каждый профессионал когда-то был новичком.

3 ответов


вы можете использовать заголовочные файлы.

хорошая практика.

вы можете создать файл с названием player.h объявить все функции, которые нужны другим cpp файлы в заголовочный файл и включать его при необходимости.

плеер.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

плеер.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();  
    //...

не очень хорошая практика, но работает для небольших проектов. объявите свою функцию в главный.cpp

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


int playerSprite();  // Here

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

небольшое дополнение к ответу @user995502 о том, как запустить программу.

g++ player.cpp main.cpp -o main.out && ./main.out


ваш спрайт создается в середине пути через функцию playerSprite... он также выходит за рамки и перестает существовать в конце той же функции. Спрайт должен быть создан, где вы можете передать его playerSprite для инициализации, а также где вы можете передать его в свою функцию draw.

возможно, объявите его выше вашего первого while?