C++ SDL PollEvent()从不返回任何内容

C++ SDL PollEvent()从不返回任何内容,c++,macos,io,sdl,C++,Macos,Io,Sdl,我想让SDL来检测OS X上的C++控制台应用程序/游戏的键盘活动,但是不仅是代码> SDLXPOLLY()/CUT>不返回任何键盘活动,就我可以从调试 SDLIIGEASE*中看出,它应该更新根本不更新。我使用SDL的经验相当于几分钟的网络教程,因此我确信在设置SDL时我没有正确执行某些操作,这导致了这个问题。下面是我编写的类,它管理事件的轮询,并在检测到请求的按键时通过回调通知对象(请参见listenForKeyEvents())。但是,由于它依赖于SDL\u polleevent(),因此

我想让SDL来检测OS X上的C++控制台应用程序/游戏的键盘活动,但是不仅是代码> SDLXPOLLY()/CUT>不返回任何键盘活动,就我可以从调试<代码> SDLIIGEASE*<代码>中看出,它应该更新根本不更新。我使用SDL的经验相当于几分钟的网络教程,因此我确信在设置SDL时我没有正确执行某些操作,这导致了这个问题。下面是我编写的类,它管理事件的轮询,并在检测到请求的按键时通过回调通知对象(请参见
listenForKeyEvents()
)。但是,由于它依赖于
SDL\u polleevent()
,因此它目前根本不做任何事情

using namespace std ;

template<class T>
struct KeyInputRegister {

    /**
     * The string representing the keyboard key
     * the client wishes to listen for
     */
    const char * requestedChar ;

    T * caller ;

    /**
     * A pointer to the function to be called
     * when the requested keyboard input is detected.
     */
    void (T::*callBack)() ;

    KeyInputRegister(const char* ch, T * callr, void (T::*cb)()) :
        requestedChar(ch), caller(callr), callBack(cb) {}

} ;

template <class T>
class InputController {

protected:
    static SDL_Event * event ;
    static std::thread * keyEventsThread ;

    static vector<KeyInputRegister<T>> * keyInputRegistry ;

    static void listenForKeyEvents() ;
    static void listenForKeyEvents_thread_start() ;

public:

    static void init() ;
    static void registerForKeypress(KeyInputRegister<T> & reg) ;
    static void exit() ;
} ;

template <class T>
void InputController<T>::init() {
    SDL_Init(SDL_INIT_EVERYTHING) ;
    keyInputRegistry = new vector<KeyInputRegister<T>> ;
    event = new SDL_Event() ;
    listenForKeyEvents_thread_start() ; 
}

template <class T>
void InputController<T>::listenForKeyEvents_thread_start() {
    void (*listenPtr)() = InputController<T>::listenForKeyEvents ;
    InputController<T>::keyEventsThread = new std::thread(listenPtr) ;
}

template <class T>
void InputController<T>::registerForKeypress(KeyInputRegister<T> & reg) {
    keyInputRegistry->push_back(reg) ;
}

template <class T>
void InputController<T>::listenForKeyEvents() {

    while (*GLOBAL_CONTINUE_SIGNAL) {
        if (SDL_PollEvent(event) == 1) {
            cout << "event detected!" << endl ;
            if (event->type == SDL_KEYDOWN) {

                auto key = event->key.keysym.sym ;
                const char * ch = SDL_GetKeyName(key) ;

                for (auto i = 0 ; i < keyInputRegistry->size() ; i++) {
                    if (ch == (keyInputRegistry->at(i).requestedChar)) {

                        T * callr = keyInputRegistry->at(i).caller ;

                        void (T::*callBak)() = (keyInputRegistry->at(i).callBack) ;

                        (callr->*callBak)();

                    }
                }
            }
        }
    }
}


/* An example use of KeyInputRegister and InputController: */

class GameObject {
    void moveForward() { cout << "moved forward!" << endl ; }

