个人十分推荐SDL Game Development 这本书,它并不是死抠SDL的api,而是一步步带着我们如何对一个游戏进行构架。
虽然我没用过游戏引擎,也基本不会写游戏,但是我认为这本书本身就是在带着我们完成一个自己的游戏引擎。
此书附带的源码中有一个common-framework文件夹,里边是一个游戏开发的基本框架,书中的代码也是按那个套路来写的。
今天在调试弹幕的时候发现一处bug跟其中InputHandler类有关
InputHandler::~InputHandler() { // delete anything we created dynamically delete m_keystates; /***此行报错****/ delete m_mousePosition; // clear our arrays m_joystickValues.clear(); m_joysticks.clear(); m_buttonStates.clear(); m_mouseButtonStates.clear(); }
在此类析构,delete指针时程序崩掉。而这个 m_keystates 指针的由来如下:
void InputHandler::onKeyDown() { m_keystates = SDL_GetKeyboardState(); } void InputHandler::onKeyUp() { m_keystates = SDL_GetKeyboardState(); }
此指针为SDL api函数的返回值,然后查阅了SDL的源码,其实现如下:
const Uint8 * SDL_GetKeyboardState(int *numkeys) { SDL_Keyboard *keyboard = &SDL_keyboard; ) { *numkeys = SDL_NUM_SCANCODES; } return keyboard->keystate; }
其返回指针为SDL_Keyboard结构体里的一个成员,找到其声明如下:
struct SDL_Keyboard { /* Data common to all keyboards */ SDL_Window *focus; Uint16 modstate; Uint8 keystate[SDL_NUM_SCANCODES]; SDL_Keycode keymap[SDL_NUM_SCANCODES]; };
返回的keystate这个成员其实是一个静态数组的头指针。
综上:
InputHandler::~InputHandler() { // delete anything we created dynamically delete m_keystates; /**此指针不能删除**/ delete m_mousePosition; // clear our arrays m_joystickValues.clear(); m_joysticks.clear(); m_buttonStates.clear(); m_mouseButtonStates.clear(); }