C++ Visual Studio Express 2013 SDL_Init_SubSystem(SDL_INIT_EVENTS) 失败

Posted

技术标签:

【中文标题】C++ Visual Studio Express 2013 SDL_Init_SubSystem(SDL_INIT_EVENTS) 失败【英文标题】:C++ Visual Studio Express 2013 SDL_Init_SubSystem(SDL_INIT_EVENTS) fails 【发布时间】:2015-03-25 12:16:20 【问题描述】:

我正在尝试制作一个基本的游戏引擎,如果可以的话,我希望控制器由 SDL 运行。我的最终目标是将所有 SDL 特定代码抽象到一个 Controller 类中,但我现在只是想让它工作。这是我得到的:

//User defined Includes
#include <Atom.h>
#include <Timer.h>
#include <Renderer.h>
#include <OGLRenderingWindow.h>

//temp includes for now
#include <Box.h>
#include <Point.hpp>
#include <Color.hpp>

 int WINAPI WinMain(HINSTANCE hInstance,
               HINSTANCE hPrevInstance,
               LPSTR     cmdLine,
               S32       cmdShow) 

//Window settings, will be abstrated out to a config file later
const S32 windowHeight          = 1072;
const S32 windowWidth           = 768;
const S32 windowBPP             = 32;
const bool windowFullScreen     = false;

//Start up OGL Window
OGLRenderingWindow programWindow(hInstance);

if(!programWindow.Init(windowHeight, windowWidth, windowBPP, windowFullScreen)) 
    MessageBox(NULL, "Unable to create the OpenGL Window", "An Error occured", MB_ICONERROR | MB_OK);
    programWindow.ShutDown();
    return 1;


//Start Timer
Timer* timer = Timer::Instance();

Renderer* renderer = Renderer::Instance();

if(SDL_Init(0)) 
    MessageBox(NULL, "Unable to initialize SDL", "An Error occured", MB_ICONERROR | MB_OK);
    programWindow.ShutDown();
    return 1;


if(!SDL_InitSubSystem(SDL_INIT_EVENTS)) 
    MessageBox(NULL, "Unable to initialize SDL_EVENTS", "An Error occured", MB_ICONERROR | MB_OK);
    programWindow.ShutDown();
    return 1;


Point<> pos(0.0f, 0.0f, 0.0f);
Color<> col(1.0f, 0.0f, 0.0f);

Box redbox(25.0f, 25.0f, pos, col);

pos = new Point<>(80.0f, 80.0f, 0.0f);
col = new Color<>(0.0f, 0.0f, 1.0f);

Box greenbox(25.0f, 25.0f, pos, col);

pos = new Point<>(-80.0f, 80.0f, 0.0f);
col = new Color<>(0.0f, 1.0f, 0.0f);

Box bluebox(25.0f, 25.0f, pos, col);

//Main Loop Beings
while(programWindow.isRunning()) 
    //Proecess windows events
    programWindow.ProcessEvents();

    //Update the Timer
    timer->Update();

    //Test cell render
    redbox.v_Update();
    redbox.v_Render();
    greenbox.v_Render();
    bluebox.v_Render();
    //WorldManager Update

    //WorldManager Render

    //Force Render at the end of the frame
    renderer->Render();

    programWindow.Swap();

programWindow.ShutDown();

//redbox.v_ShutDown();
//greenbox.v_ShutDown();
//bluebox.v_ShutDown();
delete timer;
delete renderer;


return 0;

这里是被调用框的更新 (redbox.v_Update();)

void Box::v_Update(void) 

//_keyCode = _controller->UpdateInput();

SDL_Event event;

while (SDL_PollEvent(&event)) 
    switch (event.type)
        case SDL_KEYDOWN: 
            switch (event.key.keysym.sym) 
                case SDLK_UP:
                  _velosity = Vector<F32>(0.0f, 1.0f, 0.0f);
                  break;
                case SDLK_DOWN:
                  _velosity = Vector<F32>(0.0f, -1.0f, 0.0f);
                  break;
                case SDLK_RIGHT:
                case 3:
                  _velosity = Vector<F32>(1.0f, 0.0f, 0.0f);
                  break;
                case SDLK_LEFT:
                  _velosity = Vector<F32>(-1.0f, 0.0f, 0.0f);
                  break;
                default:
                  break;
            
        
    


F32 delta = _timer->DeltaTime() * _speed;
_position += Point<>( (_velosity.x * delta), (_velosity.y * delta), (_velosity.z * delta) );
_cell.SetPosition(_position);

如果 SDL 无法初始化事件子系统,我添加了一个错误消息框,到目前为止,确实如此。我在链接器中链接到 SDL2.lib 和 SLD_Init(0);不会出错。我也尝试将它作为 SDL_Init(SDL_INIT_EVENTS),但它失败了。

Atom.h 有一些我喜欢使用的 typedef。具体如下:

#ifndef ATOM_H
#define ATOM_H

//Includes. These will be the files that everything will need to have access to
//User defined Includes
#include <KillerMath.h>
//Sytem and library includes
#include <windows.h>

//Signed Typedefs
typedef signed __int8   S8;
typedef signed __int16  S16;
typedef signed __int32  S32;
typedef signed __int64  S64;

//Unsigned Typedefs
typedef unsigned __int8  U8;
typedef unsigned __int16 U16;
typedef unsigned __int32 U32;
typedef unsigned __int64 U64;

//Floating types
typedef float  F32;
typedef double F64;

#endif

所以,这是我的基本问题:

    这是使用 SDL 处理控制器的正确方法吗?关键是使控制器类成为一个组件,可以在运行时根据组件映射从盒子中添加和删除。我想以这种方式使用它,以便我可以控制用户控制的对象。

    所有的图形都由 opengl 处理,并且工作正常。如果我对键事件的值进行硬编码,并强制更新速度向量,它会毫无问题地移动框,所以我知道系统的一部分正在工作。似乎只是 SDL 是问题所在,而且它似乎无法初始化。你能发现我对 Init SDL 做错了什么吗?

【问题讨论】:

你检查过 SDL_GetError 吗? 据我了解,在大多数/所有平台上,SDL 都需要一个本机窗口句柄才能将自身插入事件循环中以处理事件。通常的程序是让 SDL 通过SDL_CreateWindow() 自行创建该窗口。也许尝试SDL_Init(SDL_INIT_EVERYTHING) 然后SDL_CreateWindowFrom()OGLRenderingWindowHWND 【参考方案1】:

@Rollen 你是对的,问题是 SDL 没有窗口句柄。我试图将生成的 hwnd 传递给 SDL 以使控制器/键盘输入正常工作,但我无法正确处理(很可能是因为我不完全理解 SDL)。将来,我可能会制作一个只使用 SDL 的项目,以便更好地了解它的工作原理。目前,DirectInput 就像一个冠军,我在很短的时间内启动并运行它。感谢您的输入。

【讨论】:

以上是关于C++ Visual Studio Express 2013 SDL_Init_SubSystem(SDL_INIT_EVENTS) 失败的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio C++ 2010 Express中的程序错误

在 Visual Studio 2012 Express 中设置 C++ 调试环境

如何在 Visual Studio 2013 Express 中打开 C++ 项目?遇到很多错误

如何将项目从 Visual C++ 6.0 转换为 Visual Studio Express 2010?

如何将 WTL 和 ATL 添加到 Visual Studio C++ Express 2008

C++ Express 版缺少哪些 Visual Studio 2008 生产力功能?