2016-06-28 8 views
0

テクスチャ、スプライト、音楽、フォント、サウンドなどをヘッダーに宣言するための構造があります。次に、対応する.cppファイルを使用して、テクスチャを対応するスプライトに設定するなどします。関数からのリソースのロードに関する問題C++/SFML

私はmainにstructオブジェクトを作成し、その関数を呼び出しました。しかし私が自分のプログラムを構築すると、何百万もの「宣言されていない識別子」のエラーが出ます。私は間違って何をしていますか?ここに私のコードです:

resources.h:

#ifndef __SFML__resources__ 
#define __SFML__resources__ 

#include "SFML/Audio.hpp" 
#include "SFML/Graphics.hpp" 

struct resources 
{ 
float opacity = 1.0; 

sf::Texture texturePlayer; 
sf::Texture textureSettingsMenu; 
sf::Sprite spriteSaveMenu; 
sf::Sprite spriteSettingsMenu; 
//start screen texture 
sf::Texture textureStart; 
//gamestate background sprite 
sf::Sprite spriteScreen; 
sf::Font font; 
sf::Font font2; 
int loadResources(); 
// hundreds more lines of declarations below 
//... 
}; 
#endif 

resources.cpp:

#include "resources.h" 


int resources::loadResources() 
{ 
if (!textureSaveMenu.loadFromFile("images/magicmenu3.png")) 
    return EXIT_FAILURE; 


if (!textureSettingsMenu.loadFromFile("images/inventorymenu.png")) 
    return EXIT_FAILURE; 

spriteSaveMenu.setTexture(textureSaveMenu); 
spriteSettingsMenu.setTexture(textureSettingsMenu); 

if (!textureStart.loadFromFile("images/skyocean.png")) 
    return EXIT_FAILURE; 

if (!font.loadFromFile("fonts/arial.ttf")) 
    return EXIT_FAILURE; 

if (!font2.loadFromFile("fonts/dominican.ttf")) 
    return EXIT_FAILURE; 

if (!musicBattle.openFromFile("audio/musicBattle.ogg")) 
    return EXIT_FAILURE; 
musicBattle.setVolume(20); 
musicBattle.setLoop(true); 


if (!musicOpening.openFromFile("audio/maintheme.ogg")) 
    return EXIT_FAILURE; 
musicOpening.setVolume(30); 
musicOpening.setLoop(true); 

if (!musicDefeat.openFromFile("audio/defeat.ogg")) 
    return EXIT_FAILURE; 
musicDefeat.setVolume(50); 
musicDefeat.setLoop(true); 

if (!musicForest.openFromFile("audio/forest.ogg")) 
    return EXIT_FAILURE; 
musicForest.setVolume(10); 
musicForest.setLoop(true); 

if (!musicWorldMap.openFromFile("audio/bluefields.ogg")) 
    return EXIT_FAILURE; 
musicWorldMap.setVolume(40); 
musicWorldMap.setLoop(true); 

if (!musicVillage.openFromFile("audio/welcomehome.ogg")) 
    return EXIT_FAILURE; 
musicVillage.setVolume(40); 
musicVillage.setLoop(true); 

//every single declared resource is set within this function 
//but the function is too large to display fully here 
} 

main.cppに:まず

#include "SFML/Audio.hpp" 
#include "SFML/Graphics.hpp" 
#include <iostream> 
#include "random.h" 
#include "player.h" 
#include "entity.h" 
#include "projectile.h" 
#include "enemy.h" 
#include "textDisplay.h" 
#include "pickup.h" 
#include "wall.h" 
#include "sword.h" 
#include "npc.h" 
#include "battlemenu.h" 
#include "cursor.h" 
#include "name.h" 
#include "itemshop.h" 
#include "characterselection.h" 
#include "mainmenu.h" 
#include "exp.h" 
#include "drops.h" 
#include "weaponshop.h" 
#include "armorshop.h" 
#include "startmenu.h" 
#include "room.h" 
#include "resources.h" 


int main() 
{ 
//create the main window 
sf::RenderWindow window(sf::VideoMode(720, 500), "Sky Ocean"); 
window.setFramerateLimit(60); 
window.setKeyRepeatEnabled(false); 

//View 
sf::View view1(sf::FloatRect(200, 200, 300, 200)); 
view1.setSize(sf::Vector2f(window.getSize().x, window.getSize().y)); 
view1.setCenter(sf::Vector2f(view1.getSize().x/2, view1.getSize().y/2)); 
window.setView(view1); 

//load resources 
struct resources resources1; 
resources1.loadResources(); 

//class object 
class player Player1; 
Player1.sprite.setTexture(texturePlayer); 

class player Player2; 
Player2.sprite.setTexture(texturePlayer); 
Player2.rect.setScale(1.6, 1.6); 
Player2.sprite.setScale(1.6, 1.6); 

//... 
} 
+2

"の#define \ _ \ _ SFML \ _ \ _リソース\ _ \ _" - 独自のコードで予約名を使用しないでください。アンダースコアで始まり、大文字と2つのアンダースコアを連続して含むシンボルは、実装のために予約されているため、コード内で使用しないでください。 –

+0

これを行うことはなぜ悪いことですか、それが私のエラーの原因ですか?名前を付ける正しい方法は何でしょうか?違いは何ですか? – anarchyistheanswer

+1

現在の問題の原因は何もありません。私はちょうどあなたに知らせると思った。そのような名前は正式に予約されているため、コンパイラや標準ライブラリで使用されている名前と名前が重複する可能性があるため、悪いことです。また、このような名前を '' undef'する動作が未定義の場合もあり、その他の頭痛の可能性があります。だから私は、 "予約された名前を使用しないでください"と言いたかっただけです:-)。あなたが尋ねたので、個人的には、 "sfml_resources.h"が保護していたヘッダーの場合は、そのヘッダーガードに "MY_PROJECT_SFML_RESOURCES_H"という名前を付けたでしょう。 –

答えて

2

、私はあなたがについてsomethingを読むことをお勧めしますヘッダーファイル。


resources.h実際には、使用される識別子の宣言は含まれていません。

コンパイラがそれらを見ることができるように、それらの宣言を含む#includeヘッダファイルが必要です。 SFML declarationを読んで、含める必要があるモジュールを確認し、#includeヘッダーファイルに入力してください。main.cppにのみ含まれています。したがって、main.cppには識別子の宣言が含まれています。コンパイラがresources.cppを読み込むと、その宣言が表示されないため、undeclared identifierエラーです。例えば

resources.hは次のようになります。

//... 

#include "entity.h" 

#include <SFML/Graphics.hpp> 
#include <Whatever.hpp> 

struct resources 
{ 

//... 
+0

しかし、すでにこれらのヘッダをentity.hの中に入れました – anarchyistheanswer

+0

私は既にresources.hの中にsfml/graphics.hppを含めるとこれを試しました – anarchyistheanswer

+2

すべてのファイルに' #include'ヘッダファイルがあります。それらは必要です(ソースファイルかヘッダーファイルか)。 – PcAF

関連する問題