    void mfRegForCallback() {
        void (GameObject::*mvForwPtr)() = &GameObject::moveForward ;
        KeyInputRegister<GameObject> regMvF("w", this, mvForwPtr) ;
        InputController<GameObject>::registerForKeypress(regMvF) ;
    }
}


extern bool * GLOBAL_CONTINUE_SIGNAL = new bool(true) ;

#ifdef __cplusplus
extern "C"
#endif
int main(int argc, char ** argv) {
    InputController<GameObject>::init() ;
    GameObject player0 ;
    player0.mfregForCallback() ;
    usleep(1e9) ;
    *GLOBAL_CONTINUE_SIGNAL = false ;
    //other cleanup, etc.
    return 0;
}

#ifdef main
#undef main
#endif
int main(int argc, char ** argv) {
    int r = SDL_main(argc, argv) ; /*actually calls the above main(), which is redefined by SDL to be   
                                   SDL_main() */
    return r ;
}
使用名称空间std;
模板
结构键输入寄存器{
/**
*表示键盘键的字符串
*客户希望听取客户的意见
*/
const char*requestedChar;
T*主叫人;
/**
*指向要调用的函数的指针
*当检测到请求的键盘输入时。
*/
无效(T::*回调)();
KeyInputRegister(const char*ch,T*callr,void(T::*cb)():
requestedChar(ch)、调用者(callr)、回调(cb){}
} ;
模板
类输入控制器{
受保护的:
静态SDL_事件*事件;
静态std::thread*keyEventsThread;
静态向量*keyInputRegistry;
静态void listenForKeyEvents();
静态void listenForKeyEvents_thread_start();
公众:
静态void init();
静态无效寄存器workeypress(KeyInputRegister®);
静态空洞出口();
} ;
模板
void InputController::init(){
SDL_Init(SDL_Init_EVERYTHING);
keyInputRegistry=新向量;
事件=新的SDL_事件();
listenForKeyEvents_thread_start();
}
模板
void InputController::listenForKeyEvents\u thread\u start(){
void(*listenPtr)()=InputController::listenForKeyEvents;
InputController::keyEventsThread=new std::thread(listenPtr);
}
模板
无效InputController::RegisterWorkyPress(KeyInputRegister®){
按键输入注册表->推回(reg);
}
模板
void InputController::listenForKeyEvents(){
while(*全局\u继续\u信号){
如果(SDL_PollEvent(事件)==1){
cout key.keysym.sym;
const char*ch=SDL_GetKeyName(键);
对于(自动i=0;isize();i++){
if(ch==(keyInputRegistry->at(i).requestedChar)){
T*callr=keyInputRegistry->at(i).caller;
void(T::*callBak)(=(keyInputRegistry->at(i).callBack);
(callr->*callBak)();
}
}
}
}
}
}
/*KeyInputRegister和InputController的使用示例:*/
类游戏对象{

void向前移动(){cout我在您的代码中没有看到任何对SDL_Init的调用,请看一看,它显示了一个非常基本的示例,说明了SDL应用程序应该如何设置。在您可以轮询事件之前,您必须确保SDL正在正确运行。

我将其添加到我的代码中,但它似乎没有任何区别。好的,您从来没有这样做过,这也非常有趣在SDL程序中创建一个窗口。如果没有窗口,我不知道SDL的行为,我认为如果没有有效的SDL窗口,就不可能获得关键事件!尝试在SDL_Init(…)之后使用
SDL_Surface*screen=SDL_SetVideoMode(640、480、32、SDL_全屏| SDL_HWSURFACE)创建一个窗口
或类似的代码。可能的关系:我不确定,但我觉得这是不可能的。你可以有一个隐藏了标志窗口或类似的窗口,你可以在funtion sdl_CreativeWindow上查看sdl的wiki。这样你可以使用事件,而不必显示窗口。关于如何获取基本应用程序的两个教程正在进行的OSX可以在这里找到-。您可以使用其中一个并实现现有代码的其余部分。