0

そのため、ゲーム エンジンを SDL から SFML に移植していましたが、入力システムに問題が発生しました。入力.h


#ifndef BULLWHIP_INPUT_H
#define BULLWHIP_INPUT_H
#include 

class bc_Input
{
    public:
        bool bm_KeyHit(sf::Key::Code key);
        bool bm_KeyDown(sf::Key::Code key);
        int bm_MouseX();
        int bm_MouseY();
        void bm_init(sf::RenderWindow app);
    private:
        sf::RenderWindow App;
        const sf::Input& input;
};

#endif

入力.cpp


#include "Input.h"

bool bc_Input::bm_KeyDown(sf::Key::Code key)
{
    return in.IsKeyDown(key)
}

bool bc_Input::bm_KeyHit(sf::Key::Code key)
{
    sf::Event event;
    while(App.GetEvent(event) && event.Type == sf::Event::KeyPressed)
    {
        switch(event.Key.Code)
        {
            case key: return true; break;
            default:
                break;
        }
    }

}

void bc_Input::bm_init(sf::RenderWindow app)
{
    App = app;
    in = App.GetInput();
}

int bc_Input::bm_MouseX()
{
    return in.GetMouseX();
}

int bc_Input::bm_MouseY()
{
    return in.GetMouseY();
}

これからこれらのエラーが発生します:

C:\c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: エラー: 'bc_Input::App' は定数式に表示できません C:\c++\sdl\bullwhip\lib\Bullwhip\/Input .h:15: エラー: '.' 定数式 C:\c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: エラー: 関数呼び出しを定数式 C:\c++\sdl\bullwhip\lib\ に含めることはできませんBullwhip\/Input.h:15: エラー: ISO C++ はメンバー 'input' の初期化を禁止しています C:\c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: エラー: 'input' を静的にしています C:\ c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: エラー: 非整数型 'sf::Input&' の静的データ メンバーの無効なクラス内初期化

c:\program files (x86)\codeblocks\mingw\bin../lib/gcc/mingw32/4.4.0/../../../../include/SFML/System/NonCopyable.hpp:57 : エラー: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)' はプライベートです c:\program files (x86)\codeblocks\mingw\bin../lib/gcc/mingw32/4.4.0/.. /../../../include/SFML/Window/Window.hpp:56: エラー: このコンテキスト内

4

1 に答える 1

0

ここでコピー コンストラクターを呼び出しています。

void bc_Input::bm_init(sf::RenderWindow app)
{
    App = app;
    in = App.GetInput();
}

エラー メッセージの 1 つに注意してください。

error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)

この問題を回避するには、初期化リストとともに sf::Input オブジェクトに実際のコンストラクターを使用する必要があります。

別の方法として、上位のサブシステムで sf::RenderWindow を既に初期化している場合 (よくあることですが)、メンバー変数 App を参照に変更するだけでうまくいくはずです。

//header
sf::RenderWindow& App;
...
//source
void bc_Input::bm_init(sf::RenderWindow& app)
{
    App = app;
    in = App.GetInput();
} 
于 2011-04-08T20:44:41.627 に答える