我当时使用Code :: Blocks制作游戏,并遇到了Segmentation Fault错误。我在这里浏览了其他问题,找不到任何帮助。我有一个Sprite
类,它表示游戏中的基本对象,还有一个Window
类,用于控制游戏屏幕的显示。我运行了调试器,它在下面的return image;
方法的getImage()
行中给了我错误。
SDL_Surface* Sprite::getImage() {
return image;
}
我在
setImage()
的构造函数中调用以下Sprite
方法,并且验证了SDL_ConvertSurface
没有返回NULL
。void Sprite::setImage(string path) {
SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
if( loadedSurface == NULL ) {
printf( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError() );
} else {
image = SDL_ConvertSurface( loadedSurface, surface->format, NULL );
if( image == NULL ) {
printf( "Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
}
SDL_FreeSurface( loadedSurface );
}
}
我在
getImage()
的mainloop()
中调用方法Window
,如下所示,其中sprites
声明为Sprite* sprites[10];
:void Window::mainloop() {
bool quit = false;
SDL_Event e;
while( !quit ) {
while( SDL_PollEvent( &e ) != 0 ) {
if( e.type == SDL_QUIT ) {
quit = true;
}
}
SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, red, green, blue ) );
for (int i = 0; i < spritesNum; i++) {
SDL_BlitScaled( sprites[spritesNum]->getImage() , NULL, screenSurface, sprites[spritesNum]->getRect() );
}
SDL_UpdateWindowSurface( window );
}
}
最佳答案
您可能在这里索引超出范围
for (int i = 0; i < spritesNum; i++) {
SDL_BlitScaled( sprites[spritesNum]->getImage() , NULL, screenSurface, sprites[spritesNum]->getRect() );
}
我假设您想使用计数器
i
?for (int i = 0; i < spritesNum; i++) {
SDL_BlitScaled( sprites[i]->getImage() , NULL, screenSurface, sprites[i]->getRect() );
}
否则,如果数组
sprites
的长度为spritesNum
,则索引超出范围,并且执行spritesNum
次。无论如何,您至少应该确认您没有在这里取消引用空指针
sprites[i]->getImage()