最近、C++とSFMLライブラリを取り上げ始めました。「player.cpp」という名前のファイルでSpriteを定義した場合、「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;
}
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();
と書かれています。その括弧内には、画面にロードしたいスプライトの名前があるはずです。私が検索し、推測してみた限り、他のファイルのスプライトでその描画関数を機能させることに成功していません。私は何か大きなものを見逃しているように感じます(どちらのファイルでも)、しかし再び、すべてのプロはかつて初心者でした。
ヘッダーファイルを使用できます。
いい練習。
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();
//...
プログラムの実行方法に関する@ user995502の回答への小さな追加。
g++ player.cpp main.cpp -o main.out && ./main.out
SpriteはplayerSprite関数の途中で作成されます...また、スコープ外になり、同じ関数の最後に存在しなくなります。 Spriteは、playerSpriteに渡して初期化するか、描画関数に渡すことができる場所で作成する必要があります。
おそらく、最初のwhile
の上に宣言しますか?