web-dev-qa-db-fra.com

Comment faire appel à une fonction trouvée sur un autre fichier?

Récemment, je commence à utiliser C++ et la bibliothèque SFML. Je me demandais si je définissais un Sprite dans un fichier appelé "player.cpp", comment l'appellerais-je dans ma boucle principale située dans "main.cpp"?

Voici mon code (sachez qu'il s'agit de SFML 2.0 et non de 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;
}

Là où j’ai besoin d’aide, c’est dans le main.cpp Où il est écrit window.draw(); dans mon code de tirage. Dans cette parenthèse, il devrait y avoir le nom du Sprite que je veux charger à l'écran. Aussi loin que j'ai cherché et essayé en devinant, je n'ai pas réussi à faire fonctionner cette fonction de dessin avec mon Sprite sur l'autre fichier. Je sens que je manque quelque chose de grand, et très évident (sur les deux fichiers), mais encore une fois, chaque professionnel était une fois un novice.

54
Safixk

Vous pouvez utiliser des fichiers d'en-tête.

Bonnes pratiques.

Vous pouvez créer un fichier nommé player.h déclare toutes les fonctions nécessaires aux autres fichiers cpp de ce fichier d’en-tête et les inclut si nécessaire.

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

Ce n'est pas une bonne pratique, mais cela fonctionne pour de petits projets. déclarez votre fonction dans main.cpp

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


int playerSprite();  // Here

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

Petit ajout à la réponse de @ user995502 sur l'exécution du programme.

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

5
rahuljain1311

Votre Sprite est créé à mi-chemin de la fonction playerSprite ... il est également hors de portée et cesse d’exister à la fin de cette même fonction. Le Sprite doit être créé pour que vous puissiez le transmettre à playerSprite pour l’initialiser et également pour votre fonction de tirage.

Peut-être le déclarer au-dessus de votre premier while?

0
cppguy