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()
和OGLRenderingWindow
的HWND
?
【参考方案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?