Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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();  
    //...

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

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


int playerSprite();  // Here

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

Ответ 2

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

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